最近偶然看到一篇文章“windbg修改notepad内容(!pte/!dd/.process/s命令)”【参考1】,介绍使用 WinDBG Kernel Debug 的方式修改 Noetpad 中的内容。根据这篇文章进行了实验。
这次实验的目标是通过 WinDBG 修改被调试机上运行的 Notepad 中内容,实验使用 Kernel Mode 在 VirtualBox上进行。 VirtualBox 中运行的是 Windows XP SP3 (特别注意,必须使用 32位 Windows),二者是通过 PIPE方式连接的。关于他们的连接方式,网上有很多文章,特别需要注意的是:你可以使用\\.\pipe\LABZ这样的名称,但是不要使用 \\.\pipe\com1 这个名称, COMx 这样的在 Windows中表示COM设备。
Step1. 启动 VirtualBox 中的Windows,然后确定 WinDBG已经连接。之后运行这个Windows 中的 NotePad, 在其中输入一些字符。
Step2. 在 WinDBG 中停下来,另外,确保已经加载了 Symbols, 否则无法进行。使用 !process 0 0 命令列出全部进程:
列出来的进程很多,我们需要的在最后:
Notepad 的页目录表在 15075000
Step3. 使用入侵式切换到 Notepad 进程,命令是 .process /i /p 8968dba0
这时候会停下来,需要输入 g 继续。
再次停下时 WinDBG 已经切换到了 Notepad 的空间。
Step4. 因为猜测 NotePad 将内容信息放置在 Heap上,所以首先用 !heap -a 查看这个进程的 heap 分布:
然后使用 s 命令在其中搜索,我们在第一个heap 上搜索(一共有9个heap理论上应该是每个都搜索的),命令是 s -u 000a0000 L00015000 “www.lab-z.com”:
Step5. 使用 WinDBG 的 memory 窗口查看上面的内存地址,可以看到这段内存就是我们在 Notepad 中写入的:
这时候可以尝试直接修改上面的字符串,然后再使用 g 命令让虚拟器中的 Windows 跑起来,刚跑起来的时候 Notepad 中的内容不会改变,因为 Windows 没有重新绘制,摇晃一下 Notepad 的窗体就可以看到发生了变化。
Step6.可以让 WinDBG 再次停下来,这时候 Memory 窗口已经失效,因为 Windows 已经切换到其他的进程中。如果想再次修改内存,需要再使用 Step 3 中的方法入侵 Notepad 进程。
==========================================================
上面的一切都发生在Notepad 的虚拟内存中,接下来实验如何在物理内存中找到上面的位置。
- 重复上面的 Step 3 操作,确保 WinDBG 处于 Notepad 的进程中;
- 使用 !pte 00014c2 命令
计算方法是 0x15264067 and 0x000 (低12位清零),然后加上 0x000b14c2 的低12位,结果是 0x152644c2
3.使用 !db 0x152644c2 查看物理内存,和我们上面看到的内容相同:
==========================================================
在虚拟机 Windows XP系统中安装了一个 RW Everything, 重复上面的动作
再次计算0x244B067 and 0x000 (低12位清零),然后加上 0x000b1032的低12位,结果是 0x244B032 ,用 RW 查看这个物理地址可以看到相同的结果:
总结:通过上面的方法可以使用 WinDBG Kernel Debug 的方式修改目标机的 NotePad 中的内容,同时简单介绍了从一个进程的虚拟地址计算为物理地址的方法。有兴趣的朋友可以动手试试。
参考:
1. https://blog.csdn.net/lixiangminghate/article/details/53086667