WinDBG 有两种模式,一种是用来调试Kernel 的,比如,前面介绍过的双机通过USB3 互联,然后从一端调试另外一端;另外一种是用来调试User Mode的Application,比如,在本机打开WinDBG调试本机当前的 NotePad。
我原来的理解是,如果双机互联之后都能够调试Kernel Mode,那么调试远端机器上的Application应该手到擒来。但是多次试验都没有成功,后来咨询了一下天杀,他表示这条路不通如果需要调试Application 必须老老实实的用UserMode。
这次WinDBG试验的目标是调整Notepad 打开文件对话框,使得原来无法聚焦在编辑界面的对话框可以聚焦。意思是打开 Open对话框时无法再点击后面的主程序界面进行编辑。 本文根据 https://www.codeproject.com/Articles/1276860/Hacking-with-Windbg-Part-1-Notepad 翻译。
这次介绍的是用 WinDBG 来调试本机的 Notepad (记事本):
- 打开Notepad.exe,打开WinDBG, File -> Start debugging -> Attach to process 选择 notepad.exe
Attach之后会自动停下来:
2.使用 x notepad!* 可以查看这个进程的 symbols,如下
3.查看一下带有 open 字样的函数,可以看到 notepad!ShowOpenSaveDialog ,这个可能性很大
5.在这个函数上设置断点,命令 bp notepad!ShowOpenSaveDialog,之后使用 bl 命令查看确定断点已经下好
6.使用 g 命令, 然后使用 Notepad file->open 调出对话框。这时会触发中断
7.此时再使用 u 反编译,u notepad!ShowOpenSaveDialog
同样,可以使用 uf 来一次性反编译整个notepad!ShowOpenSaveDialog
再使用 k 命令【参考1】查看堆栈信息,当前已经在 notepad!ShowOpenSaveDialog 中
7.接下来使用 ub 命令,我们前面使用过 u命令来反编译指定位置和之后的命令。这里ub这个命令是用来反编译指定位置当前指令之前的汇编代码,b这里就是代表向后查看(backward)的意思。【参考2】
可以看到在调用 notepad!ShowOpenSaveDialog 之前有给参数赋值的命令。使用下面的命令直接修改指令,然后再次使用ub 检查,可以看到已经修改完成
0:008> a 00007ff6`ce9c2263
00007ff6`ce9c2263 xor ecx,ecx
DBGHELP: SharedUserData - virtual symbol module
00007ff6`ce9c2265 nop
00007ff6`ce9c2266
8.使用 g 命令让 notepad 运行起来,这时当打开文件对话框仍然可以在编辑区域输入内容。
总结:上面展示了几个 WinDBG 的基本操作,不过第7步的操作在我看起来有些莫名其妙,notepad!ShowOpenSaveDialog是Notepad 自定义的函数,不知道作者是如何得出 ecx 中是对话框参数的结论的,中间似乎缺少必要的推理过程。
参考:
1. https://blog.csdn.net/chenyujing1234/article/details/7743460#t11
15. k 命令用来显示当前线程的堆栈,如下
0:018> k
跟d命令一样,k后面也可以跟很多后缀,比如kb kp,kn,kv,kl等,这些后缀控制了显示的格式和信息。
栈指令k[b|p|P|v]
这四条指令显示的内容类似,但是每个指令都有特色;
KB显示三个参数;
Kp显示所有的参数,但需要Full Symbols或Private PDBSymbols支持。KP与Kp相似,只是KP将参数换行显示了;
Kv用于显示FPO和调用约定;
KD,用于显示Stack的Dump,在跟踪栈时比较有用。
这些指令区分大小。
2. https://www.cnblogs.com/developersupport/p/windbgcommand-u.html
ecx里面的值非常类似于Windows窗口句柄的典型值,所以作者根据经验得出这个结论了。
文章中间有一段就是解释了这个问题。
这篇文章写的挺好的,加深了用WinDBG去调试的手段,赞!