阅读:4457回复:33
如何Hook函数 NdisMIndicateReceivePacket? 400分请教。
查看ndis.h,发现这个函数其实是个宏定义,实际上是调用网卡HANDLE的PacketIndicateHandler函数,这个函数我在MiniportInitialize的时候已经Hook,可是很不幸的是,我还是拦截不到这个函数的调用,通过分析,发现原来是这个地方在我hook后,本来指向我的函数代码,却不知道在什么时候已经被人串改,换了一个不知道是哪个模块的地址。
400分请教: 1。 这个地址是被什么模块修改的? 2。 修改这个地址的模块用什么API调用修改的? 3。 有什么方法可以在知道这个地址被修改后得到通知? |
|
沙发#
发布于:2002-08-08 13:28
这问题我有点能看懂也,又有这么多分!哇,好棒呀。
待我再看看。 |
|
|
板凳#
发布于:2002-08-08 13:35
恩,我最近没什么空研究,所以要发动大家啊,不过我在写界面,相信下周可以把界面源代码传了上来。
|
|
地板#
发布于:2002-08-08 13:35
是它啦:
VOID NdisMIndicateReceivePacket( IN NDIS_HANDLE MiniportAdapterHandle, IN PPNDIS_PACKET ReceivePackets, IN UINT NumberOfPackets ); 把一个下层的包网上一层driver送。 |
|
|
地下室#
发布于:2002-08-08 13:40
用于多包接收。传过来的是一个包队列指针。
|
|
|
5楼#
发布于:2002-08-08 13:45
调用完这个函数之后,本层将失去对包的控制权。
|
|
|
6楼#
发布于:2002-08-08 13:49
使用NDIS_GET_PACKET_STATUS可以检查何时本层重新获得对包的控制。
|
|
|
7楼#
发布于:2002-08-08 14:25
你说的什么啊?我说的是我拦截不到NdisMIndicateReceivePacket函数啊,跟包有什么关系?看看这段:
#define NdisMIndicateReceivePacket(_H, _P, _N) \\ { \\ (*((PNDIS_MINIPORT_BLOCK)(_H))->PacketIndicateHandler)( \\ _H, \\ _P, \\ _N); \\ } |
|
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改成了我自己的函数,结果发现后来又被人改了,所以我拦截不到外部进来的包,你地明白? |
|
9楼#
发布于:2002-08-08 15:06
windows对底层handler的改动好象很经常,我的2000和xp下的sendhandler就经常被改动,我还一直没找到它是根据什么来改动的,怎么改动的,大家可以一起研究研究!
|
|
10楼#
发布于:2002-08-08 15:09
你可以用softice,bpm设地址断点跟一下,看看在什么情况下做了改动!你能确定这个handler一定会调用吗?也有可能是它有多个receivehandler,不一定调用这个handler,而去调用了其它的handler!
象receivecompletehandler一样,有好几个,不过都是指向一个地址,但系统只会调用一个! |
|
11楼#
发布于:2002-08-08 15:17
用softice跟踪,我想过,不过最近是在紧,还是问问大家吧,看ddk里面关于send和indicate,DDK只说了两种方式,分别针对多包和单包,你说的有多个hanndler,我想是说对应多个协议驱动吧?这个也很正常,毕竟可以装多个不同型号的网卡,通型号的网卡也可以装多个,所以多个handler调用同一个函数我能理解。
|
|
12楼#
发布于:2002-08-08 15:21
To swift:
你说的handler经常会变是什么意思?我现在拦截了比较多的函数,也就只是发现这个handler的地址会变。 |
|
13楼#
发布于:2002-08-08 15:45
根据DDK 文档,这个函数的定义是这样的: 拦截进来的包好象不用截这个函数吧?是不是ptreceive,ptreceivepacket两个就行啦呀? 不知对不对? |
|
|
14楼#
发布于:2002-08-08 16:18
我恨不得捡起一块板砖就拍在老mo头上。
[quote]根据DDK 文档,这个函数的定义是这样的: 拦截进来的包好象不用截这个函数吧?是不是ptreceive,ptreceivepacket两个就行啦呀? 不知对不对? [/quote] |
|
|
15楼#
发布于:2002-08-08 16:36
老mo要负伤了!!!
:D :D :D 嗬嗬! |
|
|
16楼#
发布于:2002-08-08 16:43
老mo赶紧跑,老胡追来了。。。。。
|
|
|
17楼#
发布于:2002-08-08 17:02
我恨不得捡起一块板砖就拍在老mo头上。 老mo要是挨了这一板砖,他可亏大了,他还是得不到我得分,我的要求是怎么hook NdisMIndicateReceivePacket, 不是简单的得到进来的包,hook ptreceive,要做的话我早就做了,之所以不这样做,理由有二: 1。 完全基于网卡拦截数据,可以搞到第一手的资料。 2。 用别人没用过的方法来实现。 大家开拓思想,在想新方。 BTW:鼓励大家一下,再加100分。 |
|
18楼#
发布于:2002-08-08 18:02
我说是用ndis hook protocol的方法做时,在protocol_block,open_block〉都有sendcompletehandler,而open_block里的一个指针所指的结构里面还有一个,开始的时候我只拦截了两个,可是没想到还有一个,最后在gjpland的帮助也才hook了第三个,才搞定的!
还有sendhandler的地址会变,我只知道插拔网线会使它变化,其他什么情况我就不知道了,所以一直想知道! 你看能不能进到你的函数,如果进不到可能就是还有其他的handler,如果进到了,那就是说它在变化,再查找原因! |
|
19楼#
发布于:2002-08-08 18:27
嘿,我用了一种土法,就是hook了ISRHandler,当每次ISRHandler被触发的时候,我检测一下我的回调函数是否被替换,如果是,我重新hook, 这样果然是能拦截到NdisMIndicateReceivePacket,不过这也是否太老土了?:(
哪位还有更科学的招数?给分继续有效。 |
|
上一页
下一页