关于Window7/8/10 兼容层与钩子系统兼容问题

Win7 以来,微软增加了安全性 ..... 此处省略一万字

同时增加了一个叫兼容层的东西 , 简单来说,就是由一些钩子处理程序,目的是为了兼容老程序在新系统上运行.

更简单的说法,WIN7 增加了些新东西,势必导致API的变化,有增加的,也有减少的,也有变化的,那么问题来了,对于API变化的,原来在XP上正常运行的程序,到WIN7上可能就用不了了,为了让操作系统有更好的兼容性,微软做了这个兼容层,改变了原来API的行为.

API兼容层主要由以下库组成


有兴趣的朋友可以看一下 大牛写的文章   http://bbs.pediy.com/showthread.php?t=175483          很详细,很直白,没有套路


接下来聊到的部分只涉及inline Hook API ,由于IAT Hook系统,太多的缺陷,很早之前就准备弃用,迫于仍有大量客户在使用,不得不继续维护,


先来问两个问题:

问题1:怎么知道软件会被加载兼容层

   1) 用工具查呗,推荐PCHunter有免费的,查下进程的模块中,是否有以上DLL即可

    2)用PCHunter查一下,应用层钩子中的进程钩子,    在这里可以发现,兼容层的钩子都是用的IAT钩子


问题2怎么让任意程序都可以加载兼容层

    在程序上单击右键,属性,兼容性,先一个兼容模式就可以了


再来聊聊内联钩子的大致流程

1.先获取CreateFileW的地址 ,  得用GetProcAddress来获取

2.弄个全局变量来记录一个地址,这个地址可以直接调用到真正的CreateFile函数中去 , CreateFile_API , 在我们自己的程序中调用CreateFile_API,即是调用系统API,调用MyCreateFileW即是跳板程序

3.做一个跳板函数 MyCreateFile

4.Hook API ,  宿主程序,会先调用到MyCreateFile->CreateFile_API->KernelBase->Ntdll->ntoskrnl


其中有一个关键点,兼容层会使用IAT钩子Hook,GetProcAddress函数,导致,获取的CreateFileW函数被定位到AcGenral.dll中.同时GetProcAddress也会被定位到AcGenral.dll

这样就引发了一个问题

在存在兼容层的应用程序中,并非所有的API调用都会通过AcGenral.dll,同时也存在直接调用KernelBase::CreateFile的情况,这样必然导致部分调用无法被监控


解决办法:

1.自己写一个GetProcAddress , 这个很容易,  大神已经写好了  http://bbs.pediy.com/showthread.php?t=121226     实际上就是解析PE结构,不过64位需要修改少许代码,见下遍文章

疑问: 大神写的这个可靠吗?     如果只有个另API还好说,如果Hook的API数量非常多,会不会有问题,

如何降低风险

先验证一个问题!  如果我们能够获取到GetProcAddress的API,那么兼容层会不会在这里面做文章

       实验结果:  直接通过GetProcAddress获取的GetProcAddress地址在AcGenral.dll中.

                          但是,通过自己写的GetProcAddress可以获取正确的Kernel32:GetProcAddress的地下.    

        即然,获取到了Kernel32:GetProcAddress函数的地址,那么再通过这个地址去获取其他API理论上应该没问题, 实际上也没问题


小结:这样做之后,只需要通过自己写的MyGetProcAddress获取到Kernel32:GetProcAddress的地址,然后再获取其他API的地址,均采用系统API的模式,这样,即降低了风险程序的稳定性也提高了,同时也好向领导交差了.






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值