paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3247回复:23

请高手帮忙,在Ndis中过滤IP包,怎样完整的拦截?

楼主#
更多 发布于:2003-04-08 15:25
小弟的设想是:
  修改NT ddk中passthru的例子,在Ndis层截获IP数据包,主要在PtReceive()例程中完成
在PtReceive() 中提取包头数据(主要是IP地址)传递(共享内存)给应用程序处理理,通过KeSetEvent()通知APP,APP得到数据即IP 地址进行比较看是否允许此包通过, 在此俺是这么控制的:
DeviceIoControl(m_hDevice, IO_SET_HOLD_ALLOW,
NULL,
0,
NULL,
0,
&dwReturn,
NULL);
置IO_SET_HOLD_ALLOW的时候表示允许IP包可通行.
置IO_SET_HOLD_COLSE的时候表示拦截IP包.

在Driver中,MydrvDispatchIoct()根据APP所置的信号IO_SET_HOLD_ALLOW和IO_SET_HOLD_COLSE来更改标志flag,flag为全局量,在PtReceive() 例程中通过一个自定义函数来检测flag标志,如为1则放行,为0则return(NDIS_STATUS_NOT_ACCEPTED).

上述过程小弟已经实现,但发现拦截的数据包不是很完整,例如拦截www.163.com
的时候,通地Dbgprint可以看到拦截成功,用IE上163的时候很久连接不上,但时间稍微长一些又能连通.

小弟的问题是:
1.此方法是否可行?
2.为什么为出现IP包拦截不完整的现象,怎样才能实现完整的数据包拦截?

大家一起讨论,望高手们不吝指教,分不够俺再开一贴给分. :o

最新喜欢:

lsq77lsq77 baoyibao99baoyib...
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-08 21:58
没人理俺呀!是不是小弟说得不清楚??
知之为知之,不知为不知 有错则改之
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-09 09:44
看ndistransferdata的说明,用这个函数来处理不完整的packet

不只是receive,还有receivepacket也是收包的时候用的,不过也可以不要这个函数。在协议注册的时候让这个指针为空。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-09 10:31
为什么不由用户态把规则传给内核态,在内核态完成数据的过虑!

这不是很简单!

通常的PFW就是这样的,除非你想做sniffer
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-09 11:32
为什么不由用户态把规则传给内核态,在内核态完成数据的过虑!

这不是很简单!

通常的PFW就是这样的,除非你想做sniffer

re:swift
我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗?

[编辑 -  4/9/03 by  freeshar]
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-09 11:36
看ndistransferdata的说明,用这个函数来处理不完整的packet

不只是receive,还有receivepacket也是收包的时候用的,不过也可以不要这个函数。在协议注册的时候让这个指针为空。


我在ndistransferdata也做了过滤,但在receivepacket中可以考虑一下。

[编辑 -  4/9/03 by  freeshar]
知之为知之,不知为不知 有错则改之
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-09 14:05
[quote]看ndistransferdata的说明,用这个函数来处理不完整的packet

不只是receive,还有receivepacket也是收包的时候用的,不过也可以不要这个函数。在协议注册的时候让这个指针为空。


我在ndistransferdata也做了过滤,但在receivepacket中可以考虑一下。

[编辑 -  4/9/03 by  freeshar] [/quote]

ndistransfer你怎么过滤的??????

如果调用了这个函数就要到ndistransferdatacomplete里面处理了。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-04-09 15:23
[quote][quote]看ndistransferdata的说明,用这个函数来处理不完整的packet

不只是receive,还有receivepacket也是收包的时候用的,不过也可以不要这个函数。在协议注册的时候让这个指针为空。


我在ndistransferdata也做了过滤,但在receivepacket中可以考虑一下。

[编辑 -  4/9/03 by  freeshar] [/quote]

ndistransfer你怎么过滤的??????

如果调用了这个函数就要到ndistransferdatacomplete里面处理了。 [/quote]
记错了, 是PtTransferDataComplete里面处理.

[编辑 -  4/9/03 by  freeshar]
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-09 15:50
俺这几天在想问题是不是出现在:
简单的说就是APP置IO_SET_HOLD_ALLOW域IO_SET_HOLD_COLSE
时,标志flag是改变了,但如果在PtReceive() 中还未来得及检测flag,flag又被第二个包改变了呢?
也就是说俺不能保证flag置的就是当前的包.
这种情况应该是有的,因为Driver的速度远比APP快得多,更何况APP还要对Driver提交的数据进处理呢?
怎么办呢????
茫然矣!!
 :(

[编辑 -  4/9/03 by  freeshar]
知之为知之,不知为不知 有错则改之
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-04-09 16:27
占用不了多大空间的,没有问题!你可以算一算!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
10楼#
发布于:2003-04-09 16:34
[quote]为什么不由用户态把规则传给内核态,在内核态完成数据的过虑!

这不是很简单!

通常的PFW就是这样的,除非你想做sniffer

re:swift
我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗?

[编辑 -  4/9/03 by  freeshar] [/quote]
你真行,能找到那么多黄色网站:D:D:D:D:D:D:D:D:D
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-04-09 17:12
[quote][quote]为什么不由用户态把规则传给内核态,在内核态完成数据的过虑!

这不是很简单!

通常的PFW就是这样的,除非你想做sniffer

re:swift
我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗?

[编辑 -  4/9/03 by  freeshar] [/quote]
你真行,能找到那么多黄色网站:D:D:D:D:D:D:D:D:D [/quote]
这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能.
俺记得在某防黄产品上自称其库存近10万个过滤的网址.看来其也是吹牛的多.
知之为知之,不知为不知 有错则改之
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-04-09 19:22
[quote][quote][quote]为什么不由用户态把规则传给内核态,在内核态完成数据的过虑!

这不是很简单!

通常的PFW就是这样的,除非你想做sniffer

re:swift
我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗?

[编辑 -  4/9/03 by  freeshar] [/quote]
你真行,能找到那么多黄色网站:D:D:D:D:D:D:D:D:D [/quote]
这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能.
俺记得在某防黄产品上自称其库存近10万个过滤的网址.看来其也是吹牛的多. [/quote]
对此,我只能摇头。你这样的程序,真烂。
我思故我在,脑袋不会坏.
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-04-10 08:15
别无选择,改进,再改进!
还是多谢各位的参与!
知之为知之,不知为不知 有错则改之
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
14楼#
发布于:2003-04-10 10:13
这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能.
俺记得在某防黄产品上自称其库存近10万个过滤的网址.看来其也是吹牛的多.

他有没有加密?要是是明文的话,导出来岂不是????
他的程序再牛,我想也不会删除不了吧?一旦那些地址泄漏出来,他的破程序又不在了,会怎样?
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-04-10 10:26
[quote]这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能.
俺记得在某防黄产品上自称其库存近10万个过滤的网址.看来其也是吹牛的多.

他有没有加密?要是是明文的话,导出来岂不是????
他的程序再牛,我想也不会删除不了吧?一旦那些地址泄漏出来,他的破程序又不在了,会怎样? [/quote]
应该加密.
可以进一步做防止删除本系统文件的保护,如“护花使者”有这样的功能。
知之为知之,不知为不知 有错则改之
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-04-10 17:09
俺这几天在想问题是不是出现在:
简单的说就是APP置IO_SET_HOLD_ALLOW域IO_SET_HOLD_COLSE
时,标志flag是改变了,但如果在PtReceive() 中还未来得及检测flag,flag又被第二个包改变了呢?
也就是说俺不能保证flag置的就是当前的包.
这种情况应该是有的,因为Driver的速度远比APP快得多,更何况APP还要对Driver提交的数据进处理呢?
怎么办呢????
茫然矣!!
 :(

[编辑 -  4/9/03 by  freeshar]


我看后面的内容怎么越来越偏离航线了:)
你可以考虑考虑把FLAG做成临界资源,这样就可以同步每一个包的处理了,第一个没完第二个就不能处理
根据地的兄弟们,团结就是力量
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-04-11 08:41
[quote]俺这几天在想问题是不是出现在:
简单的说就是APP置IO_SET_HOLD_ALLOW域IO_SET_HOLD_COLSE
时,标志flag是改变了,但如果在PtReceive() 中还未来得及检测flag,flag又被第二个包改变了呢?
也就是说俺不能保证flag置的就是当前的包.
这种情况应该是有的,因为Driver的速度远比APP快得多,更何况APP还要对Driver提交的数据进处理呢?
怎么办呢????
茫然矣!!
 :(

[编辑 -  4/9/03 by  freeshar]


我看后面的内容怎么越来越偏离航线了:)
你可以考虑考虑把FLAG做成临界资源,这样就可以同步每一个包的处理了,第一个没完第二个就不能处理 [/quote]
怎么说呢?能具体一点吗?
用自旋锁、提升IRQL或者用Mutex(互斥)???


知之为知之,不知为不知 有错则改之
eqinzm
驱动牛犊
驱动牛犊
  • 注册日期2001-10-18
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2003-05-26 12:26
我现在也遇到这个问题啊
我的规则里面已经把ie过滤掉了
但是ie要过很长时间后还是可以打开网页
我是用ndis hook pe做的
如果我不进行规则比较
直接返回status_success的话
所有网络都是断的
ie也打不开
Hi
eqinzm
驱动牛犊
驱动牛犊
  • 注册日期2001-10-18
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2003-05-27 21:09
up
Hi
上一页
游客

返回顶部