在.NET开发中,信息安全至关重要,尤其是涉及到敏感信息如银行账户或信用卡号时,需要保护这些信息免受恶意攻击或简单的内部字符串探索。本文将介绍如何使用Windbg调试工具来探索.NET进程中的字符串内存管理。
首先,需要了解.NET中字符串类(System.String)的基本概念。字符串类是.NET中使用最广泛的类之一,几乎任何软件都会用到它。为了进行内存调试,将使用Windows调试器(Windbg),这是一个微软支持团队常用的工具。如果还没有这个工具,请从微软官网下载。
首先,需要将SOS.DLL文件复制到调试工具目录下。SOS.DLL是一个.NET调试助手文件,包含了许多用于调试.NET应用程序的命令和工具。
copy %windir%\Microsoft.NET\Framework\v2.0.XXXXXX\SOS.DLL %programfiles%\Debugging tools for windows\
接下来,运行随邮件附带的示例应用程序(sampleApp.exe)。这是一个模拟的应用程序,用于演示调试过程。
执行 sampleApp.exe
在示例应用程序中,填写用户名和密码,例如用户名为renepa,密码为www.xtreemcorp.com,然后点击确定按钮。
返回Windbg,按下F6键附加文件。在进程列表中选择SampleAPP.exe。
在Windbg中输入命令加载SOS.DLL扩展:
.load sos
SOS.DLL包含一个非常有趣的命令!dumpheap,它允许转储内存中的所有类。这个命令遍历.NET堆并转储所有已分配的对象。它还可以用来检测高内存使用情况。将在其他文章中详细解释这个命令。
!dumpheap –type System.String
这个命令允许转储所有System.String类的内存地址。输出结果将包括地址、方法表(Method Table)和类的大小。
!dumpheap –type System.String –short
使用!do命令探索内存地址中的字符串对象。例如:
!do 014d11c8
感兴趣的是字符串中的字符本身,而不是完整的类。字符位于字符串内存地址+c的位置。通过探索类,发现m_first char位于STRING MEMORY ADDRESS+c(十六进制值)。可以通过探索内存地址014d11c8+c=014d11d4来确认这一点。
最后,将所有内容整合到一个简单的Windbg命令中:
.foreach (obj {!dumpheap -type System.String -short}) {.printf "\n%mu",${obj}+c}
.foreach类似于C#中的foreach,每个字符串的内存地址将临时存储在obj变量中,这是一个依赖于迭代的临时变量。.printf "\n%mu"打印一个以NULL结尾的Unicode字符数组,${obj}+c是字符串中第一个字符的地址。记住为什么要将地址加c,因为这是字符串指针的起始位置。