Ответ 1
Вот ссылка на фрагмент кода, который я использовал для добавления данных в exe. Это специально для добавления данных, не нарушая подписание exe, но принцип должен содержать только для добавления к неподписанным исполняемым файлам.
Этот вопрос расширяет один из ответов на мой предыдущий вопрос: как сохранить регистрацию пользователя в exe... (С#).
Сама идея для меня все еще очень новая, но она кажется правдоподобной. Моя первая попытка простого добавления строки в exe из другого приложения не работала. Затем получил немного умнее и попытался добавить байты. Еще не повезло.
Я нашел различные документы в файлах исполняемых файлов Windows:
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
Что было бы наиболее полезным, это всего лишь пример или ссылка о том, как добавить и извлечь короткую часть информации в исполняемый файл. Я хочу, чтобы эта операция выполнялась в приложении С# Forms с сервера linux, запущенного как php script. Я полагаю, что автономное приложение на С++, которое принимает информацию, поскольку аргументы должны иметь возможность сделать трюк.
Я также открыт для других идей.
Спасибо.
Вот ссылка на фрагмент кода, который я использовал для добавления данных в exe. Это специально для добавления данных, не нарушая подписание exe, но принцип должен содержать только для добавления к неподписанным исполняемым файлам.
Да, вы добавляете данные вне/после окончания определенного образа PE. Вы можете сделать простую конкатенацию, если не хотите иметь дело с заголовком PE.
Например, "echo abcd → myprogram.exe" будет работать, в результате чего "abcd" будет добавлен в конец "myprogram.exe". Myprogram.exe будет работать нормально. Тогда вам просто нужно указать способ поиска ваших добавленных данных (например, заголовок траверса, чтобы найти конец определенного изображения, найдя конец последнего раздела или сохранить статическое смещение где-нибудь в EXE, которое вы можете позже прочитать). Например, вы можете сохранить смещение, в котором вы сохранили данные, в последних 4 байтах файла. Тогда вы всегда знаете, что статическое смещение находится на EOF-4.
В качестве альтернативы, если вы хотите, чтобы ваши приложенные данные загружались в виртуальную память при загрузке процесса, вы могли бы фактически расширить последний раздел изображения PE и поместить туда свои данные.
Следите за выравниванием файлов в последнем разделе, вы хотите перейти к следующему выравниванию файла (обычно 0x200 или 0x1000), затем добавьте свои материалы.
Как автор исполняемого компрессора, который видел некоторые странные PE, позвольте мне сказать, что нет стойкого правила, что последний раздел, определенный в таблице разделов, является последним в изображении (они могут быть не в порядке). То есть, они могут быть не в порядке. Тем не менее, они находятся в порядке 99% времени, если они сделаны каким-то странным компоновщиком или не модифицированы с помощью некоторой внешней утилиты.
Мой пакер (PECompact) имеет бета-поддержку для эмуляции оверлей/дополнительных данных BTW - это означает, что он может реально сжать это данные удаляются в конце вместе с EXE, а затем эмулируют его несжатую форму в памяти, когда вы делаете I/O в EXE файле. В качестве альтернативы, он может оставить дополнительные данные/оверлей на внешней стороне файла и сжать остальные, но отрегулировать чтение и запись, чтобы физическое смещение не изменилось. Это необходимо, потому что SO MANY installers и SFX-архивы фактически ссылаются на добавленные данные статическим смещением, вместо того, чтобы правильно вычислять свое местоположение во время выполнения путем прохождения заголовка PE.
Ссылка David Hall делает немного больше, чем вам нужно, если вы не хотите сохранить подпись. Этот метод позволяет сохранять/использовать цифровую подпись, вставляя ваши данные в расширенную область сертификата в конце файла.
Вам вообще не нужно иметь дело с заголовком, если вы этого не хотите, и не заботитесь о сохранении подписи кода!