Windows 2008 R2Windows 2008QAASMWindows VistaDBAWindows 7Windows 2003ArchitectAdvancedWindows XPWindows FormsIntermediateDevWindowsASP.NETC#
.NET 调试:从正在运行的托管代码进程中转储所有字符串





5.00/5 (10投票s)
高级调试进程。
引言
有时,我们想知道进程中有哪些关键信息,例如银行账号或信用卡号,因为我们需要保护这些信息免受恶意人员的侵害,或者仅仅是为了简单地探索其中有哪些内部字符串。这个任务非常简单。在图中,我们揭示了密码中隐藏的文本。该过程适用于所有 .NET 运行进程,包括 IIS 工作进程。
最终输出图

System.String
类是 .NET 世界中最常用的类之一。我无法想象一个不使用它的简单或企业软件。
我们将使用 Windows Debugger 和一个简单的脚本来完成这项任务。
- 启动 Windbg(Microsoft 支持部门使用的首选工具)。如果您没有它,请从 Microsoft 网站下载。
- 将文件 %windir%\Microsoft.NET\Framework\v2.0.XXXXXX\SOS.DLL 复制到 %programfiles%\Debugging tools for windows\。
- 执行邮件中附带的sampleApp.exe(这是一个示例应用程序)。
- 填写用户名和密码,例如:用户名=renepa,密码= www.xtreemcorp.com
- 按确定按钮。
- 返回 Windbg 并按 F6 附加文件。
- 在进程列表中,选择SampleAPP.exe。
- 在 Windbg 中,输入命令:.load sos,它允许加载SOS.DLL扩展,这是一个 .NET 调试辅助文件。它包含许多用于调试 .NET 应用程序的新命令和功能。
- SOS.DLL 包含一个非常有趣的命令,
!dumpheap
,它允许转储内存中的所有类。它遍历 .NET Heap 并转储所有已分配的对象。它还可以用于检测高内存使用率。我们将在其他文章中对此进行解释。 !dumpheap –type System.String
此命令允许我们转储内存中所有System.String
类的内存地址。输出将是请看此输出:
Address
(指向String
类的指针)、MT=Method Table,它是指向System.String
支持的方法列表的指针(我们此时不使用 MT),以及该类的Size
。!dumpheap –type System.String –short
:此命令仅显示内存中当前string
的内存地址。!do[memoryaddress]
:此命令将从内存中转储对象。例如,让我们探索第二个string
:!do 014d11c8
- 该字符串是:C:\blog\dumpstrings\SampleAPP\SampleAPP\bin\Debug\。但我们只关心
char
本身,而不是完整的类。字符在哪里?查看类后,我们发现m_first char
位于STRING MEMORY ADDRESS+c
(十六进制值)。我们可以通过查看内存地址014d11c8+c=014d11d4
来确认这一点。 - 这正是我们想要的。
string
的第一个char
位于:字符串类地址 + c。请在内存中查看,每个 C 字母的char
是**43 00**。这代表什么?Unicode?是的。 - Windbg 允许通过
!dumpheap –type System.String –short
转储的每个内存地址进行迭代。 - 将所有内容组合到一个简单的 Windbg 命令中
- .foreach (obj {!dumpheap -type System.String -short}) {.printf "\n%mu",${obj}+c}
.foreach
= 类似于 C# 的foreach
- 每个
String
的内存地址将被临时存储在obj
中,obj
是一个取决于迭代的临时变量。 -
.printf “\n%mu”
打印一个以NULL
结尾的 Unicode 字符数组。 -
${obj}+c
= 字符串中第一个char
的地址。请记住为什么我们要将sum +c
加到string
指针上。 - 我们得到了本文第一张图的内容。
历史
- 2009年10月1日:初稿发布
- 2011年11月3日:文章更新