当ntdll.dll映射到新进程时,如何进入WinDBG

时间:2012-08-27 14:11:55

标签: debugging windbg

当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? 感谢

[UPDATE]

我完全按照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'

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

这是WinDBG中的错误吗?

enter image description here

3 个答案:

答案 0 :(得分:5)

如果您转到Debug->事件过滤器并将“创建过程”更改为“已启用”,则重新启动它将在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

答案 1 :(得分:2)

关于加载ntdll,我建议阅读this。您可以在任何代码运行之前进入该过程:

windbg -xe cpr notepad

或者

windbg -xe ld:ntdll notepad

此时ntdll仍会映射到进程中 - 在发生这种情况之前你无法进入。

至于内存访问错误,kernel32尚未加载到进程中。初始线程排队等待在kernel32!BaseProcessStartThunk上运行,但由于kernel32尚未加载到地址空间,因此您不会在该地址看到任何内容。

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

sxe ld kernel32

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

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

答案 2 :(得分:-1)

据我所知,ntdll未被用户模式映射。如果它是由用户模式映射的,那么映射ntdll的模块会映射什么? ntdll包含一组用于进入内核的系统调用的存根,还包含一些其他的东西,例如COFF加载器,它是进程初始化的一部分。它有点神奇,无法重新定位,因此在每个进程中都始终处于相同的虚拟地址。

如果你想在映射ntdll之前中断,恐怕你将不得不使用内核调试器。

我可以问一下,在映射ntdll之前你打算通过什么来实现?