最近发现一个程序远程检测另外一个进程中的某个模块的特征,大概分析了一下,能够躲过了,但是还是有些东西不清楚,希望各位高人给点意见。
这个进程通过调用NtQueryVirtualMemory对远程进程的内存空间进行线性检测,没有自己跟进去,但是完全可以猜想到就是根据查询出的结果判断该map是否是属于一个模块的image.知道了这一点其实就可以用很多方法绕过了,比如ring3的HOOK或者ring0的SSDT hook等,我试了一下,完全能够成功。
但是我很想知道他究竟是如何判断出他的黑名单中的模块特征的。最初我猜想他可能会在ring3调用 ReadProcessMemory或者NtReadVirtualMemory,于是我下了ring3钩子,发现没怎么调用,调用的时候已经是找出了黑名单模块,通过这个接口来读取ModuleList获取模块名和模块路径了...我猜想是不是他自己封装了自己的应用层NtReadVirtualMemory(自己推参后直接jmp 到sysenter或者int 2E),如果是的话,我去ring0 Hook NtReadVirtualMemory应该就没有问题了。于是在自己的服务中Hook了NtReadVirtualMemory,结果和 Hook ring3的时候差不多,还是没有找到他读取目标进程某个模块空间中的信息的地方。
各位能不能给我点建议,除了采用NtReadVirtualMemory 这个ring0接口,还有什么方式能够读取远程进程空间的数据啊?
我现在已经准备开始写MmCopyVirtualMemory 的钩子了,希望能HOOK住,但是我直觉应该不是走的这调路,应该还有其他更简单的方法。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)