您的位置:首页 > 编程语言 > PHP开发

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

2016-11-17 23:23 232 查看
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的模式,这样,即降低了风险程序的稳定性也提高了,同时也好向领导交差了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息