WinDBG Remote 获得 Notepad内容

最近偶然看到一篇文章“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, 在其中输入一些字符。

虚拟机中运行 WindowsXP

Step2. 在 WinDBG 中停下来,另外,确保已经加载了 Symbols, 否则无法进行。使用 !process 0 0 命令列出全部进程:

!Process 0 0 列出所有进程

列出来的进程很多,我们需要的在最后:

Notepad 进程

Notepad 的页目录表在 15075000

Step3. 使用入侵式切换到 Notepad 进程,命令是 .process /i /p 8968dba0

入侵式切换

这时候会停下来,需要输入 g 继续。

输入 g ,过一会自动中断下来

再次停下时 WinDBG 已经切换到了 Notepad 的空间。

Step4. 因为猜测 NotePad 将内容信息放置在 Heap上,所以首先用 !heap -a 查看这个进程的 heap 分布:

列出 notepad 进程的 heap

然后使用 s 命令在其中搜索,我们在第一个heap 上搜索(一共有9个heap理论上应该是每个都搜索的),命令是 s -u 000a0000 L00015000 “www.lab-z.com”:

在给定的范围内搜索字符串

Step5. 使用 WinDBG 的 memory 窗口查看上面的内存地址,可以看到这段内存就是我们在 Notepad 中写入的:

WinDBG memory 窗口查看内存

这时候可以尝试直接修改上面的字符串,然后再使用 g  命令让虚拟器中的 Windows 跑起来,刚跑起来的时候 Notepad 中的内容不会改变,因为 Windows 没有重新绘制,摇晃一下 Notepad 的窗体就可以看到发生了变化。

Step6.可以让 WinDBG 再次停下来,这时候 Memory 窗口已经失效,因为 Windows 已经切换到其他的进程中。如果想再次修改内存,需要再使用 Step 3 中的方法入侵 Notepad 进程。

==========================================================

上面的一切都发生在Notepad 的虚拟内存中,接下来实验如何在物理内存中找到上面的位置。

重来一次上面的操作
  1. 重复上面的 Step 3 操作,确保 WinDBG 处于 Notepad 的进程中;
  2. 使用 !pte 00014c2 命令

计算方法是 0x15264067 and 0x000 (低12位清零),然后加上 0x000b14c2 的低12位,结果是 0x152644c2

3.使用 !db 0x152644c2 查看物理内存,和我们上面看到的内容相同:

!db 查看物理内存

==========================================================

在虚拟机 Windows XP系统中安装了一个 RW Everything, 重复上面的动作

再次计算0x244B067 and 0x000 (低12位清零),然后加上 0x000b1032的低12位,结果是 0x244B032 ,用 RW 查看这个物理地址可以看到相同的结果:

Rw 查看物理内存

总结:通过上面的方法可以使用 WinDBG Kernel Debug 的方式修改目标机的 NotePad 中的内容,同时简单介绍了从一个进程的虚拟地址计算为物理地址的方法。有兴趣的朋友可以动手试试。

参考:

1. https://blog.csdn.net/lixiangminghate/article/details/53086667

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注