Здравствуйте,
Проблема примерно такова: надо к уже существующему exe-шнику прикрутить некоторый "хидер", т.е. требуется чтоб выполнился мой код, записывающий ряд логов в систему и отсылающий соответсвующие письма, а затем основное приложение, при этом exe файл должен оставаться в единственном экземпляре.
В идеале хотелось бы создать тулзу:
sometool.exe <input.exe> <input.cfg> <output.exe>
где в output.exe складывалось бы приложение которое выполняет действия отраженные в конфиге, а затем передает управление input.exe
С какой стороны подойти к этой проблеме? Что почитать?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте,
А>Проблема примерно такова: надо к уже существующему exe-шнику прикрутить некоторый "хидер", т.е. требуется чтоб выполнился мой код, записывающий ряд логов в систему и отсылающий соответсвующие письма, а затем основное приложение, при этом exe файл должен оставаться в единственном экземпляре.
А>В идеале хотелось бы создать тулзу:
А>А>sometool.exe <input.exe> <input.cfg> <output.exe>
А>где в output.exe складывалось бы приложение которое выполняет действия отраженные в конфиге, а затем передает управление input.exe
А>С какой стороны подойти к этой проблеме? Что почитать?
Несложно написать такой stub.exe, что он будет понимать, что к его концу приписаны input.cfg и input.exe, отделять их во временную директорию, анализировать input.cfg, запускать input.exe, дожидаться, пока он закончится и прибирать за собой. В таком случае в качестве sometool.exe может выступать обычная команда copy:
copy stub.exe /B + input.cfg /B + input.exe /B output.exe
В качестве примера обнаружения и отделения "багажа" можно посмотреть
http://www.alexfedotov.com/articles/launch.asp (в частности, функции GetSizeOfImage и SplitBaggage).
Здравствуйте, Аноним, Вы писали:
А>В идеале хотелось бы создать тулзу:
А>А>sometool.exe <input.exe> <input.cfg> <output.exe>
А>где в output.exe складывалось бы приложение которое выполняет действия отраженные в конфиге, а затем передает управление input.exe
Так работает большинство инталлеров — сценарий + сам пакет записываются в заглушку — exe-шник ( как я подозреваю ресурсами ) и затем при запуске уже начиненной заглушки, она читает сценарий и данные из ресурсов. В твоем случае — еще проще — эти ресурсы нужно только сохранить в файлы и выполнить последний
Если бы я делал я бы сделал три бинарных ресурса — имена файлов ( через "\r\n" ), файл конфига, файл для запуска... А потом бы извлекал 2-й и 3-й ресурсы во временную директорию по именам, записанным в 1-й
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте,
А>Проблема примерно такова: надо к уже существующему exe-шнику прикрутить некоторый "хидер", т.е. требуется чтоб выполнился мой код, записывающий ряд логов в систему и отсылающий соответсвующие письма, а затем основное приложение, при этом exe файл должен оставаться в единственном экземпляре.
А>В идеале хотелось бы создать тулзу:
А>А>sometool.exe <input.exe> <input.cfg> <output.exe>
А>где в output.exe складывалось бы приложение которое выполняет действия отраженные в конфиге, а затем передает управление input.exe
А>С какой стороны подойти к этой проблеме? Что почитать?
Это классический вариант работы вирусов для PE файлов
Благо сейчас в инете полно информации по такого образа внедрению дополнительному коду.
А здесь кидать ссылки на подобные статейки как-то не хочется.
>>С какой стороны подойти к этой проблеме? Что почитать?
>Со стороны структуры exe-файла и низкоуровневого программирования... в идеале — дописываешь в конец файла свой код, из main или WinMain прыгаешь на него, а после того, как он все сделает — прыгаешь обратно... но это в иеале...
>почитай чего-н про структуру экзешника...
например
спецификацию.
только там он сейчас pecoff.doc, а у меня лежит pecoff.pdf
(скачал его с microsoft-а несколько лет назад.
возможно разные редакции. возможно в них есть разлиия)
но до спецификации, хочу порекомендовать, посмотреть статьи
на wasm:
"Roustem — Приложение Windows «голыми руками»" и "Roustem — Dll в машинных кодах"
рядом они есть и в оригинале(на ангельском)
если exe-шник один, определенный, я бы не мудрствуя лукаво, ручками, добавил еще одну секцию
(или, если есть место, в той секции куда указывает точка входа, дописал в ней)
с тем что хочу сделать и jmp-ом на "старую" точку входа, и конечно же изменил точку входа.
но.
если писать программу требуется предусмотреть случай когда "не лезэ", и прийдется двигать секции ("сползло")
например, нет места в секции кода, или уже нет места для добавления новой записи в таблицу объектов (уже начинается первая секция)
но эти трудности уже так не значительны, в сравнении с тем "как это вообще можно сделать". просто возиться больше прийдется.