Пакетний файл для вилучення 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.