接上文继续探讨
代码注入这种攻击的最简单形式就是强迫进程加载新的 DLL(动态链接库)。传统的检测工具(如Volatility的dlllist或ldrmodules)可以轻松发现这种情况。然而,随着安全工具检测能力的提高,攻击者也在不断进化,开发出了更先进的技术,试图绕过这些检测。
但问题是,无论攻击多么隐蔽,总会留下蛛丝马迹。取证调查的关键就是找到这些线索。
如何检测代码注入
大多数代码注入技术都遵循常见的三步模式。即使是高级变种如反射式DLL注入,也有类似的特征。诀窍在于查看进程的内存结构,尤其是VAD(虚拟地址描述符)树,它记录了所有内存部分。
以下是检测注入代码的步骤:
1.检查内存权限------内存进程中最大的危险信号之一就是具有PAGE_EXECUTE_READWRITE权限的部分。通常情况下,内存区段不应该既可写又可执行--这是一种危险的组合,会允许注入代码被写入和执行。
2.验证内存部分是否映射到文件 ------在Windows系统中,合法代码(DLL、EXE)是从磁盘加载的。如果内存部分是可执行的,但没有映射到文件,那就非常可疑了。
3.确认是否存在可执行代码 ------内存部分看起来可疑并不意味着它一定是恶意软件。一些合法应用程序(如.NET或JIT编译器)的内存页面具有不寻常的权限。要确认注入的代码是否是真正的恶意代码,取证工具会检查实际的可执行内容,如可移植的可执行(PE)文件或shellcode。
使用Volatility检测代码注入
幸运的是,你不必手动检查每个内存部分。Volatility的malfind插件和MemProcFS的FindEvil等工具可以自动完成这一过程。这些工具会扫描内存进程中的可疑部分,并为调查员们提供易于阅读的检测结果。
malfind 插件会扫描内存并查找以下部分:
- 具有可执行权限
- 未映射到磁盘上的文件
- 包含实际可执行代码
如果发现匹配,它就会标记该部分以便进一步审查。使用 --dump 选项,malfind 甚至可以提取这些部分,以便使用 IDA Pro、YARA 或防病毒扫描仪等工具对其进行进一步分析。
命令示例:
python3 vol.py -f /mnt/c/Users/Akash\'s/Downloads/solarmarker/solarmarker.img windows.malfind > /mnt/c/Users/Akash\'s/Downloads/malfind.txt
一点提示:
当你运行malfind并发现EBP和ESP时,通常表明内存中习惯上不可执行的部分(如堆栈)现在包含了可执行代码。


高级检测技术
虽然malfind是很好的第一步,但攻击者已经开发出通过修改内存标记符来绕过它的方法。以下是一些可以提供帮助的其他技术:
-
YARA规则 ------用于扫描内存转储以查找已知恶意软件模式的自定义规则
-
字符串分析 ------查找转储内存部分中的可疑关键字
-
行为监控 ------监视异常进程行为(例如:svchost.exe启动反向shell)
代码注入的演变
Volatility的malfind能够有效检测反射注入。然而攻击者也通过自我清理来反击。
例如,CoreFlood僵尸网络 清除了加载的DLL的第一页(4096字节)以逃避检测。同样,APT29(俄罗斯) 和APT32(越南) 等组织使用的Cobalt Strike有效载荷会在执行后清除头文件。还有中国黑客组织Winnti RAT也采用了类似的规避策略。
检测更隐蔽的代码注入
要对付这些复杂的注入方法,分析人员必须深入研究。内存转储有助于识别混淆代码:
Volatility malfind的-- dump选项:提取可疑的内存部分,以便进一步分析。
字符串分析和YARA规则 :识别转储内存部分的模式。
逆向工程 :最彻底但需要大量资源的方法。
行为分析------(如监控父子进程关系文件和孤儿文件)依然有效。
MemProcFS 和 "FindEvil" 插件
较新的内存取证工具(如MemProcFS )可通过其FindEvil插件提供增强的检测功能。启用该功能后,会生成findevil.txt标记可疑的内存区域:

违规流程
- PROC_NOLINK:未链接进程(可能是恶意进程)。
- PROC_PARENT:意外的父子进程关系。
- PROC_USER:系统进程以不正确的用户账户运行。
内存页面标记
- PE_INJECT:可执行内存部分缺乏适当的镜像映射。
- NOIMAGE_RWX / NOIMAGE_RX:图像内存外的可疑权限。
- PRIVATE_RWX / PRIVATE_RX:专用内存区段中的可执行代码。

小结
随着攻击者不断改进方法,防御者也必须不断适应。内存取证技术与行为分析相结合,为检测现代注入技术提供了强大的解决方法。