Какие значения в процессоре Intel x86 перед запуском (в Windows)? - PullRequest
0 голосов
/ 18 января 2010

Я отлаживал некоторые файлы .exe и заметил, что перед тем, как начать пошаговую отладку, в самом начале программы уже есть какие-то значения, загруженные в стек? Что это?

Я использую OllyDbg, и некоторые из «меток» для этих значений:

  • возврат к ядру 32.7C8 ...
  • ntdll.7C9 ...
  • Конец цепи SEH
  • SE обработчик

Спасибо.

Ответы [ 3 ]

4 голосов
/ 18 января 2010

Ядро предоставляет особую обработку "системной DLL", a.k.a. ntdll. Эта DLL отображается в каждом процессе, несмотря ни на что. Когда система запускается, ядро ​​ищет адрес RtlUserThreadStart в ntdll, и это служит низкоуровневой точкой входа в пользовательский режим нового потока. Затем эта функция инициализирует подсистему «Win32». Адрес основной функции вашей программы хранится в исполняемом заголовке, который вызывается и вызывается. Обратите внимание, что у вас может быть код времени выполнения C в качестве точки входа.

Если есть среда выполнения C или C ++, вы получите стандартную функцию 'CRTStartup', которая в конечном итоге дойдет до вызова main.

1 голос
/ 23 февраля 2011

Как сказано в других комментариях, во время вызова точки входа в приложение много кода уже выполнено в процессе.Загрузчик разрешил импорт и выполнил другие задачи обслуживания, чтобы настроить процесс таким образом, чтобы точка входа могла работать.

В момент вызова точки входа в стек будут добавлены адреса возврата к коду в системных библиотеках, которыев конечном итоге вызов точки входа (это "возврат к .." материал).

Цепочка обработчика SEH также инициализируется в стеке.Он настроен как связанный список структур, которые выглядят следующим образом:

_EXCEPTION_REGISTRATION struc

 prev    dd      ?
 handler dd      ?

_EXCEPTION_REGISTRATION заканчивается

Здесь prev - указатель на предыдущую записьи обработчик - указатель на функцию обработчика исключений.Как уже говорилось, стек содержит подобные записи, которые образуют связанный список, а последняя запись имеет значение 0xFFFFFFFF в указателе prev.Это настраивается перед точкой входа, и это запись, которую вы видите в OllyDbg.

1 голос
/ 19 января 2010

Не уверен насчет OllyDebug, но если вы используете средства отладки Windows (windbg или ntsd), вы можете использовать общедоступный Microsoft Symbol Server , и вы сможете получить символы для весь стек пользовательских режимов.

SEH означает Структурная обработка исключений , поэтому внизу у вас есть конец цепочки SEH и глобальный обработчик для структурированных исключений. Я не совсем знаком с тем, как это работает, поскольку (даже когда я работал в MSFT) я никогда не использовал структурированные исключения. Однако, если вы подумаете об этом, имеет смысл, что эти вещи будут в конце стека.

Для дополнительного удовольствия используйте Kernel Debugger (kd в пакете, указанном выше), и вы также можете увидеть стек Kernal-mode. Хорошие времена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...