Контекст начального выполнения Windows

#windows #x86 #loader #assembly #portable-executable

#Windows #x86 #загрузчик #сборка #переносимый-исполняемый

Вопрос:

После того, как Windows загрузила исполняемый файл в память и перенесла выполнение в точку входа, имеют ли значение значения в регистрах и стеке? Если да, то где я могу найти больше информации об этом?

Ответ №1:

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

  • EAX указывает на точку входа приложения (поскольку функция ядра использует call eax для перехода к ней)

  • EBX указывает на блок Process Environment (PEB).

Комментарии:

1. Хорошая информация, но знаете ли вы что-нибудь о x64?

2. @ST3 Нет, но вы, вероятно, можете проверить в отладчике.

3. Хорошо, но один вопрос, вы уверены, что EAX указывает на EP ? Я видел CALL EDX на своей машине.

4. Хорошо, я предполагаю, что в какой-то момент это изменилось. Если вы можете выяснить, когда, не стесняйтесь редактировать ответ.

Ответ №2:

Глава 5 пятого издания Windows Internals подробно описывает механизм создания процесса Windows. Это дало бы вам больше информации о загрузке Windows исполняемого файла в память и передаче выполнения в точку входа.

Я нашел эту актуальную ссылку, которая описывает, как регистры используются в различных соглашениях о вызовах в различных операционных системах и различными компиляторами. Это довольно подробно и кажется всеобъемлющим: Документ Agner’s Calling Conventions от Agner Fog

Комментарии:

1. Ссылка разорвана. Я думаю, что это оно: agner.org/optimize/calling_conventions.pdf