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

本文介绍了如何使用Windbg和VisualDDK进行Windows内核调试,通过分析PING.EXE程序,查找系统调用API,特别是IcmpSendEcho2Ex和NtDeviceIoControlFile函数,设置了条件断点来定位IP地址存储位置。通过dd指令查看内存和理解寄存器内容,最终在InputBuffer+0x5ec处找到IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始使用Windbg
终于有机会真正使用windbg了,一个小小的任务,用了两天时间,总算从一问三不知进化到可以进行简单的调试。
任务:分析PING.EXE程序,找到系统调用API,分析获得IP地址存放位置;
首先需要弄清楚的是PING.EXE执行过程,以及该过程中所调用的系统调用。师兄推荐了一个很好用的软件:
API Monitor(链接:http://www.rohitab.com/apimonitor/)
截图:

主要用的三个模块 :设置API过滤器,进程监控窗口Process Monitor ,点击相应API查看具体参数;
软件捕获到的API很多,而Ping程序真正使用的程序只有几个,4000多个API翻到3500左右才会发现有用信息;

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.youkuaiyun.com/vangoals/article/details/4458051 (Windbg常用断点设置)
首先打开Windbg.exe,file-》Open Executable->

将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

通过理解上面的文章,我明白了一下几个寄存器内容的含义:
首先想要查看当前捕获到的函数具体信息,需要执行dd 指令,用来查看内存;
而ChildEBP中存放的则为本函数地址,RetAddr存放的为返回地址,之后为参数;
也可以通过Windbg菜单栏中View-》Memory,直接查看内存;
通过学习,找到了本程序中添加条件断点的方法:
bu ntdll!NtDeviceIoControlFile  " j (IoControlCode=00120013)  ' ' ; ' gc '  "
这里有一个技巧就是学会分析内存内容,楼主在查看InputBuffer内容时发现该地址下没有存储任何IP地址信息,而是一些指针,但通过Windbg并不能真正看到内核中这些地址信息的变化(注意此处楼主只是调试了可执行程序,并没有进入内核调试,目前Windbg仅支持WinXP系统的本地内核调试),通过不断尝试ping 不同的IP地址,楼主发现每次IP地址的存放位置为
InputBuffer地址+0x5ec!!!!!!
通过不停的尝试加断点查看内存,终于找到了需要的内容,任务完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值