【问题标题】:Can I set a breakpoint in ntdll.dll!_LdrpInitializeProcess?我可以在 ntdll.dll!_LdrpInitializeProcess 中设置断点吗?
【发布时间】:2011-06-16 12:14:19
【问题描述】:

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

初始调用堆栈如下所示:(例如,当您在 DLL_PROCESS_ATTACH 上的 DllMain 函数中设置断点时,您会得到这个)

    ...
    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中完成吗?

【问题讨论】:

    标签: windows visual-studio debugging windbg


    【解决方案1】:

    当进程启动时,我会使用GFlags 之类的东西来启动调试器。

    这是 test.exe 的示例 gflags 设置

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

    命令行:“C:\temp\test.exe” 符号搜索路径为: srv*;srvc:\symbolshttp://msdl.microsoft.com/download/symbols 可执行搜索路径为:ModLoad: 0000000000d20000 0000000000d28000
    image0000000000d20000 (1b40.464): Break instruction exception - code 80000003 (first chance) ntdll!LdrpDoDebuggerBreak+0x30: 0000000077c7cb60 cc in 3 0:000> k Child-SP RetAddr
    呼叫站点 000000000012ed70 0000000077c32ef5 ntdll!LdrpDoDebuggerBreak+0x30 000000000012edb0 0000000077c11a17 ntdll!LdrpInitializeProcess+0x1b4f 000000000012f2a0 0000000077bfc32e ntdll! ?? ::FNODOBFM::string'+0x29220 000000000012f310 00000000`00000000 ntdll!LdrInitializeThunk+0xe

    或者你可以在像Windbg这样的调试器中打开进程,默认情况下会进入ntdll!LdrpInitializeProcess

    HTH

    【讨论】:

      【解决方案2】:

      我已经找到了如何在 Visual Studio 中执行此操作。

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

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

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

      【讨论】:

      • 重启后它们甚至不会改变。他们为什么会?当您安装修改 DLL 的系统更新时,它们可能会发生变化,但这些 DLL 每次都会在其首选基地址加载。
      • @David:ASLR 呢?
      • 您是否在您的应用中启用了 ASLR?
      • @DavidHeffernan:从 Vista 开始,您并没有真正在应用程序中“启用”ASLR,它是默认开启的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2010-10-19
      • 2014-07-11
      • 2015-09-30
      相关资源
      最近更新 更多