fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
阅读:4455回复:33

如何Hook函数 NdisMIndicateReceivePacket? 400分请教。

楼主#
更多 发布于:2002-08-08 13:15
查看ndis.h,发现这个函数其实是个宏定义,实际上是调用网卡HANDLE的PacketIndicateHandler函数,这个函数我在MiniportInitialize的时候已经Hook,可是很不幸的是,我还是拦截不到这个函数的调用,通过分析,发现原来是这个地方在我hook后,本来指向我的函数代码,却不知道在什么时候已经被人串改,换了一个不知道是哪个模块的地址。
400分请教:
  1。 这个地址是被什么模块修改的?
  2。 修改这个地址的模块用什么API调用修改的?
  3。 有什么方法可以在知道这个地址被修改后得到通知?
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-08 13:28
这问题我有点能看懂也,又有这么多分!哇,好棒呀。
待我再看看。
按第一贴的“给分”键,给分。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-08-08 13:35
恩,我最近没什么空研究,所以要发动大家啊,不过我在写界面,相信下周可以把界面源代码传了上来。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-08 13:35
是它啦:
VOID
  NdisMIndicateReceivePacket(
    IN NDIS_HANDLE  MiniportAdapterHandle,
    IN PPNDIS_PACKET  ReceivePackets,
    IN UINT  NumberOfPackets
    );
把一个下层的包网上一层driver送。
按第一贴的“给分”键,给分。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-08 13:40
用于多包接收。传过来的是一个包队列指针。
按第一贴的“给分”键,给分。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-08 13:45
调用完这个函数之后,本层将失去对包的控制权。
按第一贴的“给分”键,给分。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-08 13:49
使用NDIS_GET_PACKET_STATUS可以检查何时本层重新获得对包的控制。
按第一贴的“给分”键,给分。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
7楼#
发布于:2002-08-08 14:25
你说的什么啊?我说的是我拦截不到NdisMIndicateReceivePacket函数啊,跟包有什么关系?看看这段:
#define NdisMIndicateReceivePacket(_H, _P, _N) \\
{ \\
(*((PNDIS_MINIPORT_BLOCK)(_H))->PacketIndicateHandler)( \\
_H, \\
_P, \\
_N); \\
}
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
8楼#
发布于:2002-08-08 14:32
根据DDK 文档,这个函数的定义是这样的:
VOID
  NdisMIndicateReceivePacket(
    IN NDIS_HANDLE  MiniportAdapterHandle,
    IN PPNDIS_PACKET  ReceivePackets,
    IN UINT  NumberOfPackets
    );
那么意思是:MiniportAdapterHandle就是上面宏定义的_H,我在ndis.h里面找,发现NDIS_HANDLE实际上指向的是一个这样的结构:
_NDIS_MINIPORT_BLOCK,也就是PNDIS_MINIPORT_BLOCK,也就是我在拦截MiniportInitialize时,系统传给我的那个MiniportAdapterHandle,我把PacketIndicateHandler改成了我自己的函数,结果发现后来又被人改了,所以我拦截不到外部进来的包,你地明白?
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-08 15:06
windows对底层handler的改动好象很经常,我的2000和xp下的sendhandler就经常被改动,我还一直没找到它是根据什么来改动的,怎么改动的,大家可以一起研究研究!
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-08 15:09
你可以用softice,bpm设地址断点跟一下,看看在什么情况下做了改动!你能确定这个handler一定会调用吗?也有可能是它有多个receivehandler,不一定调用这个handler,而去调用了其它的handler!

象receivecompletehandler一样,有好几个,不过都是指向一个地址,但系统只会调用一个!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2002-08-08 15:17
用softice跟踪,我想过,不过最近是在紧,还是问问大家吧,看ddk里面关于send和indicate,DDK只说了两种方式,分别针对多包和单包,你说的有多个hanndler,我想是说对应多个协议驱动吧?这个也很正常,毕竟可以装多个不同型号的网卡,通型号的网卡也可以装多个,所以多个handler调用同一个函数我能理解。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
12楼#
发布于:2002-08-08 15:21
To swift:
你说的handler经常会变是什么意思?我现在拦截了比较多的函数,也就只是发现这个handler的地址会变。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-08-08 15:45
根据DDK 文档,这个函数的定义是这样的:
VOID
  NdisMIndicateReceivePacket(
    IN NDIS_HANDLE  MiniportAdapterHandle,
    IN PPNDIS_PACKET  ReceivePackets,
    IN UINT  NumberOfPackets
    );
那么意思是:MiniportAdapterHandle就是上面宏定义的_H,我在ndis.h里面找,发现NDIS_HANDLE实际上指向的是一个这样的结构:
_NDIS_MINIPORT_BLOCK,也就是PNDIS_MINIPORT_BLOCK,也就是我在拦截MiniportInitialize时,系统传给我的那个MiniportAdapterHandle,我把PacketIndicateHandler改成了我自己的函数,结果发现后来又被人改了,所以我拦截不到外部进来的包,你地明白?

拦截进来的包好象不用截这个函数吧?是不是ptreceive,ptreceivepacket两个就行啦呀?
不知对不对?

按第一贴的“给分”键,给分。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2002-08-08 16:18
我恨不得捡起一块板砖就拍在老mo头上。

[quote]根据DDK 文档,这个函数的定义是这样的:
VOID
  NdisMIndicateReceivePacket(
    IN NDIS_HANDLE  MiniportAdapterHandle,
    IN PPNDIS_PACKET  ReceivePackets,
    IN UINT  NumberOfPackets
    );
那么意思是:MiniportAdapterHandle就是上面宏定义的_H,我在ndis.h里面找,发现NDIS_HANDLE实际上指向的是一个这样的结构:
_NDIS_MINIPORT_BLOCK,也就是PNDIS_MINIPORT_BLOCK,也就是我在拦截MiniportInitialize时,系统传给我的那个MiniportAdapterHandle,我把PacketIndicateHandler改成了我自己的函数,结果发现后来又被人改了,所以我拦截不到外部进来的包,你地明白?

拦截进来的包好象不用截这个函数吧?是不是ptreceive,ptreceivepacket两个就行啦呀?
不知对不对?

 [/quote]
不再回忆从前,我已经生活在幸福当中。
fenger_li
驱动老牛
驱动老牛
  • 注册日期2002-03-26
  • 最后登录2005-04-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-08 16:36
老mo要负伤了!!!
 :D :D :D
嗬嗬!
有点意思。。。 呵呵!
smallbarrow
驱动小牛
驱动小牛
  • 注册日期2002-06-05
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-08-08 16:43
老mo赶紧跑,老胡追来了。。。。。
嗒嗒的,是那马蹄 是我的心声 别了 一瞬间的花朵
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
17楼#
发布于:2002-08-08 17:02
我恨不得捡起一块板砖就拍在老mo头上。


老mo要是挨了这一板砖,他可亏大了,他还是得不到我得分,我的要求是怎么hook NdisMIndicateReceivePacket, 不是简单的得到进来的包,hook ptreceive,要做的话我早就做了,之所以不这样做,理由有二:
  1。 完全基于网卡拦截数据,可以搞到第一手的资料。
  2。 用别人没用过的方法来实现。

大家开拓思想,在想新方。

BTW:鼓励大家一下,再加100分。
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-08 18:02
我说是用ndis hook protocol的方法做时,在protocol_block,open_block〉都有sendcompletehandler,而open_block里的一个指针所指的结构里面还有一个,开始的时候我只拦截了两个,可是没想到还有一个,最后在gjpland的帮助也才hook了第三个,才搞定的!

还有sendhandler的地址会变,我只知道插拔网线会使它变化,其他什么情况我就不知道了,所以一直想知道!

你看能不能进到你的函数,如果进不到可能就是还有其他的handler,如果进到了,那就是说它在变化,再查找原因!

fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
19楼#
发布于:2002-08-08 18:27
嘿,我用了一种土法,就是hook了ISRHandler,当每次ISRHandler被触发的时候,我检测一下我的回调函数是否被替换,如果是,我重新hook, 这样果然是能拦截到NdisMIndicateReceivePacket,不过这也是否太老土了?:(

哪位还有更科学的招数?给分继续有效。
上一页
游客

返回顶部