Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 我可以在ntdll.dll中设置断点吗_LdrpInitializeProcess?_Windows_Visual Studio_Debugging_Windbg - Fatal编程技术网

Windows 我可以在ntdll.dll中设置断点吗_LdrpInitializeProcess?

Windows 我可以在ntdll.dll中设置断点吗_LdrpInitializeProcess?,windows,visual-studio,debugging,windbg,Windows,Visual Studio,Debugging,Windbg,在调试Windows进程时,有时尽早中断会很方便 初始调用堆栈如下所示:(例如,当您在DLL\u进程\u附加上的DllMain函数中设置断点时,您会得到此结果) 因此,在这些ntdll例程中设置断点应该可以很早中断进程 但是,在调试器中启动进程之前,我不知道如何在那里设置断点。在VisualStudio(2005)中有可能吗?怎么用?可以在WinDbg中完成吗?我会在进程启动时使用类似于启动调试器的东西 下面是test.exe的gflags设置示例 这是调试器的输出。注意带有ntdll的调用堆

在调试Windows进程时,有时尽早中断会很方便

初始调用堆栈如下所示:(例如,当您在
DLL\u进程\u附加
上的
DllMain
函数中设置断点时,您会得到此结果)

因此,在这些ntdll例程中设置断点应该可以很早中断进程


但是,在调试器中启动进程之前,我不知道如何在那里设置断点。在VisualStudio(2005)中有可能吗?怎么用?可以在WinDbg中完成吗?

我会在进程启动时使用类似于启动调试器的东西

下面是test.exe的gflags设置示例

这是调试器的输出。注意带有
ntdll的调用堆栈!LdrpInitializeProcess

命令行:“C:\temp\test.exe” 符号搜索路径为: srv*;srvc:\符号 可执行搜索路径为:ModLoad: 00000000
00d20000 00000000
00d28000
image00000000
00d20000(1b40.464):
中断指令异常-代码
8000003(第一次机会)
ntdll!LdrpDoDebuggerBreak+0x30:
00000000
77c7cb60 cc int 3 0:000>k子SP重新寻址
调用站点00000000
0012ed70
00000000
77c32ef5 ntdll!LdrpDoDebuggerBreak+0x30 00000000
0012EDB000000000
77c11a17 ntdll!LdrpInitializeProcess+0x1b4f 00000000
0012F2A000000000
77bfc32e ntdll!??:::FNODBFM::
string'+0x29220
00000000
0012f310 00000000`00000000 ntdll!LdriInitializeThunk+0xe

或者您可以在调试器中打开进程,比如Windbg,它将进入
ntdll!默认情况下,LdrpInitializeProcess


HTH

我已经知道了如何在Visual Studio中实现它

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

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


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

重新启动时,它们甚至不会更改。为什么会这样?当您安装修改DLL的系统更新时,这些DLL可能会更改,但这些DLL每次都将以其首选的基址加载。@David:怎么样?您是否在应用程序中启用ASLR?@DavidFeffernan:由于Vista在应用程序中并没有真正“启用”ASLR,因此默认情况下它处于启用状态。
    ...
    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