xfdadada
驱动牛犊
驱动牛犊
  • 注册日期2008-01-24
  • 最后登录2008-01-27
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1273回复:3

[紧急求助]为什么用driverstudio的OnSend()函数截获封包数据不对?

楼主#
更多 发布于:2008-01-25 09:27
小弟最近正在使用driverstudio自己做一个网络封包的过滤器。
在onReceive()函数中使用正常手段可以获得包的MAC地址,IP地址等等信息(即按照报文格式进行分析提取即可),但是在onSend()函数中却无法提取到有效信息。

--------------------------------------------------我是分割线-------------------------------------------------
代码:

    KNdisBuffer Buf=Original.QueryFirstBuffer();

    if(!Buf.IsValid())
        return false;

    ULONG nBufLen = Buf.Length();

    unsigned char *ipAddr = (unsigned char *)(&Buf);
------------------------------------------------我是分割线---------------------------------------------------

获得buf之后,我令其按字节输出到debugview中。然后装好驱动,开始实验
打开debugview和etherpeek,在命令行中输入"ping 1.0.0.1",etherpeek中显示一个ARP报文,而debugview中也截获一个长度为42字节的buffer,我一直认为这个42字节的buffer应该是ARP报文,因为我每次一ping陌生地址就有它,而且总是与etherpeek中的arp报文同时出现,长度上也没有问题(14+28),但是其中的内容却完全不一样。用ARP报文格式来解析完全不对。

------------------------------------------------我是分割线---------------------------------------------------

这是42个字节的debugview报文
20:70:af:ff:1c:2c:23:81:64:f7:12:f8:c:3b:e0:f7:20:70:af:ff:6c:f7:12:f8:b8:43:9f:ff:10:3f:2d:81:3:1:0:0:30:3f:2d:81:98:f7
这是由etherpeek获取的MAC头加上ARP报文
FF FF FF FF FF FF 00 0C 29 DE 2B F8 00 01 08 00 06 04 00 01 00 0C 29 DE 2B F8 C0 A8 01 86 00 00 00 00 00 00 C0 A8 01 01
显然两者是不同的。debugview截获的报文中,没有广播地址,没有6字节全零。这不对。

---------------------------------------------我是分割线----------------------------------------------------
我也尝试过截获其他报文比如ICMP等,结果也都不对。但是在收取过程中截获,也就是在OnReceive()中使用却是正确的。这是为什么呢?
恳请高手指点。
PS:
编程环境:VC++6.0
实验环境:windows xp sp1 虚拟机
qjlgf
驱动牛犊
驱动牛犊
  • 注册日期2008-01-12
  • 最后登录2009-09-16
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-29 18:37
DriverStudio 3.1 中,对 TCP/IP 协议的数据结构定义有误( TCP 包头长度的计算方法不正确),虽不影响程序的正常编译和运行,但若在设计更完善的 TCP/IP 封包的截获程序,将会造成难以测试发现的漏包现象。
zhanSL
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2010-07-13
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望273点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-30 11:30
最好在ddk 中passthru修改
farawayzheng
驱动牛犊
驱动牛犊
  • 注册日期2007-10-30
  • 最后登录2010-03-06
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-02-07 15:26
Buf能直接转成unsigned char*来用吗? 我觉得应该先获得Buf的VirtualAddress才能用吧
游客

返回顶部