Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Ну фрейм вызвавшей процедуры убит не будет 20.04.05 12:59 Число просмотров: 2058
Автор: amirul <Serge> Статус: The Elderman
|
> Ну хорошо, я поставлю бряк на вывод месаги "это не родной > кернел", но, по скольку это фатальная ошибка, вызов > подпрограммы печати наверняка убивает стек. Тогда, как > отловить, откуда вызвали?
Если ntldr скомпилирован с FPO (на счастье это у микрософта - очень редко), то только долгой и нудной трассировкой. Если же нет, то пробежаться по фреймам (базовый адрес текущего фрейма - в ebp)
Фрейм создается командами
push ebp
mov ebp, esp
sub esp, FRAME_SIZE
---
и удаляется
mov esp, ebp
pop ebp
---
Таким образом, если даже нет команды прохода по стеку можно сделать это вручную:
[ebp + 4] - адрес возврата
[ebp] - базовый адрес следующего фрейма
[ebp - N] - локальные переменные (N >= 0)
[ebp + 8 + N] - аргументы, переданные в функцию (N >= 0)
Все команды прохода по стеку ориентируются именно на такую структуру стека. Если же включен FPO (ebp это как раз и есть тот frame pointer, который omission), то все локальные переменные и аргументы адресуются относительно текущего esp (в любой момент времени компилятор знает его смещение относительно фрейма) и никакой информации о размере фрейма (базовом адресе предыдущего фрейма) не хранится и узнать его можно только трассировкой до выхода из функции.
> Искать чтение файла Ntoskrnl? Но для этого нужно раскрутить > весь "РЕ-шный" Нтлоадер. Поставить бряку на чтение строчки > Ntoskrnl.ехе?
А вообще, я еще не пробовал, но если вырезать PE-шную часть ntldr-а и к ней действительно есть символы, то натравив на это дело IDA можно даже не ковыряться в отладчике - по дизассембингу все будет понятно
|
|
|