【问题标题】:How to break into WinDBG when ntdll.dll is mapped into the new processntdll.dll映射到新进程时如何闯入WinDBG
【发布时间】:2012-08-27 14:11:55
【问题描述】:

当 ntdll.dll 映射到新进程时,以及任何 ntdll 的进程初始化运行之前,我想使用以下命令闯入 WinDBG。

sxe ld ntdll.dll ;g

但是,这个技巧根本不起作用,

ModLoad: 7c900000 7c9b0000   ntdll.dll
eax=010043af ebx=7ffde000 ecx=020f18f5 edx=00000034 esi=00c2f720 edi=00c2f6f2
eip=7c810867 esp=0006fffc ebp=00000720 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000200
7c810867  ??              ???
Processing initial command 'sxe ld ntdll.dll ;g'
0:000> sxe ld ntdll.dll ;g
(ae8.6f4): Break instruction exception - code 80000003 (first chance)
eax=00181eb4 ebx=7ffde000 ecx=00000001 edx=00000002 esi=00181f48 edi=00181eb4
eip=7c901230 esp=0006fb20 ebp=0006fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c901230 cc              int     3

那么,当ntdll.dll映射到新进程时,如何闯入WinDBG? 谢谢

[更新]

我完全按照 jcopenha 提到的步骤进行操作,但我不知道 Windbg 为什么会在运行 Notepad.exe 时出现奇怪的错误(内存访问错误)。

请帮帮我!非常感谢!

0:000> .restart /f
CommandLine: C:\WINDOWS\NOTEPAD.EXE
Symbol search path is: D:\Symbols\Symbols;SRV*D:\Symbols\MySymbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
ModLoad: 01000000 01014000   notepad.exe
eax=0100739d ebx=7ffd9000 ecx=020f18f5 edx=0000004e esi=00f7f73a edi=00f7f6f2
eip=7c810867 esp=0007fffc ebp=0000024c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000200
7c810867 ??              ???
0:000> u 7c810867
7c810867 ??              ???
            ^ Memory access error in 'u 7c810867'

[更新2] 我发现7c810867显示了一条奇怪的指令,但是p命令仍然可以工作。

这是 WinDBG 中的错误吗?

【问题讨论】:

  • 希望有人能帮帮我!谢谢
  • 出现问号的原因是您使用的是内核调试器,而此时页表不存在。因此,当您执行 p(跳过)时,异常由内存管理器处理并将内存映射为可用(这就是您看到它的原因)。

标签: debugging windbg


【解决方案1】:

如果您进入 Debug->Event Filters 并将“创建进程”更改为“启用”,然后重新启动应用程序,它将在 ntdll.dll 出现在模块列表中之前启动。如果您随后执行sxe ld ntdll.dll;g,它将停在ntdll!RtlUserThreadStart

0:000> .restart /f
CommandLine: C:\Windows\System32\notepad.exe
Symbol search path is: SRV*d:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
ModLoad: 00000000`ffe00000 00000000`ffe35000   notepad.exe
00000000`7790c500 4883ec48        sub     rsp,48h
0:000> sxe ld ntdll.dll;g
ModLoad: 00000000`778e0000 00000000`77a89000   ntdll.dll
ntdll!RtlUserThreadStart:
00000000`7790c500 4883ec48        sub     rsp,48h

【讨论】:

    【解决方案2】:

    关于ntdll的加载,推荐阅读this。您可以在任何代码运行之前中断进程:

    windbg -xe cpr notepad
    

    或者

    windbg -xe ld:ntdll notepad
    

    此时ntdll仍将被映射到进程中——在这发生之前你不能闯入。

    关于内存访问错误,kernel32 还没有加载到进程中。初始线程在 kernel32!BaseProcessStartThunk 处排队运行,但由于 kernel32 尚未加载到地址空间中,您不会在该地址看到任何内容。

    线程的起始地址能够在未映射的内存中开始的原因是因为在线程开始执行之前,首先发生的事情是用户 APC 在处理所有进程的初始线程的上下文中运行初始化,包括加载 kernel32。如果您设置类似的事件,您可以看到此事件发生,例如:

    sxe ld kernel32
    

    您需要加载符号以在堆栈跟踪中获取内部函数名称。

    除了第一个链接,您还可以阅读更多关于进程初始化的信息here。希望这会有所帮助。

    【讨论】:

    • 我还想补充一点,因为 ntdll 没有出现在模块列表中并不意味着它还没有映射到进程中。由于 ntdll 在系统中的每个进程中具有相同的基地址,因此您可以从任何其他进程中获取 ntdll 的基地址,并在您调试的进程中显示该地址处的内存。您仍然会看到 ntdll。它没有出现在加载的模块列表中的原因是模块列表尚未在 PEB 中构建。这也作为初始化的一部分发生。
    【解决方案3】:

    据我所知,ntdll 不是由用户模式映射的。如果它是由用户模式映射的,那么映射 ntdll 的模块会映射什么? ntdll 包含一组用于系统调用进入内核的存根,还包含一些其他内容,例如作为进程初始化一部分的 COFF 加载程序。这是一个神奇的 dll,它不能被重定位,因此在每个进程中总是在同一个虚拟地址。

    如果你想在 ntdll 被映射之前中断,恐怕你必须使用内核调试器。

    请问您在映射 ntdll 之前尝试通过中断来实现什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 2021-08-28
      • 1970-01-01
      • 2011-05-12
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多