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

98下NDIS hook, 为什么hook可以成功,系统能Call到我的函数,可是函数返回后就兰屏了呢?

楼主#
更多 发布于:2002-07-30 11:19
我写了个小程序,hook 了ndis.vxd的NdisRegisterProtocol功能,在我的函数里面,我call 回原来的函数,可以看到这些步骤都是成功的,但是在我的函数返回后,系统就兰屏了,我看了PCAUSA的代码,他的调用手法跟我的不一样,但我没有想通他那样做的理由,看了VToolsD里面的hooksvc的例子,好像跟我的也没什么区别。估计问题出在堆栈调整上面,可是不管我的函数定义成__stdcall还是__cdecl,都没什么变化。那位熟悉这个的指点一下。
我的代码如下。

VOID __stdcall
MyNdisRegisterProtocol(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisProtocolHandle,
IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
IN UINT CharacteristicsLength )
{
dprintf( \"MyNdisRegisterProtocol called !\\n\" );
g_OrgNdisRegisterProtocol( Status, NdisProtocolHandle, ProtocolCharacteristics, CharacteristicsLength );
dprintf( \"After called the old routine , and we now ready to exit ....\\n\" );
}

g_OrgNdisRegisterProtocol = Hook_Device_Service( GetVxDServiceOrdinal(NdisRegisterProtocol), MyNdisRegisterProtocol, &ProThunk );
if( g_OrgNdisRegisterProtocol ) {
dprintf( \"Hook success !\\n\" );
}
dprintf( \"After hook !\\n\" );
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
沙发#
发布于:2002-07-30 11:20
分太少,要去换点分来。
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-07-30 12:57
g_OrgNdisRegisterProtocol函数声明为__stdcall还是__cdecl?你可以跟踪一下在调用g_OrgNdisRegisterProtocol之前与之后的堆栈指针ESP是不是相同,如果不同的话,那就有问题了。

[编辑 -  7/30/02 by  xdjm]
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-07-30 13:18
说的有道理阿,
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2002-07-30 14:22
果然是这个问题,搞定了,给分了。
游客

返回顶部