项目需要,研究了一个礼拜,防止全局钩子注入的功能基本实现。今天偶然在网路上搜索相关主题,发现“看雪论坛”有前辈早就讨论过这个问题,且提出了解决方案,思路与在下不谋而合。不过据我的分析,该前辈的解决方案还有些缺陷。至少应该从以下角度改进:
1、当全局钩子的LoadLibraryExW调用是通过其他版本的LoadLibrary转发时,必须进行一层堆栈回溯,取得更外面一层的函数返回地址;
2、系统的“uxtheme.dll”和“msctf.dll”会设置全局钩子,因此在LoadLibraryExW中对这两个DLL要放行;
3、一些非全局钩子的DLL也会通过USER32调用LoadLibraryExW,因此必须通过判断第三个参数进行区分。如果第三个参数为8,代表这是钩子;否则不是。这是通过观察而来的,可能不够精确。