Как работает call и ret для любого файла dll или exe
На самом деле это зависит от того, является ли это DLL или EXE-файлом.
Когда загрузчик модулей Windows завершает загрузку DLL, он вызывает начальный адрес (известный как «DllMain») библиотеки DLL с параметром DLL_PROCESS_ATTACH
(см. документацию по DllMain ). Если DllMain возвращает 1, загрузчик продолжает работу.
Однако, когда вы запускаете EXE, система порождает новый процесс и отображает ntdll.dll в адресное пространство этого процесса, а затем порождает основной поток, работающий с начального адреса NTDLL. Затем этот поток выполняет дополнительную инициализацию, загружает файл EXE (плюс все библиотеки DLL, указанные в его таблице импорта) и вызывает функцию, идентифицированную по начальному адресу EXE-файла. Когда эта функция возвращается, NTDLL затем вызывает NtTerminateProcess
, который убивает все запущенные потоки и закрывает процесс.
Этот процесс запуска EXE может быть трудно наблюдать с помощью отладчика в пользовательском режиме; некоторые отладчики пытаются сломаться на этих ранних стадиях инициализации процесса.