gpt4 book ai didi

c++ - 使用 WinDBG 识别有缺陷的函数

转载 作者:可可西里 更新时间:2023-11-01 12:41:20 25 4
gpt4 key购买 nike

我已经从 7.1 Windows SDK 安装了 WinDBG。然后用 VC++ 2008 我制作了一个程序“CleanPayload.exe”,它只包含一个“main”和一个故意包含缺陷的函数调用。它是一个包含调试符号的发布版本。我将该程序打开到 WindDBG 中,然后

  1. 做了一个 .sympath+ 来指示该程序的 PDB 所在的位置。
  2. 做了一个 ld * 来加载所有符号
  3. 做了一个 lm 来验证所有符号都已加载(我的程序的私有(private)符号,Windows 库的公共(public)符号)。

然后我运行了该程序,它抛出了第一次异常,这是意料之中的。如下:

(910.12a0): WOW64 breakpoint - code 4000001f (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll32!LdrpDoDebuggerBreak+0x2c:
771e0f2b cc int 3

但是当我要求 WinDBG 向我展示堆栈时,它没有向我展示我的程序“CleanPayload.exe”的任何内容。相反,它向我展示了这个:

0:000:x86> kb
ChildEBP RetAddr Args to Child
004bf5ec 771c122b 7efdd000 7efde000 7724206c ntdll32!LdrpDoDebuggerBreak+0x2c
004bf764 77192187 004bf7d8 77140000 7c185e6a ntdll32!LdrpInitializeProcess+0x132f
004bf7b4 77179e89 004bf7d8 77140000 00000000 ntdll32!_LdrpInitialize+0x78
004bf7c4 00000000 004bf7d8 77140000 00000000 ntdll32!LdrInitializeThunk+0x10

我需要做什么才能显示堆栈跟踪,其中 (1) 包括我的程序和 (2) 引发异常的函数?

更新 我听从了 Larry 的建议,跑过了第一个异常,得到了以下结果:

0:000:x86> g
ntdll!NtTerminateProcess+0xa:
00000000`76faf97a c3 ret
0:000> kb
RetAddr : Args to Child : Call Site
00000000`74c6601a : 00000000`00000000 00000000`000de600 00000000`000ddc80 00000000`74c60304 : ntdll!NtTerminateProcess+0xa
00000000`74c5cf87 : 00000000`0030f988 00000000`0030dba8 00000000`7efdb000 00000000`0030f934 : wow64!whNtTerminateProcess+0x46
00000000`74be276d : 00000000`77150190 00000000`74c50023 00000000`00000000 00000000`0030fab8 : wow64!Wow64SystemServiceEx+0xd7
00000000`74c5d07e : 00000000`00000000 00000000`74be1920 00000000`000de820 00000000`76f93501 : wow64cpu!TurboDispatchJumpAddressEnd+0x24
00000000`74c5c549 : 00000000`00000000 00000000`00000000 00000000`74c54ac8 00000000`7ffe0030 : wow64!RunCpuSimulation+0xa
00000000`76faae27 : 00000000`004a3100 00000000`00000000 00000000`7707a1e0 00000000`7efdf000 : wow64!Wow64LdrpInitialize+0x429
00000000`76fa72f8 : 00000000`00000000 00000000`76fa8641 00000000`76fb84e0 00000000`00000000 : ntdll!LdrpInitializeProcess+0x1780
00000000`76f92ace : 00000000`000df1b0 00000000`00000000 00000000`7efdf000 00000000`00000000 : ntdll! ?? ::FNODOBFM::`string'+0x2af20
00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe

因此,不幸的是,我仍然没有看到相关的堆栈跟踪信息。在上述步骤之前,我还尝试了 .effmach x86 命令,但似乎没有影响。顺便说一下,我还重新执行了整个测试,并为我正在测试的目标程序激活了应用程序验证程序。我得到了非常矛盾的结果:

0:000> g
ModLoad: 00000000`76d40000 00000000`76e5f000 WOW64_IMAGE_SECTION
ModLoad: 00000000`74f90000 00000000`75090000 WOW64_IMAGE_SECTION
ModLoad: 00000000`76d40000 00000000`76e5f000 NOT_AN_IMAGE
ModLoad: 00000000`76e60000 00000000`76f5a000 NOT_AN_IMAGE
ModLoad: 00000000`71160000 00000000`711c0000 C:\Windows\syswow64\verifier.dll
Page heap: pid 0x1A54: page heap enabled with flags 0x3.
AVRF: CleanPayload.exe: pid 0x1A54: flags 0x80643027: application verifier enabled
ModLoad: 00000000`71130000 00000000`7115b000 C:\Windows\SysWOW64\vrfcore.dll
ModLoad: 00000000`710d0000 00000000`71128000 C:\Windows\SysWOW64\vfbasics.dll
ModLoad: 00000000`74f90000 00000000`75090000 C:\Windows\syswow64\kernel32.dll
ModLoad: 00000000`76830000 00000000`76876000 C:\Windows\syswow64\KERNELBASE.dll
ModLoad: 00000000`715c0000 00000000`7164e000 C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4926_none_508ed732bcbc0e5a\MSVCP90.dll
ModLoad: 00000000`73dc0000 00000000`73e63000 C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4926_none_508ed732bcbc0e5a\MSVCR90.dll
(1a54.17dc): WOW64 breakpoint - code 4000001f (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll32!LdrpDoDebuggerBreak+0x2c:
771e0f2b cc int 3

0:000:x86> !avrf
*************************************************************************
*** ***
*** ***
*** Your debugger is not using the correct symbols ***
*** ***
*** In order for this command to work properly, your symbol path ***
*** must point to .pdb files that have full type information. ***
*** ***
*** Certain .pdb files (such as the public OS symbols) do not ***
*** contain the required information. Contact the group that ***
*** provided you with these symbols if you need this command to ***
*** work. ***
*** ***
*** Type referenced: wow64!_TEB32 ***
*** ***
*************************************************************************
Application verifier is not enabled for this process.
Use appverif.exe tool to enable it.

上面的执行说AVRF: Cleanpayload.exe ... application verifier enabled,这表明它已锁定目标。但是随后的 !avrf 命令显示调试符号是错误的,即使 lm 命令显示它们都已正确加载!这里到底发生了什么?

最佳答案

您正在运行 64 位版本的 windbg 和一个 32 位应用程序。初始断点在 64 位代码中运行。

如果您点击“g”,您应该会点击 32 位应用程序的初始断点,您应该能够从那里开始。

要从 64 位调试切换到 32 位调试(例如,如果您按 CTRL-C),请键入:

.effmach x86

这会将调试器从 64 位模式切换到 32 位模式。

关于c++ - 使用 WinDBG 识别有缺陷的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com