Пакетний файл для вилучення exe з себе, використовуючи більше, не працює


1

Я експериментував із створенням програми встановлення пакетного файлу. вставивши файл у пакетний файл та використовуючи more +...рядок для його вилучення.

Ось мій код:

@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...

Проблема:

Я намагаюся витягти графічний інтерфейс, але після його вилучення, коли я намагаюся запустити його, Windows розглядає його як 16-бітну програму ... Чому це відбувається? І як я можу це виправити?


Скріншоти


скріншот


2
Це не exe, який працює в 16-бітному режимі, але пакетний файл (а точніше інтерпретатор, що його виконує; vdm). Що стосується вашої загальної ідеї, ви, ймовірно, не зможете ефективно кодувати бінарне як ascii, а потім просто запишіть його знову як бінарні дані. Помилка, яку ви бачите, пов’язана з самим процесором, який говорить вам, що він не розуміє машинного коду, який йому подається (недійсна інструкція процесора), тому зрозуміло, що витягнутий файл уже не є дійсним виконуваним файлом.
Френк Томас

@FrankThomas Чи можна щось спробувати замість цього?
стилі

2
ви просто не можете зберігати двійковий файл всередині текстового документа без глибокого та широкого знання кодування даних та якогось досить складного коду. вибачте, але ви, мабуть, хочете прийняти інший такт.
Френк Томас

Відповіді:


1

Як зазначено в коментарях, начинка виконуваної програми всередині текстового файлу буде розбивати двійковий файл. Натомість ви можете зберігати закодовану версію, а потім її розшифрувати. Щоб досягти цього легко, ви можете використовувати PowerShell. Почніть з цього пакетного файлу:

@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

Додайте додатковий порожній рядок наприкінці.

Цікава частина - виклик PowerShell. Ця команда читає вміст пакетного файлу, займає останній рядок, декодує його з Base64 і записує ці байти у файл, який називається extracted.exe. Потім пакетний файл просто запускає цей EXE, і після цього він очищається, видаляючи тимчасовий виконуваний файл.

Щоб останній рядок мав необхідну інформацію, запустіть PowerShell cdв каталог із пакетним файлом, а потім запустіть це (із фактичними іменами файлів та шляхами, що введені):

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

Після цього ваш пакетний файл зможе витягти цю програму та запустити її.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.