阅读:3247回复:23
请高手帮忙,在Ndis中过滤IP包,怎样完整的拦截?
小弟的设想是:
修改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 |
|
|
沙发#
发布于:2003-04-08 21:58
没人理俺呀!是不是小弟说得不清楚??
|
|
|
板凳#
发布于:2003-04-09 09:44
看ndistransferdata的说明,用这个函数来处理不完整的packet
不只是receive,还有receivepacket也是收包的时候用的,不过也可以不要这个函数。在协议注册的时候让这个指针为空。 |
|
|
地板#
发布于:2003-04-09 10:31
为什么不由用户态把规则传给内核态,在内核态完成数据的过虑!
这不是很简单! 通常的PFW就是这样的,除非你想做sniffer |
|
地下室#
发布于:2003-04-09 11:32
为什么不由用户态把规则传给内核态,在内核态完成数据的过虑! re:swift 我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗? [编辑 - 4/9/03 by freeshar] |
|
|
5楼#
发布于:2003-04-09 11:36
看ndistransferdata的说明,用这个函数来处理不完整的packet 我在ndistransferdata也做了过滤,但在receivepacket中可以考虑一下。 [编辑 - 4/9/03 by freeshar] |
|
|
6楼#
发布于:2003-04-09 14:05
[quote]看ndistransferdata的说明,用这个函数来处理不完整的packet 我在ndistransferdata也做了过滤,但在receivepacket中可以考虑一下。 [编辑 - 4/9/03 by freeshar] [/quote] ndistransfer你怎么过滤的?????? 如果调用了这个函数就要到ndistransferdatacomplete里面处理了。 |
|
|
7楼#
发布于:2003-04-09 15:23
[quote][quote]看ndistransferdata的说明,用这个函数来处理不完整的packet 我在ndistransferdata也做了过滤,但在receivepacket中可以考虑一下。 [编辑 - 4/9/03 by freeshar] [/quote] ndistransfer你怎么过滤的?????? 如果调用了这个函数就要到ndistransferdatacomplete里面处理了。 [/quote] 记错了, 是PtTransferDataComplete里面处理. [编辑 - 4/9/03 by freeshar] |
|
|
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] |
|
|
9楼#
发布于:2003-04-09 16:27
占用不了多大空间的,没有问题!你可以算一算!
|
|
10楼#
发布于:2003-04-09 16:34
[quote]为什么不由用户态把规则传给内核态,在内核态完成数据的过虑! re:swift 我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗? [编辑 - 4/9/03 by freeshar] [/quote] 你真行,能找到那么多黄色网站:D:D:D:D:D:D:D:D:D |
|
11楼#
发布于:2003-04-09 17:12
[quote][quote]为什么不由用户态把规则传给内核态,在内核态完成数据的过虑! re:swift 我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗? [编辑 - 4/9/03 by freeshar] [/quote] 你真行,能找到那么多黄色网站:D:D:D:D:D:D:D:D:D [/quote] 这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能. 俺记得在某防黄产品上自称其库存近10万个过滤的网址.看来其也是吹牛的多. |
|
|
12楼#
发布于:2003-04-09 19:22
[quote][quote][quote]为什么不由用户态把规则传给内核态,在内核态完成数据的过虑! re:swift 我也这么想过,但是如果规则库比较大,如一个防黄软件它的规则库里存需过滤的IP地址就有上万个甚至更多,那不是要将所有的规则先存入内核才能过滤。 这样一来事必占用很大的内核空间, 这样能行吗? [编辑 - 4/9/03 by freeshar] [/quote] 你真行,能找到那么多黄色网站:D:D:D:D:D:D:D:D:D [/quote] 这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能. 俺记得在某防黄产品上自称其库存近10万个过滤的网址.看来其也是吹牛的多. [/quote] 对此,我只能摇头。你这样的程序,真烂。 |
|
|
13楼#
发布于:2003-04-10 08:15
别无选择,改进,再改进!
还是多谢各位的参与! |
|
|
14楼#
发布于:2003-04-10 10:13
这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能. 他有没有加密?要是是明文的话,导出来岂不是???? 他的程序再牛,我想也不会删除不了吧?一旦那些地址泄漏出来,他的破程序又不在了,会怎样? |
|
15楼#
发布于:2003-04-10 10:26
[quote]这只是假设,但是规则库应该是可以不断增加的,如果让用户返馈也不是没有可能. 他有没有加密?要是是明文的话,导出来岂不是???? 他的程序再牛,我想也不会删除不了吧?一旦那些地址泄漏出来,他的破程序又不在了,会怎样? [/quote] 应该加密. 可以进一步做防止删除本系统文件的保护,如“护花使者”有这样的功能。 |
|
|
论坛版主
|
16楼#
发布于:2003-04-10 17:09
俺这几天在想问题是不是出现在: 我看后面的内容怎么越来越偏离航线了:) 你可以考虑考虑把FLAG做成临界资源,这样就可以同步每一个包的处理了,第一个没完第二个就不能处理 |
|
17楼#
发布于:2003-04-11 08:41
[quote]俺这几天在想问题是不是出现在: 我看后面的内容怎么越来越偏离航线了:) 你可以考虑考虑把FLAG做成临界资源,这样就可以同步每一个包的处理了,第一个没完第二个就不能处理 [/quote] 怎么说呢?能具体一点吗? 用自旋锁、提升IRQL或者用Mutex(互斥)??? |
|
|
18楼#
发布于:2003-05-26 12:26
我现在也遇到这个问题啊
我的规则里面已经把ie过滤掉了 但是ie要过很长时间后还是可以打开网页 我是用ndis hook pe做的 如果我不进行规则比较 直接返回status_success的话 所有网络都是断的 ie也打不开 |
|
|
19楼#
发布于:2003-05-27 21:09
up
|
|
|
上一页
下一页