kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
阅读:2487回复:15

ndis层如何追加数据?

楼主#
更多 发布于:2008-01-22 15:43
我的需求是在ndis里把包拦下来后,在包的某个地方加上16字节的内容,用来表示该包是我们自已的包,这个技术哪位朋友做过?
顺便请教另一外问题,tdi怎么和ndis结合来控制哪些进程是可信的,哪些是不可信的.
如果不方便提供详细资料,只要能给点思路就好,先谢了.
bbs.80dnst.com -- 驱动/逆向
linkin__park
驱动牛犊
驱动牛犊
  • 注册日期2006-03-12
  • 最后登录2009-09-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-23 09:27
首先你追加的是什么包,对IP,UDP包做处理还OK,对TCP包做修改的话就有点复杂,那会影响到TCP连接状态,搞不对一点连接就断了。
另外,看你的需求是需要对应用程序透明,发送数据包的时候你的驱动加上几个字节,然后接收的时候你再改改,还是挺罗嗦的。

另外,对于发送数据包来说,NDIS是可以获取进程ID的,接收数据不行,但如果是TCP,UDP,可以提取出数据包IP端口,再问一下TDI,信息应该足够了。
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-23 10:53
就是所有应用程序通过winsock发送的数据包,我都要拦下来,能让它通过的我要加上自已的标记,这样接收的服务器收到后才知道是我发的包,目前要追加的长度是16字节,加在哪里我也没底.

别外楼上朋友说发送数据包的时候能获取进程PID?你怎么获取的?不是过了协议栈后获取的都不准确的吗?还有怎么问TDI啊.
bbs.80dnst.com -- 驱动/逆向
linkin__park
驱动牛犊
驱动牛犊
  • 注册日期2006-03-12
  • 最后登录2009-09-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于: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从一开始就跟踪端口创建,看需求了。
dfbb7788
驱动牛犊
驱动牛犊
  • 注册日期2007-07-07
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望106点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-23 11:52
用不着这么复杂,你可以把所有的包都加个ip头,然后解密,建议你看下ipsec的实现
linkin__park
驱动牛犊
驱动牛犊
  • 注册日期2006-03-12
  • 最后登录2009-09-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-01-23 12:00
就看在哪一层做了,楼上的说的对,如果是做标记什么的在IP层做就方便多了。
我想的是对应用程序透明的进行数据包内容的修改,原有连接保持正常工作,只是换掉通信内容。呵呵。
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-01-24 10:47
感谢回复的朋友,能不能把问题说的更详细一点。
我要实现的效果就是加上自已16字节的标记,
最好就是我加上标记后,对方收到只要验一下标记就好了,其它东西和原来一样,没有任何影响。加在哪里,怎么加,当然是越简单越好了
就像楼上朋友说的,原有连接保持正常工作,只是换掉通信内容。
不过我就是不太明白,是在MPSendPackets里加一个自已的MyBuffer在MyPacket最后,还是在已经解析出整个以太网帧结构后,再来追加数据。
bbs.80dnst.com -- 驱动/逆向
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
7楼#
发布于:2008-01-24 20:50
简单,可以在ip后面加入自己头,然后修改ip的协议位。同时实现自己头的四层协议,去掉包头,重新入站就可以。可以参考gre/ipip协议即可。
走走看看开源好 Solaris vs Linux
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-01-25 14:13
你们说的简单的问题我都觉得有点难,以前没做过,不过我查资料看来,似乎
ipsec的AH协议能实现我要的效果,就是不知道哪个最方便。
bbs.80dnst.com -- 驱动/逆向
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
9楼#
发布于:2008-01-25 15:30
gre协议最适合你。这孩子不听话哦
走走看看开源好 Solaris vs Linux
easymark
驱动牛犊
驱动牛犊
  • 注册日期2008-01-16
  • 最后登录2008-06-05
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-01-26 08:07

图片:TCP_header_option.JPG


加信息到TCP 包头是可行的。
我利用Passthrou的源代码,把ABCDEFGHIJKMN加入到包头的option里面的(tcp header option )。它的好处是不影响接受方收包,只有用抓包工具才能发现。需要注意的是校验和以及内存申请、释放问题。附图为截获的包。至于能否加信息到UDP包头,我没有研究。

顺便说说我的问题,希望得到指点。
就是,加入ABCDEFGHIJKMN之类是没有意义的,我是想把发包者的username加进去。
关于如何得到username,我从网络上找到的例子(TDI)都没有试通。
请指点迷津。
dfbb7788
驱动牛犊
驱动牛犊
  • 注册日期2007-07-07
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望106点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
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内核函数的时候篮屏)。
这些信息应该够你用的了。。。
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-01-29 10:25
我们可能用proto51,我们目前不需要加密功能哦。
不过你的方法也很好,我会考虑的,谢了。
bbs.80dnst.com -- 驱动/逆向
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
13楼#
发布于:2008-04-21 08:29
谢谢linkin__park,关于NdisSend的论述,我测试了一下windows2000以及windows2003,果然如此!! 一语道破天机啊
dzhdiv
驱动牛犊
驱动牛犊
  • 注册日期2008-04-21
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
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.
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
15楼#
发布于:2008-04-21 21:45
真傻!楼上的基本就没有听懂我在说什么,NdisSend Irql 可以在PASSIVE_LEVEL上运行,但是NdisReceive Irql都是在DPC级别运行!
游客

返回顶部