阅读:2487回复:15
ndis层如何追加数据?
我的需求是在ndis里把包拦下来后,在包的某个地方加上16字节的内容,用来表示该包是我们自已的包,这个技术哪位朋友做过?
顺便请教另一外问题,tdi怎么和ndis结合来控制哪些进程是可信的,哪些是不可信的. 如果不方便提供详细资料,只要能给点思路就好,先谢了. |
|
|
沙发#
发布于:2008-01-23 09:27
首先你追加的是什么包,对IP,UDP包做处理还OK,对TCP包做修改的话就有点复杂,那会影响到TCP连接状态,搞不对一点连接就断了。
另外,看你的需求是需要对应用程序透明,发送数据包的时候你的驱动加上几个字节,然后接收的时候你再改改,还是挺罗嗦的。 另外,对于发送数据包来说,NDIS是可以获取进程ID的,接收数据不行,但如果是TCP,UDP,可以提取出数据包IP端口,再问一下TDI,信息应该足够了。 |
|
板凳#
发布于:2008-01-23 10:53
就是所有应用程序通过winsock发送的数据包,我都要拦下来,能让它通过的我要加上自已的标记,这样接收的服务器收到后才知道是我发的包,目前要追加的长度是16字节,加在哪里我也没底.
别外楼上朋友说发送数据包的时候能获取进程PID?你怎么获取的?不是过了协议栈后获取的都不准确的吗?还有怎么问TDI啊. |
|
|
地板#
发布于:2008-01-23 11:22
1、如果你硬要自己追加数据,这很复杂,等于你自己重新构造TCP/UDP包,并需要处理接收到的数据包,比如:服务器收到你发送过去的数据包之后会发送ack确认,这个ack并不是协议栈发送数据后所需要的确认。当然肯定是能做到的,就是复杂一些。
何不直接在tcp/udp协议上再加一次自己的认证流程呢? 2、是否能取进程ID,如果用PsGetCurrentProcess,取决于运行线程上下文,虽然说许多文章都提到NDIS层不能取进程ID,但就我个人经验,发送数据的IRP请求是不会被PEND的,总之一句话,你试下就知道了。 3、发送IRP给TDI自己查询,或者HOOK TDI DISPATCH从一开始就跟踪端口创建,看需求了。 |
|
地下室#
发布于:2008-01-23 11:52
用不着这么复杂,你可以把所有的包都加个ip头,然后解密,建议你看下ipsec的实现
|
|
5楼#
发布于:2008-01-23 12:00
就看在哪一层做了,楼上的说的对,如果是做标记什么的在IP层做就方便多了。
我想的是对应用程序透明的进行数据包内容的修改,原有连接保持正常工作,只是换掉通信内容。呵呵。 |
|
6楼#
发布于:2008-01-24 10:47
感谢回复的朋友,能不能把问题说的更详细一点。
我要实现的效果就是加上自已16字节的标记, 最好就是我加上标记后,对方收到只要验一下标记就好了,其它东西和原来一样,没有任何影响。加在哪里,怎么加,当然是越简单越好了 就像楼上朋友说的,原有连接保持正常工作,只是换掉通信内容。 不过我就是不太明白,是在MPSendPackets里加一个自已的MyBuffer在MyPacket最后,还是在已经解析出整个以太网帧结构后,再来追加数据。 |
|
|
7楼#
发布于:2008-01-24 20:50
简单,可以在ip后面加入自己头,然后修改ip的协议位。同时实现自己头的四层协议,去掉包头,重新入站就可以。可以参考gre/ipip协议即可。
|
|
|
8楼#
发布于:2008-01-25 14:13
你们说的简单的问题我都觉得有点难,以前没做过,不过我查资料看来,似乎
ipsec的AH协议能实现我要的效果,就是不知道哪个最方便。 |
|
|
9楼#
发布于:2008-01-25 15:30
gre协议最适合你。这孩子不听话哦
|
|
|
10楼#
发布于:2008-01-26 08:07
图片:TCP_header_option.JPG 加信息到TCP 包头是可行的。 我利用Passthrou的源代码,把ABCDEFGHIJKMN加入到包头的option里面的(tcp header option )。它的好处是不影响接受方收包,只有用抓包工具才能发现。需要注意的是校验和以及内存申请、释放问题。附图为截获的包。至于能否加信息到UDP包头,我没有研究。 顺便说说我的问题,希望得到指点。 就是,加入ABCDEFGHIJKMN之类是没有意义的,我是想把发包者的username加进去。 关于如何得到username,我从网络上找到的例子(TDI)都没有试通。 请指点迷津。 |
|
11楼#
发布于:2008-01-29 00:30
给你说个最简单的 把所有的ip包(包括tcp,udp,ftp,ping等),前面加上你自己的ip头(协议可以是50,ipsec协议),ip头后面是esp数据,甚至你可以在加个esp尾(最后面),ip头的目的地址是你的解密网关地址(可用网桥实现,或路由),网关解密后发到后面的服务器,网关对于服务器过来的数据进行加密,发到你的设备上,然后你进行解密。
所有的这一切都可用ndis实现,再加上tdi驱动可以对进程进行过滤,你还可以坐个硬件的usb,在ndis里将原始ip数据交给usb去加解密(小心调用usb内核函数的时候篮屏)。 这些信息应该够你用的了。。。 |
|
12楼#
发布于:2008-01-29 10:25
我们可能用proto51,我们目前不需要加密功能哦。
不过你的方法也很好,我会考虑的,谢了。 |
|
|
13楼#
发布于:2008-04-21 08:29
谢谢linkin__park,关于NdisSend的论述,我测试了一下windows2000以及windows2003,果然如此!! 一语道破天机啊
|
|
14楼#
发布于:2008-04-21 10:40
```
发送IRP给TDI自己查询,或者HOOK TDI DISPATCH从一开始就跟踪端口创建 这点确实很重要的说我的人生感言:It's never too old to learn wow gold .A journey of a thousand miles begins with a maple story mesos single step,and I like lotro gold. |
|
15楼#
发布于:2008-04-21 21:45
真傻!楼上的基本就没有听懂我在说什么,NdisSend Irql 可以在PASSIVE_LEVEL上运行,但是NdisReceive Irql都是在DPC级别运行!
|
|