#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