Arquivo em lote para extrair o exe de si mesmo usando mais, não funcionando

1

Eu tenho experimentado com a criação de um programa instalador de arquivos em lote. incorporando o arquivo no arquivo em lotes e usando uma more +...linha para extraí-lo.

Aqui está o meu código:

@echo off
set self=%~df0
>%userprofile%\desktop\file.exe more +8 "%self%"
echo done!
pause
exit
REM beginning of exe file...

c  
sd  
€  ~  * 0      ~  *  €  *’s6  (e  
t
  €  s.  
(/  
€  *   (f  
*^(  og  
,
(9  oh  
*0 K     ~  ->~  (i  
(j  
~  -(  þ7  sk  
ol  
€  Þ(m  
Ü~  * 


etc...

O problema:

Eu estou tentando extrair um exe GUI, no entanto, uma vez que é extraído, quando tento executá-lo, o Windows trata como se fosse um programa de 16 bits ... Por que isso acontece? E como posso consertar isso?


Screenshots


screenshot

estilo cascata
fonte
2
Não é o exe que está sendo executado no modo de 16 bits, mas o arquivo de lote (ou mais precisamente o interpretador que o executa; o vdm). Quanto à sua idéia geral, você provavelmente não conseguirá codificar o binário de forma eficaz como ascii e, em seguida, apenas gravá-lo novamente como dados binários. O erro que você está vendo é da própria CPU, dizendo que ela não entende o código da máquina sendo submetido a ela (uma instrução de CPU inválida), então fica claro que o arquivo extraído não é mais um executável válido.
Frank Thomas
@FrankThomas Existe alguma coisa que eu poderia tentar em vez disso?
cascata
2
você simplesmente não pode armazenar um arquivo binário dentro de um documento de texto sem algum conhecimento profundo e extenso de codificação de dados e algum código bastante sofisticado. desculpe, mas você provavelmente quer tomar um tato diferente.
Frank Thomas

Respostas:

1

Como apontado nos comentários, o preenchimento de um programa executável dentro de um arquivo de texto irá abocanhar o arquivo binário. Em vez disso, você pode armazenar uma versão codificada e decodificá-la. Para conseguir isso facilmente, você pode usar o PowerShell. Comece com este arquivo em lotes:

@echo off
powershell -command "[IO.File]::WriteAllBytes('extracted.exe', [Convert]::FromBase64String((gc '%0')[-1]))"
extracted
del extracted.exe
exit

REM Base64-encoded program will be inserted below

Adicione uma linha extra em branco no final.

A parte interessante é a invocação do PowerShell. Esse comando lê o conteúdo do arquivo de lote, pega a última linha, decodifica-a de Base64 e grava esses bytes em um arquivo chamado extracted.exe. Em seguida, o arquivo em lotes apenas executa esse EXE e, depois de feito isso, limpa excluindo o executável temporário.

Para fazer com que a última linha tenha as informações necessárias, abra o PowerShell, cdno diretório com o arquivo de lote e execute-o (com os nomes e caminhos de arquivos reais colocados):

[Convert]::ToBase64String([IO.File]::ReadAllBytes('C:\fullPathTo\file.exe')) | Out-File 'batchFile.bat' -Append -Encoding ASCII

Uma vez feito isso, seu arquivo de lote poderá extrair o programa e executá-lo.

Ben N
fonte