gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:4088回复:29

关于NDIS HOOK

楼主#
更多 发布于:2004-04-13 11:27
各位好!

遇一怪。

我用NDIS HOOK技术编写了一个防火墙的程序。
不能够正常地挂接Tcpip.sys的SendHandler,但是如果我使用ADSL拨号后,就能够正确地挂接。
我的系统为2k,ndis5.0,ADSL的拨号PPOE注册的协议为3.0,Tcpip.sys注册的协议好象是4.0。
我怀疑是NIDS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK 的版本使用不当。

望各位指点!
谢谢。

特别希望得到老胡的点拨,谢谢。


最新喜欢:

sourensouren
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-13 14:18
我也遇到问题,关注,你能说说你的hook驱动的注册表内容吗
second
gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-13 15:55
我没有在写注册表,直接HOOK nis的函数就可以了。
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-13 16:34
比如ndis.sys myhookndis.sys tcpip.sys ,你怎么保证这样的启动顺序呢? 我如果在注册表中,可以通过系统的启动顺序来控制。

那你的hook驱动的启动顺序如何控制呢?
second
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-13 18:50
NIDS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK

这里所指的一般是NDIS的版本。而不是协议版本这点要说清楚。。。。不知道你是怎么HOOK。。是HOOK NDIS。SYS呢?
还是动态HOOK 协议呢???。。。。你HOOK NDIS_OPEN_BLOCK里的SENDHANDLE试试。。。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-13 18:57
比如ndis.sys myhookndis.sys tcpip.sys ,你怎么保证这样的启动顺序呢? 我如果在注册表中,可以通过系统的启动顺序来控制。

那你的hook驱动的启动顺序如何控制呢?
 



控制启动顺序。。。。还是采用动态HOOK 协议吧。。。这个。。。不需要控制启动顺序。。。
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-14 09:14
楼上,您好!
   动态hook协议怎么理解,实现的思路?
second
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-14 10:16
楼上,您好!
   动态hook协议怎么理解,实现的思路?  


SORRY...我不会表达。。我的意思就是HOOK协议。。。。采用注册一个新协议来HOOK其它的协议链。。。。。。这样的话。。。HOOK不需要重新启动。。可以动态的进行HOOK和UNHOK。。。而不是采用HOOK NDIS的PE结构。。。。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-14 10:45
[quote]楼上,您好!
   动态hook协议怎么理解,实现的思路?  


SORRY...我不会表达。。我的意思就是HOOK协议。。。。采用注册一个新协议来HOOK其它的协议链。。。。。。这样的话。。。HOOK不需要重新启动。。可以动态的进行HOOK和UNHOK。。。而不是采用HOOK NDIS的PE结构。。。。 [/quote]
这是GJP的方法,请问,你如何HOOK到SendComplete和TransferDataComplete?XPDDK的OPEN_BLOCK和2K的有差别,是否在MINIPORTHANDLE里,我不方便试。2KDDK的OPEN_BLOCK没有MINIPORTHANDLE。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-14 12:37
[quote][quote]楼上,您好!
   动态hook协议怎么理解,实现的思路?  


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]
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-14 13:07
那个对象就是MINIPORTHANDLE吧,除此之外没有第4处有SENDCOPMLETE了,头两处都试过了,不行,第3出没时间试了,第4处找不到。2KDDK的OPEN_BLOCK不包含这个成员,但在XPDDK的OPEN_BLOCK的定义里有。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-14 15:11
那个对象就是MINIPORTHANDLE吧,除此之外没有第4处有SENDCOPMLETE了,头两处都试过了,不行,第3出没时间试了,第4处找不到。2KDDK的OPEN_BLOCK不包含这个成员,但在XPDDK的OPEN_BLOCK的定义里有。


MINIPORTHANDLE???是指的什么呢??

反正就是MacBindingHandle这个里的sendcomplete。。。还有2KDDK里有ndis_open_block的定义。。。你仔细找了吗??
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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
....
=================================
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-14 19:16
我没说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
....
=================================


哦。。。原来是AdapterHandle呀。。。呵呵。。。呵呵。。。。我没有用过这个结构。。。MacBindingHandle其实也是_ndis_open_block结构。。。。。这么说明白了吧。。。。为什么会在MacBindingHandle里???你找找以前的帖子吧。。有说明的。。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-04-14 19:22
呵呵。。。有没有分给呀。。。给点吧。。意思意思吧。。我的分没有了。。。
gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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结构。
  
   望大家再点拨,点拨。
  
   谢谢!





cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-04-15 07:33
谢谢各位!

  虽然大家争论了这么多,我觉得还是没有解决我想解决的问题。或许是我的问题不清楚吧,我再说说。

采用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结构。
  
   望大家再点拨,点拨。
  
   谢谢!





 



哎。。。怎么说呢???其实两种方法我都已经做过了。。。。
其实两种的方法都差不多。。。。。只不过相对第一种难了一点
而且第一种需要判别NDIS_PROTOCOL_BLOCK 的偏移量。。。而且第一种相对来说要做的判断相对也更多一些。。。。
gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-04-15 12:34
楼上的朋友,你好。
能否讲讲细节,我现在很困惑。
qq:120360585
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-04-15 13:19
楼上的朋友,你好。
能否讲讲细节,我现在很困惑。
qq:120360585


怎么说呢???我也不知道应该怎么说起好。。。让我好好整理一下吧。。。你说的两种方法。。。最具代表性的就是
费尔的原代码和GJP的原代码。。。

gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-04-15 13:40
  谢谢!

  费尔采用的第一种方法,没错。
  在http://ntdev.h1.ru/ndis_fw.html上,还有一个例子,我放在附件里。
  另外,GJP对NDIS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK没给详细的说明,却针对不同的NDIS版本采用不同的偏移量,我想他是清楚这结构的。
  
附件名称/大小 下载次数 最后更新
2004-04-15_ndis_fw.rar (75KB)  154
上一页
游客

返回顶部