Antivirus User Mode Hook Nowadays
杀软用户模式HOOK(UMH)现状 关于前文R0 Anti Antivirus的一些更详尽的补充内容, 请先看前文 UMH介绍 UMH一般是使用DLL注入技术, 前文提到杀软可以利用Kernel Callback接收到进程创建回调, 如此杀软不必定时刷新进程列表进行注入, 而是可以实时响应. 在实际中杀软并不会对每个程序都进行注入, 有一些判定规则, 比如是否有证书签名等, 各家杀软判断规则不尽相同, 但是证书都是一个重要的参考 UMH检测 关于UMH的检测, 我在实际中测试某不知名杀软时, 发现一个有趣的事情, 使用VS直接进行调试的时候, 杀软无法成功注入DLL, 猜测是VS已经附加了调试器, 其他进程便无法再打开句柄. UMH一般是直接使用JMP指令, 也就是把将API函数入口修改成JMP到杀软自己的DLL中的函数, 然后杀软可以对参数内容进行检测和处理. 代码实现就是获取API函数地址, 然后反汇编该地址查看是否指令是JMP. 想要了解更多: https://www.ired.team/offensive-security/code-injection-process-injection/how-to-hook-windows-api-using-c++ 我这里使用github开源项目进行UMH的检测: https://github.com/Mr-Un1k0d3r/EDRs/blob/main/hook_finder64.exe?raw=true 使用方式如下: hook_finder64.exe C:\windows\system32\ntdll.dll 可以看到, 杀软HOOK了许多API函数, 我这里测试的杀软叫做Vipre UMH现状 为什么这里没有使用卡巴斯基作为演示呢? 因为现在UMH已经被主流杀软抛弃了, 包括卡巴斯基, 360, 火绒, 原因当然很简单, 因为太容易绕过了, 而且有更强大的Kernel Callback 前文验证 之前提到UMH依赖Kernel Callback进行实时响应, 但是没有给出验证过程, 接下来我们一起来验证一下. 既然UMH依赖Kernel Callback, 那么我们把Kernel Callback干掉, UMH也应该失效. 由于Vipre不会注入有签名的程序, 所以我们需要自己写个程序, 观察注入情况. 代码很简单: #include <iostream> int main() { system("pause"); return 0; } 中间让程序停住, 方便我们观察差异....