Могу ли я установить точку останова в ntdll.dll! _LdrpInitializeProcess? - PullRequest
3 голосов
/ 16 июня 2011

При отладке процесса Windows иногда было бы удобно прервать работу как можно раньше.

Начальный Callstack выглядит следующим образом: (вы получаете это, например, когда вы устанавливаете точку останова в DllMain функции на DLL_PROCESS_ATTACH)

    ...
    ntdll.dll!_LdrpCallInitRoutine@16()  + 0x14 bytes   
    ntdll.dll!_LdrpRunInitializeRoutines@4()  + 0x205 bytes 
>   ntdll.dll!_LdrpInitializeProcess@20()  - 0x96d bytes    
    ntdll.dll!__LdrpInitialize@12()  + 0x6269 bytes 
    ntdll.dll!_KiUserApcDispatcher@20()  + 0x7 bytes    

, поэтому установка точки останова в одной из этих подпрограмм ntdll должна действительно очень рано прервать процесс.

Однако я не могу понять, как установить точку останова до запуска процесса в отладчике . Возможно ли это в Visual Studio (2005)? Как? Это можно сделать в WinDbg?

Ответы [ 2 ]

6 голосов
/ 16 июня 2011

Я бы использовал что-то вроде GFlags для запуска отладчика при запуске процесса.

Вот пример настроек gflags для test.exe

enter image description here

А вот и вывод отладчика.Обратите внимание на стек вызовов с ntdll!LdrpInitializeProcess

CommandLine: "C: \ temp \ test.exe" Путь поиска символа: srv *; srv c: \ symbols http://msdl.microsoft.com/download/symbols Путь поиска исполняемого файла: ModLoad: 00000000 00d20000 00000000 00d28000
image00000000 00d20000 (1b40.464): Break instruction exception - code 80000003 (first chance) ntdll!LdrpDoDebuggerBreak+0x30: 00000000 77c7cb60 cc int 3 0: 000> k Child-SP RetAddr
Call Site 00000000 0012ed70 00000000 77c32ef5 ntdll! LdrpDoDebugger+ 0x30 00000000 0012edb0 00000000 77c11a17 ntdll! LdrpInitializeProcess + 0x1b4f 00000000 0012f2a0 00000000 77bfc32e ntdll!??:: FNODOBFM :: string'+0x29220 00000000 0012f310 00000000`00000000 ntdll! LdrInitializeThunk + 0xe

Или вы можете открыть процесс в отладчике, например, Windbg, который по умолчанию разбивается на ntdll!LdrpInitializeProcess.

НТН

1 голос
/ 17 июня 2011

Я узнал, как это сделать в Visual Studio.

Проблема здесь в том, что установка точки останова в любой функции сборки будет запомнена как «Точка останова данных».Эти точки останова отключаются, как только процесс останавливается, поэтому даже если я установлю единицу в этой функции (я могу сделать это, потому что у меня есть функция в стеке, если я установил точку останова в любой функции DllMain), эта точка останова будет отключена длязапуск нового процесса.

Однако для ntdll.dll (и kernel32.dll) адреса загрузки в значительной степени фиксированы и не изменятся (и, по крайней мере, до перезагрузки).

Итак, перед тем, как начать процесс, мне просто нужно снова включить точку останова данных для адреса, который соответствует этой функции NtDll, и отладчик остановится на этом.

...