阅读:1865回复:15
hook sendcomplete为什么第一次不行,第二次可以(50分)
在用ndis hook技术的时候,我勾挂出了protocol_block和open_block里的sendcompletehandler(其实这两个block的sendcomplete句柄指的是一个地方),我在DriverEntry里进行的勾挂,用我的函数MySendComplete进行替换,可是不行,我用bpm进行地址跟踪,发现sendcompletehandler的地址已经被激活了,但却并没有进入我自己的MySendComplete函数!
但是当我把网卡“禁止”,再“启动”后,在CloseAdapterComplete和BindAdapter里进行了重新勾挂,就好用了,它运行到了我的MySendComplete里面! 哪位大侠能帮我看看这是怎么回事?谢谢! [编辑 - 6/24/02 by swift] |
|
沙发#
发布于:2002-06-24 15:42
在用ndis hook技术的时候,我勾挂出了protocol_block和open_block里的sendcompletehandler(其实这两个block的sendcomplete句柄指的是一个地方),我在DriverEntry里进行的勾挂,用我的函数MySendComplete进行替换,可是不行,我用bpm进行地址跟踪,发现sendcompletehandler的地址已经被激活了,但却并没有进入我自己的MySendComplete函数! 原因很简单 在protocolbindadapter里,调用NdisOpenAdapter时, NDIS会自动缓冲一些HANDLER到macBindingContext里,以便提高效,率,其中包括了所有CompleteHandler 解决方法,要对(PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle.中SendCompleteHandler偏移位置是0x3c(ndis 5)进行勾挂。 |
|
|
板凳#
发布于:2002-06-24 16:20
gjpland,我用的是注册假协议技术,
在registerprotocol后,bindadapter是不会被调用的, 我如何得到NdisBindingHandler? 还有为何,网卡“禁止”,再“启动”后,重新勾挂,SendComplete就好用了呢? |
|
地板#
发布于:2002-06-24 16:35
gjpland,我用的是注册假协议技术, 不是你注册的bindadpater.而是你勾挂的BINDADAPTER里。 NdisBindingHandler 就是当前的ndis_open_block 网卡禁止,再启动,NDIS会自动从ndis_open_block里把completehandle缓冲到macBindingContext里的。 |
|
|
地下室#
发布于:2002-06-25 10:48
gjpland,
佩服,实在是佩服,这个结构也给你弄出来了,呵呵! 看来50分给你了! 不过我还有一个问题要请教,就是发送的时候,我用我的函数MySend hook了open_block里的SendHandler,开始时数据包还是走我的MySend,可是发送数据包一段时间后, 在2000下的表现是:数据包依然能发出去,可是好象并没有进入我的MySend,我用softice设断点,拦截不到,不知道数据包是从哪发出去的?是否其他地方还有sendhandler句柄?? 在NT下也是发送一段时间后,也不走我的函数MySend,数据包依然能发出去,可是发出去后对端机器并不回应。 nt和2000基本应该差不多,是不是其他的地方或结构里还有SendHandler句柄我没hook出来?大侠请指点! |
|
5楼#
发布于:2002-06-25 10:51
斑竹呀,请教一个问题。NDIS_PROTOCOL_BLOCK在ndis5,的定义哪儿有呀?我怎么找不到呀?
另外,我是不是通过钩挂函数NdisOpenAdapter,得到NdisBindingHandle就够了,还有必要钩挂NdisRegisterProtocol吗? |
|
6楼#
发布于:2002-06-25 10:57
第一个问题我可以回答,就是在ndis.h里面根本就没有ndis_protocol_block的结构定义!
|
|
7楼#
发布于:2002-06-25 12:39
那怎么找到他的定义呢?
|
|
8楼#
发布于:2002-06-25 12:53
gjpland, 这种情况主要可能是由于物理网络断开后重新连接后(比如网线拔了再接回后),最好开个定时期去检查OPEN_BLOCK里的SENDHANDLE |
|
|
9楼#
发布于:2002-06-25 13:06
你是说open_block被重新初始化了?
可是这期间并没有任何的物理操作呀, 我想是不是其它的地方还有sendhandler, 象receivehandler和receivepackethandler一样, 看资源状况来决定调用哪个? |
|
10楼#
发布于:2002-06-25 13:20
你是说open_block被重新初始化了? 你开一个定时器去检查或者在RECEIVER里检查SEND,在SEND里检查RECEIVER是否被重新初始化就行了。 |
|
|
11楼#
发布于:2002-06-25 13:28
能讲讲原理吗?为什么会这样?
其他函数是否也会被重新初始化吗? 如果send和receive被同时初始化了怎么办? 定时器定成多少比较好? 如果一些函数被重新初始化了,是否会调用一些句柄, 象statushandler,requesthandler or resethandler等...?? |
|
12楼#
发布于:2002-06-25 13:36
还有当数据包不走我的MySend的时候,open_block里的sendhandler的句柄并没有变化呀?怎么事?
|
|
13楼#
发布于:2002-06-25 13:42
能讲讲原理吗?为什么会这样? 兄弟,你至少要自己先研究一下,看一看有什么办法能解决,你总不能出现了一个问题就来问吧。 HEHE,你要是干脆肯出RMB的话,我帮你做了算了。 |
|
|
14楼#
发布于:2002-06-25 14:10
大哥,我也一直在研究呀,可是时间不等人呀!
项目压的喘不过气来,唉! 您大人有大量,给哦指点指点就行,嘻嘻 如果你有源码,我可以考虑RMB,不过要大头同意才行,呵呵! |
|
15楼#
发布于:2002-06-25 17:02
呵呵,可以了!
原来是手误,呵呵,写错一个handler! |
|