2011-06-16 102 views
2

在调试Windows进程时,尽可能早地中断有时会很方便。我可以在ntdll.dll!_LdrpInitializeProcess中设置断点吗?

Inital调用栈看起来是这样的:(当你在一个DllMain功能上DLL_PROCESS_ATTACH设置一个断点,你得到这个EG)

... 
    [email protected]() + 0x14 bytes 
    [email protected]() + 0x205 bytes 
> [email protected]() - 0x96d bytes  
    [email protected]() + 0x6269 bytes 
    [email protected]() + 0x7 bytes  

所以设置一个断点在这些NTDLL例程应该真正打破的过程中非常早。

但是,我不知道如何在启动调试器中的过程之前设置断点。在Visual Studio(2005)中可能吗?怎么样?它可以在WinDbg中完成吗?

回答

1

我已经发现如何在Visual Studio中完成它。

这里的问题是,在任何汇编函数中设置断点将被记住为“数据断点”。这些断点在进程停止时会被禁用,所以即使我在这个函数中设置了一个断点(我可以这样做,因为如果我在任何DllMain函数中设置断点,我在堆栈上有函数),这个断点将被禁用新的流程运行。

但是对于ntdll.dll(和kernel32.dll),加载地址几乎是固定的,不会改变(至少在重新启动之前)。

因此,在启动进程之前,我只需重新启用与此NtDll函数对应的地址的数据断点,然后调试器就会在那里停止。

+0

当你重新启动时,它们甚至不会改变。他们为什么?当您安装修改DLL的系统更新时,它们可能会发生更改,但每次都会在这些DLL的首选基址中加载这些DLL。 – 2011-06-17 20:32:52

+0

@David:[ASLR]怎么样(http://en.wikipedia.org/wiki/Address_space_layout_randomization)? – 2011-06-18 11:57:35

+0

你在你的应用程序中启用ASLR吗? – 2011-06-18 12:12:36

5

我会使用类似GFlags的东西在启动过程时启动调试器。

下面是一个简单GFLAGS设置test.exe的

enter image description here

这里是调试器输出。注意调用堆栈与ntdll!LdrpInitializeProcess

的CommandLine: “C:\ TEMP \ TEST.EXE” 符号搜索路径是: SRV *; SRV C:\符号http://msdl.microsoft.com/download/symbols 可执行搜索路径是:ModLoad : 00d28000
image00000000 00d20000 (1b40.464): Break instruction exception - code 80000003 (first chance) ntdll!LdrpDoDebuggerBreak+0x30: 00000000 77c7cb60立方厘米INT 3 0:000>ķ小孩子SP RetAddr
调用位置00000000 0012ed70 00000000 77c32ef5 NTDLL LdrpDoDebuggerBreak +的0x30 000000! 00 0012edb0 00000000 77c11a17 ntdll!LdrpInitializeProcess + 0x1b4f 77bfc32e ntdll! ?? :: FNODOBFM :: string'+0x29220 00000000 0012f310 00000000`00000000 NTDLL!LdrInitializeThunk + 0xe

或者你可以像WinDBG的调试器这将默认闯入ntdll!LdrpInitializeProcess中打开过程。

HTH

相关问题