阅读:4088回复: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-04-13 14:18
我也遇到问题,关注,你能说说你的hook驱动的注册表内容吗
|
|
|
板凳#
发布于:2004-04-13 15:55
我没有在写注册表,直接HOOK nis的函数就可以了。
|
|
地板#
发布于:2004-04-13 16:34
比如ndis.sys myhookndis.sys tcpip.sys ,你怎么保证这样的启动顺序呢? 我如果在注册表中,可以通过系统的启动顺序来控制。
那你的hook驱动的启动顺序如何控制呢? |
|
|
地下室#
发布于:2004-04-13 18:50
NIDS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK
这里所指的一般是NDIS的版本。而不是协议版本这点要说清楚。。。。不知道你是怎么HOOK。。是HOOK NDIS。SYS呢? 还是动态HOOK 协议呢???。。。。你HOOK NDIS_OPEN_BLOCK里的SENDHANDLE试试。。。 |
|
5楼#
发布于:2004-04-13 18:57
比如ndis.sys myhookndis.sys tcpip.sys ,你怎么保证这样的启动顺序呢? 我如果在注册表中,可以通过系统的启动顺序来控制。 控制启动顺序。。。。还是采用动态HOOK 协议吧。。。这个。。。不需要控制启动顺序。。。 |
|
6楼#
发布于:2004-04-14 09:14
楼上,您好!
动态hook协议怎么理解,实现的思路? |
|
|
7楼#
发布于:2004-04-14 10:16
楼上,您好! SORRY...我不会表达。。我的意思就是HOOK协议。。。。采用注册一个新协议来HOOK其它的协议链。。。。。。这样的话。。。HOOK不需要重新启动。。可以动态的进行HOOK和UNHOK。。。而不是采用HOOK NDIS的PE结构。。。。 |
|
8楼#
发布于:2004-04-14 10:45
[quote]楼上,您好! SORRY...我不会表达。。我的意思就是HOOK协议。。。。采用注册一个新协议来HOOK其它的协议链。。。。。。这样的话。。。HOOK不需要重新启动。。可以动态的进行HOOK和UNHOK。。。而不是采用HOOK NDIS的PE结构。。。。 [/quote] 这是GJP的方法,请问,你如何HOOK到SendComplete和TransferDataComplete?XPDDK的OPEN_BLOCK和2K的有差别,是否在MINIPORTHANDLE里,我不方便试。2KDDK的OPEN_BLOCK没有MINIPORTHANDLE。 |
|
9楼#
发布于:2004-04-14 12:37
[quote][quote]楼上,您好! SORRY...我不会表达。。我的意思就是HOOK协议。。。。采用注册一个新协议来HOOK其它的协议链。。。。。。这样的话。。。HOOK不需要重新启动。。可以动态的进行HOOK和UNHOK。。。而不是采用HOOK NDIS的PE结构。。。。 [/quote] 这是GJP的方法,请问,你如何HOOK到SendComplete和TransferDataComplete?XPDDK的OPEN_BLOCK和2K的有差别,是否在MINIPORTHANDLE里,我不方便试。2KDDK的OPEN_BLOCK没有MINIPORTHANDLE。 [/quote] 这个的确是GJP的方法 sendcomplete和TRANSFERDATACOMPLETE。。。是在OPEN_BLOCK里的一个对象里,而这个对象里有SENDCOMPLETE。。。。所以要HOOK sendcomplete不能直接HOOK OPEN_BLOCK里的。。。而是要HOOK OPEN_BLOCK里一个对象里的sendcomplete。。SORRY我没有XP。。。没有办法测试。。。呵呵。。我调试的是在2000下的。。。而我很奇怪的就是SENDCOMPLETE可以HOOK到,而且很正常,而我TRANSFERDATACOMPLETE也HOOK到了。。但是我一调用系统原来TRANSFERDATACOMPLETE就会兰评。。。。。。奇怪。。。 呵呵。。。。SORRY。。。(我的原代码不在这台计算机上。。。所以有些记不清楚了。。。等我找到了原代码再具体的说出来。。。。) [编辑 - 4/14/04 by cyf_rich] |
|
10楼#
发布于:2004-04-14 13:07
那个对象就是MINIPORTHANDLE吧,除此之外没有第4处有SENDCOPMLETE了,头两处都试过了,不行,第3出没时间试了,第4处找不到。2KDDK的OPEN_BLOCK不包含这个成员,但在XPDDK的OPEN_BLOCK的定义里有。
|
|
11楼#
发布于:2004-04-14 15:11
那个对象就是MINIPORTHANDLE吧,除此之外没有第4处有SENDCOPMLETE了,头两处都试过了,不行,第3出没时间试了,第4处找不到。2KDDK的OPEN_BLOCK不包含这个成员,但在XPDDK的OPEN_BLOCK的定义里有。 MINIPORTHANDLE???是指的什么呢?? 反正就是MacBindingHandle这个里的sendcomplete。。。还有2KDDK里有ndis_open_block的定义。。。你仔细找了吗?? |
|
12楼#
发布于: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 .... ================================= |
|
13楼#
发布于:2004-04-14 19:16
我没说DDK没有定义_NDIS_OPEN_BLOCK呀,我只是说AdapterHandle在XPDDK里 哦。。。原来是AdapterHandle呀。。。呵呵。。。呵呵。。。。我没有用过这个结构。。。MacBindingHandle其实也是_ndis_open_block结构。。。。。这么说明白了吧。。。。为什么会在MacBindingHandle里???你找找以前的帖子吧。。有说明的。。 |
|
14楼#
发布于:2004-04-14 19:22
呵呵。。。有没有分给呀。。。给点吧。。意思意思吧。。我的分没有了。。。
|
|
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-15 07:33
谢谢各位! 哎。。。怎么说呢???其实两种方法我都已经做过了。。。。 其实两种的方法都差不多。。。。。只不过相对第一种难了一点 而且第一种需要判别NDIS_PROTOCOL_BLOCK 的偏移量。。。而且第一种相对来说要做的判断相对也更多一些。。。。 |
|
17楼#
发布于:2004-04-15 12:34
楼上的朋友,你好。
能否讲讲细节,我现在很困惑。 qq:120360585 |
|
18楼#
发布于:2004-04-15 13:19
楼上的朋友,你好。 怎么说呢???我也不知道应该怎么说起好。。。让我好好整理一下吧。。。你说的两种方法。。。最具代表性的就是 费尔的原代码和GJP的原代码。。。 |
|
19楼#
发布于:2004-04-15 13:40
谢谢!
费尔采用的第一种方法,没错。 在http://ntdev.h1.ru/ndis_fw.html上,还有一个例子,我放在附件里。 另外,GJP对NDIS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK没给详细的说明,却针对不同的NDIS版本采用不同的偏移量,我想他是清楚这结构的。 |
|
|
上一页
下一页