добавление данных в exe

этот вопрос расширяется от одного из ответов на мой предыдущий вопрос:Как сохранить регистрацию пользователя в exe... (C#).

сама идея все еще очень новая для меня, но она кажется правдоподобной. Моя первая попытка просто добавить строку в exe из другого приложения не сработала. Затем немного поумнел и попробовал добавить байты. Все равно не повезло.

Я нашел различные документы на Windows Portable Executable файлы:

http://en.wikipedia.org/wiki/Portable_Executable

http://msdn.microsoft.com/en-us/magazine/bb985997.aspx

http://msdn.microsoft.com/en-us/windows/hardware/gg463125

честно говоря, я так мало понимаю, что они мне не очень полезны. Больше пользы я смог найти учебник delphi, который описывает идею добавления "полезной нагрузки" в исполняемый файл. Он продолжает говорить, что сделайте это, вам нужно, чтобы exe знать, а также иметь возможность отслеживать, где вы положили его... или что-то в этом роде. Я ничего не знаю о delphi, кроме того, что я могу догадаться из самого кода. http://www.delphidabbler.com/articles?article=7&part=2

Что было бы наиболее полезным, это просто пример или ссылка на то, как добавить и получить короткую информацию в исполняемый файл. Я хочу, чтобы эта операция была выполнена в приложении C# Forms с сервера linux выполняется как PHP-скрипт.. Я полагаю, что автономное приложение c++, которое принимает информацию в качестве аргументов, должно быть в состоянии сделать трюк.

Я тоже открыт для других идей.

спасибо.

2 ответов


вот ссылка на фрагмент кода, который я использовал для добавления данных в exe. Это специально для добавления данных без нарушения подписи exe, но принцип должен выполняться только для добавления неподписанных исполняемых файлов.

http://blog.barthe.ph/2009/02/22/change-signed-executable/


Да, вы добавляете данные снаружи / после окончания определенного PE-изображения. Вы можете сделать простую конкатенацию, если вы не хотите иметь дело с заголовком PE.

например " echo abcd >> myprogram.exe "будет работать, в результате чего "abcd" будет добавлен в конец " myprogram.exe. Иногда.ехе будет работать нормально. Тогда вам просто нужно будет закодировать способ поиска добавленных данных (например, заголовок траверса, чтобы найти конец определенного изображения, найдя конец последнего раздела, или сохранить статическое смещение где-то в EXE вы можете прочитать позже). Например, можно хранить смещение сохранены данные за последние 4 байта файла. Тогда вы всегда знаете, что статическое смещение находится в EOF-4.

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

следите за выравниванием файлов в последнем разделе, вы захотите развернуть следующий файл выравнивание (обычно 0x200 или 0x1000), затем добавьте свои вещи.

Как автор исполняемого компрессора, который видел некоторые странные PEs, позвольте мне сказать, что нет твердого правила, что последний раздел, определенный в таблице разделов, является последним в изображении (они могут быть не в порядке). То есть, они могут быть не в порядке. Тем не менее, они находятся в порядке 99% времени, если они не сделаны каким-то странным компоновщиком или Не изменены какой-то внешней утилитой.

мой Пакер (PECompact) имеет бета-поддержку "наложения/эмуляции дополнительных данных" BTW-это означает, что он может фактически сжимать эти данные на конце вместе с EXE, а затем эмулировать его несжатую форму в памяти, когда вы делаете ввод-вывод в EXE-файле. Кроме того, он может оставить дополнительные данные/наложение снаружи файла и сжать остальные, но настроить чтение и запись, чтобы физическое смещение не изменилось. Это необходимо, потому что так много инсталляторов и архивов SFX на самом деле ссылка на добавленные данные статическим смещением вместо правильного вычисления его местоположения во время выполнения путем обхода заголовка PE.

ссылка Дэвида Холла делает немного больше, чем вам нужно, если вы не хотите сохранить подпись. Этот метод позволяет сохранять / использовать цифровую подпись, вставляя данные в расширенную область сертификата в конце файла.

вам не нужно иметь дело с заголовком вообще, если вы не хотите, и не заботитесь о сохранение подписи кода!