黑客内参如何绕过现代Process Hollowing检测机制
Process Hollowing技术简介
Process Hollowing是现代恶意软件常用的一种进程创建技术。一般来说,使用Process Hollowing技术所创建出来的进程在使用任务管理器之类的工具进行查看时,它们看起来是正常的,但是这种进程中包含的所码实际上就是恶意代码。
这种技术可以对运行中的进程进行动态修改,并且整个过程既不用挂起进程,也不需要调用额外的Windows API,即无需调用WriteProcessMemory, QueueUserApc, CreateRemoteThread和SetThreadContext。
近期,黑客内参在GitHub上发布了一款Process Hollowing封装工具(RISCyPacker)。虽然黑客内参没有用当前所有的反病毒产品对本工具进行测试,但这项绕过技术应该是不会被检测到的。黑客内参在本文末尾还给出了一份PoC代码,感兴趣的同学可以通过分析代码来了解其工作机制。
工作机制
目前,绝大多数Process Hollowing技术的工作机制如下:挂起进程,写入远程内存,修改内容(SetThreadContext/CreateRemoteThread/QueueUserAPC),然后恢复进程运行。RISCyPacker技术对之前的ProcessHollowing技术进行了优化,它只需要修改内存内容(NtUnMapViewOfSection/NtMapViewOfSection)即可实现ProcessHollowing。
首先,黑客内参需要确保黑客内参们的线程可以在远程线程被创建之前分配/释放(映射内存)远程可执行内存的内容。如果黑客内参们只能实现一半(例如只能释放内存内容),那么黑客内参们的技术就无法正常工作了,因为线程在创建之后线程的EIP将指向空内容。幸运的是,黑客内参们可以利用线程的优先级和亲和性(Affinity)来帮助黑客内参们实现这项技术:
使用高优先级创建本地线程:
将远程进程的线程优先级设为低优先级:
线程的亲和性设置是必须的,因为多核处理器可能会影响最终设置的进程计划优先级。通过设置不同的优先级,黑客内参们就能够正确地将进程排入执行队列中,并在远程线程访问内存之前对远程内容的内容进行修改。
RISCyPacker的Process Hollowing技术流程图如下所示:
其中,注入的NOP中包含有加载和构建IAT的shellcode,之后这些内容需要注入到目标进程之中。
关于RISCyPacker
在使用这款封装工具时,有几点需要大家注意的。首先,目标进程必须要支持非挂起状态下的注入。有些进程会在你尝试动态注入内容的时候立即停止执行(例如xcopy.exe w/ no arguments),因此黑客内参们就无法对这类进程实现注入了。