注册表函数Hook失败

具体表现是,在程序最开始处Hook上RegQueryValueExW,在整个程序运行的过程中,只有一部分调用进行了我自己实现的方法中,而有一部分调用却没有进入。

前前后后猜了很多原因,一开始以为是调用了SHQueryValueEx、RegEnumRegQueryMultipleValues等其他方法,但是使用ApiMonitor却发现调用确实是发生在RegQueryValueExW,但是调用返回的数据却是空。这就奇怪了,因为从程序执行结果上来看,明明是获取到了正确的值。

当时找到合理的解决方案,于是使用了一个临时的也是最土的方案,在模块初始化前RegSetValue保存并修改注册表的值,在模块初始化完成以后,再恢复回原来的注册表值。由于修改的是IE的相关键值,因为被360等各种报。

昨天又用ApiMonitor尝试了一下,突然发现,原来注册表相关函数,竟然在Advapi32.DLL和Kernel32.dll两个系统模块里存在两套实现,如下图:

图1 注册表函数有两套实现

图1中分别显示了对Kernel32(上半部分)和对Advapi32(下半部分)中RegQueryValueExW函数的调用 。

程序里默认使用Detours对函数进行Hook的代码如下:

 

在VS里调试时打开反汇编(Alt+8),单步跟踪,可以看到这样写的结果是,HookRegQueryValueExW函数里调用的其实是位于Advapi32里的_RegQueryValueExWStub@24方法,而该方法内部实现则是调用了Kernel32中的RegQueryValueExW方法。

到此问题原因找到了,只要让上述代码能Hook到Kernel32中函数即可。方法如下:

刚查证了下MSDN,MSDN里写的竟然只有Advapi32,还是实践出真知啊。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值