关于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的模式,这样,即降低了风险程序的稳定性也提高了,同时也好向领导交差了.
同时增加了一个叫兼容层的东西 , 简单来说,就是由一些钩子处理程序,目的是为了兼容老程序在新系统上运行.
更简单的说法,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的模式,这样,即降低了风险程序的稳定性也提高了,同时也好向领导交差了.
相关文章推荐
- 关于window10和ubuntu16.04系统时间错乱的问题
- 关于Ubuntu”系统的网络服务与此版本的网络管理器不兼容“问题的解决方案
- 关于在window10环境下配置Tomcat7.x首先遇到的问题
- 关于event 和 window.event问题及浏览器兼容问题
- window10系统的电脑有时候搜索不到UDP广播的问题
- 关于Qt程序不兼容xp系统的问题
- 关于QT应用在XP系统上兼容运行的问题
- 关于lua字节码在32位和64位系统上不兼容的问题
- 关于Windows 7的64位系统不兼容某些控件的问题
- 关于Windows7/8/10系统中Altera USB-Blaster驱动的安装问题
- 关于Ubuntu”系统的网络服务与此版本的网络管理器不兼容“问题解决方案
- 关于Android兼容7.0系统版本的问题
- 关于WebView不同版本系统不兼容的问题
- 关于Window 7 系统磁盘无法显示的问题的解决办法
- 关于Xcode8.1 / iOS10+ 真机测试系统打印或者宏定义打印不显示问题
- window10系统安装SQL数据库和小蝴蝶的问题
- 关于Ubuntu 64位系统的32位兼容库问题
- 关于在微信内置的浏览器中window.location.href 跳转不兼容问题
- MarkdownPad 2在Window10系统下解决无法使用的问题
- 解决Window10系统下Node安装报错问题