VisualDDK + Windbg 进行Windows内核调试(二)

开始使用Windbg
终于有机会真正使用windbg了,一个小小的任务,用了两天时间,总算从一问三不知进化到可以进行简单的调试。
任务:分析PING.EXE程序,找到系统调用API,分析获得IP地址存放位置;
首先需要弄清楚的是PING.EXE执行过程,以及该过程中所调用的系统调用。师兄推荐了一个很好用的软件:
API Monitor(链接:http://www.rohitab.com/apimonitor/)
截图:
VisualDDK + Windbg 进行Windows内核调试(二)_第1张图片
主要用的三个模块 :设置API过滤器,进程监控窗口Process Monitor ,点击相应API查看具体参数;
软件捕获到的API很多,而Ping程序真正使用的程序只有几个,4000多个API翻到3500左右才会发现有用信息;
VisualDDK + Windbg 进行Windows内核调试(二)_第2张图片
Ping程序中调用的两个重要函数:一个是IcmpSendEcho2Ex,一个是NtDeviceIoControlFile;
参数设置如下,其中最重要的两个参数 IoControlCode 和 InputBuffer,接下来的工作就是在Windbg下获取当IoControlCode值为0x00120013时,InputBuffer中的IP地址;

使用Windbg进行调试,最基本的操作为加断点及查看内存。
加断点的方法可以参考以下几篇文档:
http://www.dbgtech.net/windbghelp/hh/debugger/t01_basic_a4ebd4e7-bb0c-4d6b-b04a-11e823bae62c.xml.htm (设置条件断点)
http://blog.csdn.net/vangoals/article/details/4458051 (Windbg常用断点设置)
首先打开Windbg.exe,file-》Open Executable->
VisualDDK + Windbg 进行Windows内核调试(二)_第3张图片
将C:\\windows\system32\Ping.exe加入Windbg;
使用bu命令分别设置如下断点,语法:bu 符号;

使用bu代替bp设置断点的好处为,bu设置的为永久断点,断点保存在工作空间中,bp设置的为临时断点,下次加载程序调试,需要重新设置;但bu的缺点是,没有添加条件。每次都需要使用dd指令查看NtDeviceIoControlFile的参数判断是否为需要捕获的API;
一篇很好的文章推荐给大家:http://www.cnblogs.com/huangyong9527/archive/2012/08/22/2650948.html
VisualDDK + Windbg 进行Windows内核调试(二)_第4张图片
通过理解上面的文章,我明白了一下几个寄存器内容的含义:
首先想要查看当前捕获到的函数具体信息,需要执行dd 指令,用来查看内存;
而ChildEBP中存放的则为本函数地址,RetAddr存放的为返回地址,之后为参数;
也可以通过Windbg菜单栏中View-》Memory,直接查看内存;
通过学习,找到了本程序中添加条件断点的方法:
bu ntdll!NtDeviceIoControlFile  " j (IoControlCode=00120013)  ' ' ; ' gc '  "
这里有一个技巧就是学会分析内存内容,楼主在查看InputBuffer内容时发现该地址下没有存储任何IP地址信息,而是一些指针,但通过Windbg并不能真正看到内核中这些地址信息的变化(注意此处楼主只是调试了可执行程序,并没有进入内核调试,目前Windbg仅支持WinXP系统的本地内核调试),通过不断尝试ping 不同的IP地址,楼主发现每次IP地址的存放位置为
InputBuffer地址+0x5ec!!!!!!
通过不停的尝试加断点查看内存,终于找到了需要的内容,任务完成。

你可能感兴趣的:(windows,调试,windbg,visualddk)