gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:4090回复: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
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-27 15:57
我的代码可以成功hook ndis.sys,可以正常截获包,但是我的问题是有时候机器启动后,不能hook ndis.sys,需要重新禁用启动网卡才可以?不知为何?

 


很显然....你就只是挂接了NDIS_PROTOCOL_BLOCK ...而没有挂接NDIS_OPEN_BLOCK
所以...你的要重新禁用启动网卡才可以.....
在重新禁用启动网卡时....会调用BIND函数...而在这个函数里HOOK REVC等这些函数就会成功....

gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-23 15:44
显然,费尔采用用是第二种方法,也就是俄罗斯人搞出来的东东。
如果,不能够挂接,可能是与某些程序有冲突,具体的是哪个程序我也不太清楚。
我建议最好使用第二种方法。
daviswjk
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分334分
  • 威望64点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-22 14:44
费尔不是第一种吧
一切随风!
endicking
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2004-06-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-08 00:47
费尔是第一种方法吗?
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-20 09:15
我的代码可以成功hook ndis.sys,可以正常截获包,但是我的问题是有时候机器启动后,不能hook ndis.sys,需要重新禁用启动网卡才可以?不知为何?

second
zxcasd
驱动牛犊
驱动牛犊
  • 注册日期2001-06-14
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-18 17:19
楼上的朋友,你好!

我看过驱动启动的顺序,首先是NDIS.sys,然后是我的驱动,然后是tcpip.sys。也就是说,我的驱动介于ndis.sys与 tcpip.sys之间。正因为如此,我才倍感不解。

不知道你是否成功的使用过gjp的方法,能否让我借鉴借鉴。

 

这个框架不是有么,在坛子上搜一把就可以了。从用户的角度看gjp的方法比较好,做出来的东东安装使用都很简单,不需要reboot
死了都要爱......
gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-18 13:43
楼上的朋友,你好!

我看过驱动启动的顺序,首先是NDIS.sys,然后是我的驱动,然后是tcpip.sys。也就是说,我的驱动介于ndis.sys与 tcpip.sys之间。正因为如此,我才倍感不解。

不知道你是否成功的使用过gjp的方法,能否让我借鉴借鉴。

start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-16 16:24
说了半天,楼上你用的是那中方式的hook,如果用的是ndis hook协议的方法,GJP的方法的话,不可能出现你的情况。

如果采用ndis hook技术是hook Ndis.sys驱动的化,你一定需要控制启动顺序,启动顺序一定正确才可以。

你重新启动ADSL,正好重新进行了hook,所以你能成功。




second
gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-16 16:17
楼上的朋友,你好!

我早就知道这两种方法的差异,但是我问题还是没有解决。

从各位朋友回复中,我没发现对解决此问题有帮助的线索。

不知道,你能否提供点帮助。

当然,我也在想办法。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-16 07:26
 谢谢!

  费尔采用的第一种方法,没错。
  在http://ntdev.h1.ru/ndis_fw.html上,还有一个例子,我放在附件里。
  另外,GJP对NDIS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK没给详细的说明,却针对不同的NDIS版本采用不同的偏移量,我想他是清楚这结构的。
  


现在没有什么问题了吧。。。

[编辑 -  4/16/04 by  cyf_rich]
gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于: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
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-15 13:19
楼上的朋友,你好。
能否讲讲细节,我现在很困惑。
qq:120360585


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

gtxai_2003s
驱动牛犊
驱动牛犊
  • 注册日期2003-08-14
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-15 12:34
楼上的朋友,你好。
能否讲讲细节,我现在很困惑。
qq:120360585
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于: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分
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-14 19:22
呵呵。。。有没有分给呀。。。给点吧。。意思意思吧。。我的分没有了。。。
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于: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里???你找找以前的帖子吧。。有说明的。。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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
....
=================================
cyf_rich
驱动牛犊
驱动牛犊
  • 注册日期2002-03-14
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-04-14 15:11
那个对象就是MINIPORTHANDLE吧,除此之外没有第4处有SENDCOPMLETE了,头两处都试过了,不行,第3出没时间试了,第4处找不到。2KDDK的OPEN_BLOCK不包含这个成员,但在XPDDK的OPEN_BLOCK的定义里有。


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

反正就是MacBindingHandle这个里的sendcomplete。。。还有2KDDK里有ndis_open_block的定义。。。你仔细找了吗??
上一页
游客

返回顶部