swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1865回复:15

hook sendcomplete为什么第一次不行,第二次可以(50分)

楼主#
更多 发布于:2002-06-24 13:21
在用ndis hook技术的时候,我勾挂出了protocol_block和open_block里的sendcompletehandler(其实这两个block的sendcomplete句柄指的是一个地方),我在DriverEntry里进行的勾挂,用我的函数MySendComplete进行替换,可是不行,我用bpm进行地址跟踪,发现sendcompletehandler的地址已经被激活了,但却并没有进入我自己的MySendComplete函数!

但是当我把网卡“禁止”,再“启动”后,在CloseAdapterComplete和BindAdapter里进行了重新勾挂,就好用了,它运行到了我的MySendComplete里面!

哪位大侠能帮我看看这是怎么回事?谢谢!


[编辑 -  6/24/02 by  swift]

最新喜欢:

flyfoxflyfox znsoftznsoft
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-24 15:42
在用ndis hook技术的时候,我勾挂出了protocol_block和open_block里的sendcompletehandler(其实这两个block的sendcomplete句柄指的是一个地方),我在DriverEntry里进行的勾挂,用我的函数MySendComplete进行替换,可是不行,我用bpm进行地址跟踪,发现sendcompletehandler的地址已经被激活了,但却并没有进入我自己的MySendComplete函数!

但是当我把网卡“禁止”,再“启动”后,在CloseAdapterComplete和BindAdapter里进行了重新勾挂,就好用了,它运行到了我的MySendComplete里面!

哪位大侠能帮我看看这是怎么回事?谢谢!


[编辑 -  6/24/02 by  swift]

原因很简单
在protocolbindadapter里,调用NdisOpenAdapter时,
NDIS会自动缓冲一些HANDLER到macBindingContext里,以便提高效,率,其中包括了所有CompleteHandler
解决方法,要对(PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle.中SendCompleteHandler偏移位置是0x3c(ndis 5)进行勾挂。
我思故我在,脑袋不会坏.
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-24 16:20
gjpland,我用的是注册假协议技术,
在registerprotocol后,bindadapter是不会被调用的,
我如何得到NdisBindingHandler?

还有为何,网卡“禁止”,再“启动”后,重新勾挂,SendComplete就好用了呢?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-24 16:35
gjpland,我用的是注册假协议技术,
在registerprotocol后,bindadapter是不会被调用的,
我如何得到NdisBindingHandler?

还有为何,网卡“禁止”,再“启动”后,重新勾挂,SendComplete就好用了呢?


不是你注册的bindadpater.而是你勾挂的BINDADAPTER里。
NdisBindingHandler 就是当前的ndis_open_block
 网卡禁止,再启动,NDIS会自动从ndis_open_block里把completehandle缓冲到macBindingContext里的。
我思故我在,脑袋不会坏.
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-25 10:48
gjpland,
佩服,实在是佩服,这个结构也给你弄出来了,呵呵!

看来50分给你了!

不过我还有一个问题要请教,就是发送的时候,我用我的函数MySend hook了open_block里的SendHandler,开始时数据包还是走我的MySend,可是发送数据包一段时间后,
在2000下的表现是:数据包依然能发出去,可是好象并没有进入我的MySend,我用softice设断点,拦截不到,不知道数据包是从哪发出去的?是否其他地方还有sendhandler句柄??

在NT下也是发送一段时间后,也不走我的函数MySend,数据包依然能发出去,可是发出去后对端机器并不回应。

nt和2000基本应该差不多,是不是其他的地方或结构里还有SendHandler句柄我没hook出来?大侠请指点!
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-25 10:51
斑竹呀,请教一个问题。NDIS_PROTOCOL_BLOCK在ndis5,的定义哪儿有呀?我怎么找不到呀?
另外,我是不是通过钩挂函数NdisOpenAdapter,得到NdisBindingHandle就够了,还有必要钩挂NdisRegisterProtocol吗?
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-25 10:57
第一个问题我可以回答,就是在ndis.h里面根本就没有ndis_protocol_block的结构定义!
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-25 12:39
那怎么找到他的定义呢?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-25 12:53
gjpland,
佩服,实在是佩服,这个结构也给你弄出来了,呵呵!

看来50分给你了!

不过我还有一个问题要请教,就是发送的时候,我用我的函数MySend hook了open_block里的SendHandler,开始时数据包还是走我的MySend,可是发送数据包一段时间后,
在2000下的表现是:数据包依然能发出去,可是好象并没有进入我的MySend,我用softice设断点,拦截不到,不知道数据包是从哪发出去的?是否其他地方还有sendhandler句柄??

在NT下也是发送一段时间后,也不走我的函数MySend,数据包依然能发出去,可是发出去后对端机器并不回应。

nt和2000基本应该差不多,是不是其他的地方或结构里还有SendHandler句柄我没hook出来?大侠请指点!
 

这种情况主要可能是由于物理网络断开后重新连接后(比如网线拔了再接回后),最好开个定时期去检查OPEN_BLOCK里的SENDHANDLE
我思故我在,脑袋不会坏.
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-25 13:06
你是说open_block被重新初始化了?

可是这期间并没有任何的物理操作呀,
我想是不是其它的地方还有sendhandler,
象receivehandler和receivepackethandler一样,
看资源状况来决定调用哪个?

gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-25 13:20
你是说open_block被重新初始化了?

可是这期间并没有任何的物理操作呀,
我想是不是其它的地方还有sendhandler,
象receivehandler和receivepackethandler一样,
看资源状况来决定调用哪个?

 

你开一个定时器去检查或者在RECEIVER里检查SEND,在SEND里检查RECEIVER是否被重新初始化就行了。
我思故我在,脑袋不会坏.
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-25 13:28
能讲讲原理吗?为什么会这样?

其他函数是否也会被重新初始化吗?

如果send和receive被同时初始化了怎么办?

定时器定成多少比较好?
如果一些函数被重新初始化了,是否会调用一些句柄,
象statushandler,requesthandler or resethandler等...??
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-06-25 13:36
还有当数据包不走我的MySend的时候,open_block里的sendhandler的句柄并没有变化呀?怎么事?
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-06-25 13:42
能讲讲原理吗?为什么会这样?

其他函数是否也会被重新初始化吗?

如果send和receive被同时初始化了怎么办?

定时器定成多少比较好?
如果一些函数被重新初始化了,是否会调用一些句柄,
象statushandler,requesthandler or resethandler等...??

兄弟,你至少要自己先研究一下,看一看有什么办法能解决,你总不能出现了一个问题就来问吧。
HEHE,你要是干脆肯出RMB的话,我帮你做了算了。
我思故我在,脑袋不会坏.
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-06-25 14:10
大哥,我也一直在研究呀,可是时间不等人呀!
项目压的喘不过气来,唉!

您大人有大量,给哦指点指点就行,嘻嘻

如果你有源码,我可以考虑RMB,不过要大头同意才行,呵呵!
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-06-25 17:02
呵呵,可以了!

原来是手误,呵呵,写错一个handler!
游客

返回顶部