您的位置:首页 > 理论基础 > 计算机网络

Windows网络数据流跟踪技巧

2006-04-10 19:54 232 查看
这个系列相当琐碎,想到哪里写到哪里,说不定这是第一篇也是最后一篇。同时,这
也不是正式文档,可能仅仅是某次调试过程中临时记录的内容。

这次说说跟踪445/TCP口上的数据流。445/TCP口上的很多数据流由内核态的驱动直接
处理,并不交给用户态程序,此时想通过拦截传统套接字函数跟踪数据流是没有意义
的。

假设在SoftICE中跟踪,为了使stack命令的输出更有可读性,一般加载如下符号表:

ntoskrnl.nms
tcpip.nms
netbios.nms
netbt.nms
rdbss.nms
mrxsmb.nms
srv.nms

下例表示目标IP为192.168.7.151、源IP为192.168.7.166时命中:

:bpx tcpip!TCPRcv if *(esp+8)==9707A8C0&&*(esp+c)==A607A8C0

最有意义的事实在于tcpip!TCPRcv()是Windows系统真正开始处理TCP报文的地方,因
此在tcpip!TCPRcv()入口处修改了IP数据区,将影响所有上层处理。比如mrxsmb.sys
将从tcpip.sys获得数据,如果先行在TCPRcv()处修改了SMB报文,对于mrxsmb.sys来
说,它看到的就是修改后的SMB报文。

可能你有点奇怪,为什么我没有直接根据端口进行过滤。在我的测试环境中,根据端
口进行过滤时容易死机,所以没举相应例子,但你不妨一试。

这次说说跟踪IP报文处理流程。假设在SoftICE中跟踪,为了使stack命令的输出更有
可读性,一般加载如下符号表:

ntoskrnl.nms
tcpip.nms

下例表示源IP为192.168.7.250、目标IP为192.168.7.151时命中:

:bpx tcpip!IPRcvPacket if *(*(esp+8)+c)==FA07A8C0&&*(*(esp+8)+10)==9707A8C0

最有意义的事实在于tcpip!IPRcvPacket()是Windows系统真正开始处理IP报文的地方,
因此在tcpip!IPRcvPacket()入口处修改了IP报文,将影响所有上层处理。

这次说说跟踪ICMP报文处理流程。假设在SoftICE中跟踪,为了使stack命令的输出更
有可读性,一般加载如下符号表:

ntoskrnl.nms
tcpip.nms

下例表示源IP为192.168.7.250、目标IP为192.168.7.151时命中:

:bpx tcpip!ICMPRcv if *(esp+8)==9707A8C0&&*(esp+c)==FA07A8C0

最有意义的事实在于tcpip!ICMPRcv()是Windows系统真正开始处理ICMP报文的地方,
因此在tcpip!ICMPRcv()入口处修改了ICMP报文,将影响所有上层处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: