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

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

15 голосов
/ 26 апреля 2011

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

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

Я нашел различные документы для исполняемых файлов Windows Portable:

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.

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

Спасибо.

Ответы [ 2 ]

16 голосов
/ 27 апреля 2011

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

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

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

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

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

Мой упаковщик ( PECompact ) имеет бета-поддержку для 'overlay / extra-эмуляция данных 'BTW - это означает, что он может на самом деле сжать эти данные в конце вместе с EXE, а затем эмулировать их несжатый вид в памяти, когда вы делаете ввод / вывод в EXE-файл.В качестве альтернативы, он может оставить дополнительные данные / оверлей на внешней стороне файла и сжать остальные, но настроить чтение и запись так, чтобы физическое смещение не изменилось.Это необходимо, потому что установщики SO MANY и SFX-архивы фактически ссылаются на добавленные данные посредством статического смещения, вместо того, чтобы правильно вычислять их местоположение во время выполнения путем обхода PE-заголовка.

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

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

11 голосов
/ 26 апреля 2011

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

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

...