阅读:4090回复:29
关于NDIS HOOK
各位好!
遇一怪。 我用NDIS HOOK技术编写了一个防火墙的程序。 不能够正常地挂接Tcpip.sys的SendHandler,但是如果我使用ADSL拨号后,就能够正确地挂接。 我的系统为2k,ndis5.0,ADSL的拨号PPOE注册的协议为3.0,Tcpip.sys注册的协议好象是4.0。 我怀疑是NIDS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK 的版本使用不当。 望各位指点! 谢谢。 特别希望得到老胡的点拨,谢谢。 |
|
最新喜欢:![]() |
沙发#
发布于:2004-06-27 15:57
我的代码可以成功hook ndis.sys,可以正常截获包,但是我的问题是有时候机器启动后,不能hook ndis.sys,需要重新禁用启动网卡才可以?不知为何? 很显然....你就只是挂接了NDIS_PROTOCOL_BLOCK ...而没有挂接NDIS_OPEN_BLOCK 所以...你的要重新禁用启动网卡才可以..... 在重新禁用启动网卡时....会调用BIND函数...而在这个函数里HOOK REVC等这些函数就会成功.... |
|
板凳#
发布于:2004-06-23 15:44
显然,费尔采用用是第二种方法,也就是俄罗斯人搞出来的东东。
如果,不能够挂接,可能是与某些程序有冲突,具体的是哪个程序我也不太清楚。 我建议最好使用第二种方法。 |
|
地板#
发布于:2004-06-22 14:44
费尔不是第一种吧
|
|
|
地下室#
发布于:2004-06-08 00:47
费尔是第一种方法吗?
|
|
5楼#
发布于:2004-04-20 09:15
我的代码可以成功hook ndis.sys,可以正常截获包,但是我的问题是有时候机器启动后,不能hook ndis.sys,需要重新禁用启动网卡才可以?不知为何?
|
|
|
6楼#
发布于:2004-04-18 17:19
楼上的朋友,你好! 这个框架不是有么,在坛子上搜一把就可以了。从用户的角度看gjp的方法比较好,做出来的东东安装使用都很简单,不需要reboot |
|
|
7楼#
发布于:2004-04-18 13:43
楼上的朋友,你好!
我看过驱动启动的顺序,首先是NDIS.sys,然后是我的驱动,然后是tcpip.sys。也就是说,我的驱动介于ndis.sys与 tcpip.sys之间。正因为如此,我才倍感不解。 不知道你是否成功的使用过gjp的方法,能否让我借鉴借鉴。 |
|
8楼#
发布于:2004-04-16 16:24
说了半天,楼上你用的是那中方式的hook,如果用的是ndis hook协议的方法,GJP的方法的话,不可能出现你的情况。
如果采用ndis hook技术是hook Ndis.sys驱动的化,你一定需要控制启动顺序,启动顺序一定正确才可以。 你重新启动ADSL,正好重新进行了hook,所以你能成功。 |
|
|
9楼#
发布于:2004-04-16 16:17
楼上的朋友,你好!
我早就知道这两种方法的差异,但是我问题还是没有解决。 从各位朋友回复中,我没发现对解决此问题有帮助的线索。 不知道,你能否提供点帮助。 当然,我也在想办法。 |
|
10楼#
发布于:2004-04-16 07:26
谢谢! 现在没有什么问题了吧。。。 [编辑 - 4/16/04 by cyf_rich] |
|
11楼#
发布于:2004-04-15 13:40
谢谢!
费尔采用的第一种方法,没错。 在http://ntdev.h1.ru/ndis_fw.html上,还有一个例子,我放在附件里。 另外,GJP对NDIS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK没给详细的说明,却针对不同的NDIS版本采用不同的偏移量,我想他是清楚这结构的。 |
|
|
12楼#
发布于:2004-04-15 13:19
楼上的朋友,你好。 怎么说呢???我也不知道应该怎么说起好。。。让我好好整理一下吧。。。你说的两种方法。。。最具代表性的就是 费尔的原代码和GJP的原代码。。。 |
|
13楼#
发布于:2004-04-15 12:34
楼上的朋友,你好。
能否讲讲细节,我现在很困惑。 qq:120360585 |
|
14楼#
发布于:2004-04-15 07:33
谢谢各位! 哎。。。怎么说呢???其实两种方法我都已经做过了。。。。 其实两种的方法都差不多。。。。。只不过相对第一种难了一点 而且第一种需要判别NDIS_PROTOCOL_BLOCK 的偏移量。。。而且第一种相对来说要做的判断相对也更多一些。。。。 |
|
15楼#
发布于:2004-04-15 01:05
谢谢各位!
虽然大家争论了这么多,我觉得还是没有解决我想解决的问题。或许是我的问题不清楚吧,我再说说。 采用HOOK机制,过滤本机发送出去的数据,总的说来有两种方法: 第一种:老胡的方法。注册假协议然后,根据NdisRegisterProtocol返回的参数NdisProtocolHandle,通过遍历NDIS_PROTOCOL_BLOCK 和NDIS_OPEN_BLOCK来把自己的函数挂接到SendHandler上。 第二种:HOOK ndis.sys的函数,如NdisRegisterProtocol,当要想系统注册协议的时候,就进入挂接的函数,就可以判断是否是你关注的协议,如果是在NdisOpenAdapter中,挂接SendHandler。 两种方法的差异: 第一种方法,能够有效地处理多网卡,但是对驱动程序启动后在注册的协议的过滤,就需要采用其他机制。 第二种方法中,相对的工作量小,但是采用非公开的函数,而且必须判断注册的协议的版本,也就是NDIS_PROTOCOL_CHARACTERISTICS的版本,否则不能够正确判断是否是自己关注的协议。 再说说,他们的共性: 而者都必须完全清楚NDIS_PROTOCOL_BLOCK 和NDIS_OPEN_BLOCK结构。很明显,在98、2k、xp下它们的结构是不同的。而这,就是问题的所在。老胡的文章和代码中,隐约说到了,但是不具有可操作性。 我不清楚的地方就是,在哪个版本的系统系统下,在哪个NDIS的版本下,该采用的NDIS_PROTOCOL_BLOCK 和NDIS_OPEN_BLOCK结构。 望大家再点拨,点拨。 谢谢! |
|
16楼#
发布于:2004-04-14 19:22
呵呵。。。有没有分给呀。。。给点吧。。意思意思吧。。我的分没有了。。。
|
|
17楼#
发布于:2004-04-14 19:16
我没说DDK没有定义_NDIS_OPEN_BLOCK呀,我只是说AdapterHandle在XPDDK里 哦。。。原来是AdapterHandle呀。。。呵呵。。。呵呵。。。。我没有用过这个结构。。。MacBindingHandle其实也是_ndis_open_block结构。。。。。这么说明白了吧。。。。为什么会在MacBindingHandle里???你找找以前的帖子吧。。有说明的。。 |
|
18楼#
发布于:2004-04-14 16:15
我没说DDK没有定义_NDIS_OPEN_BLOCK呀,我只是说AdapterHandle在XPDDK里
被定义为 PNDIS_MINIPORTH_BLOCK MiniPortHandle。 只有在PNDIS_MINIPORTH_BLOCK的结构定义里可以找到 SendCompleteHandle。 如果SendCompleteHandle在MacBindingHandle,而 MacBindingHandle被定义为NDIS_HANDLE,那么SendCompleteHandle的偏移是多少呢? 以下截选自2KDDK: ================================ struct _NDIS_OPEN_BLOCK { PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC NDIS_HANDLE MacBindingHandle; // context when calling MacXX funcs PNDIS_ADAPTER_BLOCK AdapterHandle; // pointer to our adapter PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol .... ================================= |
|
19楼#
发布于:2004-04-14 15:11
那个对象就是MINIPORTHANDLE吧,除此之外没有第4处有SENDCOPMLETE了,头两处都试过了,不行,第3出没时间试了,第4处找不到。2KDDK的OPEN_BLOCK不包含这个成员,但在XPDDK的OPEN_BLOCK的定义里有。 MINIPORTHANDLE???是指的什么呢?? 反正就是MacBindingHandle这个里的sendcomplete。。。还有2KDDK里有ndis_open_block的定义。。。你仔细找了吗?? |
|
上一页
下一页