Можно ли изменить исполняемый файл во время выполнения? - PullRequest
0 голосов
/ 09 декабря 2011

Можно ли изменить исполняемый файл во время выполнения (я спрашиваю о Windows XP / Vista / 7 / Server)? Я только что оценил Приложение SmartUtils Portable Storage . Он может создавать так называемые «управляемые исполняемые файлы хранения», которые изменяют их сами во время выполнения ... Такой файл хранения похож на стандартный самораспаковывающийся архив (данные добавляются в исполняемый модуль), но главное отличие в том, что вы можете просматривать и изменять его содержимое без основной программы. Как это возможно? Мне нужна аналогичная функциональность в моем проекте (C ++): я хочу иметь возможность создавать исполняемый файл, который может изменять данные, прикрепленные к нему.

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

Если все, что вы действительно спрашиваете, это то, как SmartUtils Portable Storage делает свое волшебство, тогда я бы предположил, что это самоисполняющийся zip-архив. EXE-файл архива (так же, как создаются WinZip или 7-Zip) автоматически извлекает и выполняет exe-приложение вашего приложения из временной папки, а также предоставляет вам API, который сводится к способам извлечения, манипулирования и изменения этого исходного исполняющий архив.

Таким образом, Windows никогда не пытается изменить работающий .exe. Скорее всего, ваш .exe (временный файл извлекается и запускается) - это то, что выполняется (и связанные с ним библиотеки), которое манипулирует исходным файлом .exe (на самом деле самозапускающийся архив - возможно, .zip).

В следующий раз, когда пользователь «запустит» измененный «exe», снова ваш .exe извлекается и запускается, и он снова может манипулировать самораспаковывающимся .exe.

Надеюсь, это имеет смысл для вас.

И это только лучшая догадка!

1 голос
/ 09 декабря 2011

Да - обычная техника - добавлять файлы данных в конце исполняемого файла.

Типичная схема - записать целое число 0x00000000 в конец исполняемого файла, а затем добавить каждый файл с указанием его размера в байтах.

Затем, когда исполняемый файл должен прочитать данные, он проверяет последние 4 байта в своем собственном файле, использует их в качестве длины файла и копирует это количество байтов из своего собственного файла, затем проверяет следующие 4 байта как другую длину и копирует это как файл, пока не получит длину 0000. Если вам также нужно кодировать имена файлов - это добавляет немного сложности, но это в основном та же идея.

0 голосов
/ 09 декабря 2011

Поскольку это помечено как Windows, вы можете также рассмотреть «Альтернативные потоки данных».Это позволяет вам рассматривать один файл почти как каталог.Вы можете добавить поток с именем Program.EXE:ExtraData в вашу программу и записать в него обычные файловые функции.

Опять же, ваш исполняемый файл, скорее всего, будет в Program Files\, что не доступно для записи для обычного (не повышенные) пользователи.

0 голосов
/ 09 декабря 2011

Вы можете добавить указатель TOC в EXE (и, возможно, файл cookie с магическим идентификатором), чтобы убедиться, что это указатель TOC, а затем использовать его для резервного копирования в начало каждой добавленной записи.

Пока вы не испортили заголовок и основное содержимое файла, он все равно должен быть загружен ОС.

Однако вы жертвуете любой подписью вашего EXE-файла - и у вас, вероятно, возникают различные проблемы с разрешениями.чтобы бороться с ...

Я написал инструменты для своей среды разработки, которая открывает EXE-файл Windows, экстраполирует ресурсы в нем, модифицирует различные и переупаковывает все это.Мы используем это, чтобы пометить бета-версию как релиз (таким образом, она изменяет записи версий).

Вы можете делать все, что угодно, с файлом EXE, если вы знаете его структуру и правильно перестраиваете.

...