robbielee
驱动牛犊
驱动牛犊
  • 注册日期2007-07-31
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:2252回复:4

截获数据包,在运输层协议头后加入自己的数据……,我的方案是否行得通,谢过了!增加ndis体系结构图)

楼主#
更多 发布于:2007-08-23 14:24
ndis 体系图如下:
 

图片:lee.JPG


 

我的项目描述:
图示:
正常情况:PC1-------------------------Internet ----------------------PC2

我要做的情况 PC1-------------------------Internet ----------------------PC2
                                                                        |
                                                                        |
                                                             在internet放入第三台pc3

在PC1截获特定应用程序的数据包,然后在运输层协议头之后在原始数据之前加入自己的数据;
更改目的地址,使之发往pc3,然后在pc3上再更改目的地址,发往pc2;
到达PC2PC2再去掉加入的数据段还原数据包然后走正常流程交给上层应用程序。

我想到的需要做的是:
1、截获数据包;
2、增加自己的数据;
3、修改运输层协议头数据长度字段跟checksum
4、修改目的地址;(可能需要修改相应的mac地址)
5、修改ip头checksum和数据包字段长度字段

我是windows驱动方面的新手,这几天看了些资料,能想到的方案如下,如果幼稚请大家不吝赐教,谢谢!
(用户模式的方案就不说了,不太合适这个项目,这里说内核模式的方案)

1、TDI filter
这里在ndis的上面,应用来的数据没有经过tcp/ip协议栈,是不是原始数据包?(还是已经做了进一步的封装)按理说应该事可以在这之前加入自己的数据段的,还无须另外考虑增加数据以后的分片分片问题;但是看到网上有牛人说在这层修改数据还是可行的,但是做数据增加难度很大。不知道是不是这样?? 请知情者赐教!

2、ndis中间层驱动

这里应该事什么都可以做,但是考虑到Nat和pppoe都是在这一层,不知道是不是会带来意想不到的问题

3、NDIS-Hooking Filter Driver
感觉这种方法是最合适的。这里数据可以随意改。又不会有跟nat或者pppoe冲突的可能。

另外请教一个问题:
1、tdi交给tcp/ip dirver的数据包是不是原始数据包?从这张图看来应该事原始数据包,经过tcpip后增加运输层头和ip头(是这样的吗?)

2、如果采用NDIS-Hooking Filter Driver的方式从上层的数据包是不是已经加了以太头?按我的分析应该事还没有加以太头的,请高人指点!

以上可能纰漏百出,请高人指点一二!呵呵!


是否有类似的项目,在坛子里找了下发现有ndis-hook的源代码,大家觉得是否有帮助?时间比较紧,不想走太多弯路!!谢谢了!
numenshane
驱动牛犊
驱动牛犊
  • 注册日期2007-07-12
  • 最后登录2009-09-28
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望37点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-23 17:20
如果是用内核级驱动,在可以在NDIS中间层实现数据包的截获和修改(如目的地址)
NDIS-Hooking Filter Driver 也可以,怎么截获数据包,先把自己修改的中间层驱动添加到NDIS框架
在编写应用程序截获包进行调试,先这样做吧,我也才研究这2个月,我还没有实现数据包的截获,有过拭目以待,
gsasd fs agds sadgsa asfdas df
dahubaobao
驱动牛犊
驱动牛犊
  • 注册日期2004-09-25
  • 最后登录2012-03-14
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-23 19:36
数据包被修改后仅仅重新计算checksum是不行的
你不能忽略TCP的SEQ和ACK,具体去看TCP协议把!
robbielee
驱动牛犊
驱动牛犊
  • 注册日期2007-07-31
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-23 20:15
多谢楼上!
可是没想明白加入数据以后跟SEQ,ACK有关系吗?
对tcp而言,SEQ跟ack只是对数据包的收到与否进行一些保证吧
检查seq和ack的时候有什么特殊的流程或者算法需要对整个数据包内容进行校验吗?

因为tcp/ip而言它只是负责把上层传来的数据包发送出去吧?

请指教,谢!
dahubaobao
驱动牛犊
驱动牛犊
  • 注册日期2004-09-25
  • 最后登录2012-03-14
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-30 15:43
“对tcp而言,SEQ跟ack只是对数据包的收到与否进行一些保证吧”

呵呵 既然你知道这个  那SEQ和ACK是靠什么来进行保证的呢?
就是靠数据包的大小! 你插入数据,只要改变了原数据包的大小,
那SEQ和ACK就需要你来进行同步,否则传到TCP/IP协议栈后发
现SEQ和ACK不准确,就会要求重传的。

你要完成的这个项目,我建议多去看看协议,而不是把注意力放在
NDIS,因为Passthru已经是一个很完整的模板了,你要关心的只
是怎么处理数据包,而处理数据包的依据就是协议!
游客

返回顶部