debugging - 不推荐使用 CreateProcessW 吗?

标签 debugging windbg

我找不到确切的答案,所以我决定问一下。

我一直在阅读“Windows 内部调试”,在示例中它告诉我在 上设置断点kernel32!CreateProcessW .

但在此之前它使用 .symfix debugger 命令将调试器符号搜索路径设置为指向 Microsoft 在线符号服务器。当我尝试设置断点时,我收到一个错误,指出它无法解析函数(或类似的东西)。它看起来像这样。

0:000> bp kernel32!CreateProcessW
Couldn't resolve error at 'kernel32!CreateProcessW'

这可能是因为下面的列表中没有“kernel32!CreateProcessW”。
0:000> x kernel32!CreateProcess*
76b90cb9 KERNEL32!CreateProcessWithTokenW (void)
76b90d84 KERNEL32!CreateProcessAsUserW (void)
76b90d84 KERNEL32!CreateProcessWithLogonW (void)
76b4e225 KERNEL32!CreateProcessWStub = <no type information>
76b72e04 KERNEL32!CreateProcessInternalAStub = <no type information>
76b72e15 KERNEL32!CreateProcessInternalWStub = <no type information>
76b72de2 KERNEL32!CreateProcessAStub = <no type information>
76b72df3 KERNEL32!CreateProcessAsUserWStub = <no type information>

如果我将断点设置为 一切正常kernel32!CreateProcessWStub 但我想知道为什么我找不到并将断点设置为 kernel32!CreateProcessW .

这本书可能侧重于使用 Windows 7 的读者。我使用的是 Windows 8.1 并认为 kernel32!CreateProcessW 可能已被弃用...

我对这个领域非常陌生,如果这是一个完全愚蠢的问题,我深表歉意。但无论如何,感谢您阅读它。

最佳答案

CreateProcessW绝对不会被弃用。此外,唯一记录在案的入口点仍在 kernel32.dll 中,因此出于所有意图和目的,您应该继续调用 CreateProcessW。通过 kernel32.dll,而不是通过 kernelbase.dll。

以下是一些更多细节,可帮助您了解您正在观察的内容。 Windows 团队经常移动代码,在最近的几个版本中,他们有将较大的 DLL 分解为较小的 DLL 的强烈习惯,其中包括 kernel32、ole32、user32、gdi32 等等。 Raymond Chen 不是新的 wrote about this在 2006 年。然而,Raymond 描述的机制是基于转发器的,而您在这里看到的 kernel32!CreateProcessW是一个 stub ,即调用 kernelbase!CreateProcessW 然后返回的函数:

0:014> u kernel32!CreateProcessWStub l14
KERNEL32!CreateProcessWStub:
00007ffd`83cf58a8 4c8bdc          mov     r11,rsp
00007ffd`83cf58ab 4883ec58        sub     rsp,58h
00007ffd`83cf58af 488b8424a8000000 mov     rax,qword ptr [rsp+0A8h]
00007ffd`83cf58b7 498943f0        mov     qword ptr [r11-10h],rax
... skip ...
00007ffd`83cf58f5 ff1555871100    call    qword ptr [KERNEL32!_imp_CreateProcessW (00007ffd`83e0e050)]
00007ffd`83cf58fb 4883c458        add     rsp,58h
00007ffd`83cf58ff c3              ret 

如您所见,调用的函数是 kernelbase!CreateProcessW

0:014> ln poi kernel32!_imp_CreateProcessW
(00007ffd`82f92604)   KERNELBASE!CreateProcessW   |  (00007ffd`82f926d0)   KERNELBASE!MakeLocHashNode
Exact matches:
    KERNELBASE!CreateProcessW (no parameter info)

在这种情况下,我不知道为什么 Windows 人们决定使用 stub 而不是转发器,在我看来,像大多数其他重构一样,简单地转发调用似乎更有效。

Windows 8.1 中的 Kernel32.dll 仍然包含导出符号 CreateProcessW .命令 link /dump /exports打印出所有导出符号:
c:\>link /dump /exports c:\Windows\System32\kernel32.dll | findstr CreateProcessW
        220   DB 000058A8 CreateProcessW = CreateProcessWStub

您可以使用相同的命令来确定应该在何处设置断点。同样对于转发的导出:
c:\>link /dump /exports c:\Windows\System32\kernel32.dll | findstr EnterCriticalSection
        298  129          EnterCriticalSection (forwarded to NTDLL.RtlEnterCriticalSection)
       1418  589          TryEnterCriticalSection (forwarded to NTDLL.RtlTryEnterCriticalSection)

WinDbg 无法解析符号 kernel32!CreateProcess 的原因,可能只是 WinDbg 中的一个错误。在这种情况下,符号不是 .PDB 文件的一部分,而是包含在 PE 镜像的一个特殊部分中,显然 WinDbg 不处理它。有趣的是,如果 .PDB 文件不可用,WinDbg 很乐意使用 PE 镜像的导出表:
0:014> .sympath .
0:014> .reload
Reloading current modules ....
0:014> x kernel32!CreateProcessW
00007ffd`83cf58a8 <b>KERNEL32!CreateProcessW</b> (no parameter info)

显然,WinDbg 决定使用 PDB 符号或导出符号,但不能同时使用两者。

关于debugging - 不推荐使用 CreateProcessW 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23169172/

相关文章:

java - 有时找不到 Xpath 元素

iphone - 如何将代码附加到正在运行的 iPhone 应用程序

android - 我的 Android Studio 上缺少调试窗口

c++ - 我可以在调试时将局部变量显示为特定的结构/数据类型吗?

c++ - 如何使用 WinDbg 分析 VC++ 应用程序的故障转储?

mfc - WinDbg 在 msdl.microsoft.com 上找不到 mfc90 版本 9.0.30729.4148 符号

c# - 变量更改时通过调试进行错误跟踪

visual-studio-2008 - VS 2008调试: How to filter and iterate collections in immediate debug window?

.net - WPF中的win32窗口

memory-management - WinDbg 替代 !dumpheap -type?