【免杀技术】致盲组件 - AMSI内存修复 (修改一个字节就能绕过AMSI?)
字数 1710 2025-08-22 12:23:06
AMSI内存修复绕过技术详解
1. AMSI简介
AMSI (Antimalware Scan Interface) 是微软开发的反病毒组件,用于扫描特殊攻击面。AMSI接口会将扫描结果提供给杀毒软件,最终由杀软处理恶意事件。
主要AMSI API函数
| 函数名称 | 说明 |
|---|---|
| AmsiCloseSession | 关闭由AmsiOpenSession打开的会话 |
| AmsiInitialize | 初始化AMSI API |
| AmsiNotifyOperation | 向反恶意软件提供程序发送任意操作的通知 |
| AmsiOpenSession | 打开一个会话,可以关联多个扫描请求 |
| AmsiResultIsMalware | 确定扫描结果是否指示应阻止内容 |
| AmsiScanBuffer | 扫描包含恶意软件内容的缓冲区 |
| AmsiScanString | 扫描字符串以查找恶意软件 |
| AmsiUninitialize | 删除由AmsiInitialize打开的AMSI API实例 |
攻击面:主要集中在AmsiOpenSession、AmsiScanBuffer、AmsiScanString三个函数。
2. AMSI内存修补原理
AMSI功能通过amsi.dll调用,该DLL会被加载到进程内存中(如PowerShell进程)。这使得我们可以直接修改内存中的代码来绕过检测。
关键函数分析
AmsiOpenSession函数
HRESULT __stdcall AmsiOpenSession(HAMSICONTEXT amsiContext, HAMSISESSION *amsiSession) {
signed __int32 v3; // eax
if (!amsiSession || !amsiContext || !*((_QWORD *)amsiContext + 1) || !*((_QWORD *)amsiContext + 2))
return -2147024809;
v3 = _InterlockedExchangeAdd((volatile signed __int32 *)amsiContext + 6, 1u);
*amsiSession = (HAMSISESSION)(v3 + 1);
if (v3 == -1)
*amsiSession = (HAMSISESSION)_InterlockedIncrement((volatile signed __int32 *)amsiContext + 6);
return 0;
}
- 错误码
-2147024809(十六进制0x80070057)表示"无效的参数"(E_INVALIDARG) - 关键点:修改条件判断逻辑,使其总是返回错误
AmsiScanBuffer和AmsiScanString
- AmsiScanString实际上是调用AmsiScanBuffer
- 两者有类似的结构,都包含关键的条件判断
3. 单字节修补技术
AmsiOpenSession修补
- 在IDA中分析,找到关键条件判断的汇编代码
- 将
jne指令(操作码0x75)替换为je指令(操作码0x74) - 这样会使if判断逻辑反转,总是执行返回错误的路径
AmsiScanBuffer修补
- 同样找到返回错误码的条件判断
- 修改对应的跳转指令(
jne改为je) - 由于AmsiScanString调用AmsiScanBuffer,修补后者也会影响前者
4. 实际操作步骤
- 附加进程:使用调试器(如x64dbg)附加到PowerShell进程
- 定位函数:找到amsi.dll中的AmsiScanBuffer函数
- 识别关键点:定位返回
-2147024809的代码位置 - 修改指令:将
jne改为je(0x75→0x74) - 验证效果:执行恶意脚本测试是否绕过检测
5. 规避检测的技术
杀毒软件可能检测AMSI修补行为,常见检测点:
- API调用监控:如WriteProcessMemory、VirtualProtectEx等
- 规避方案:
- 使用系统调用直接绕过API监控
- 使用C#编写POC,在PowerShell当前进程中执行
- 利用白名单/可信进程排除项
6. 实战建议
- 无文件攻击:将技术写入ps1文件进行远程执行
- 语言选择:C#实现比C语言更隐蔽,不易触发告警
- 多函数修补:同时修补AmsiOpenSession和AmsiScanBuffer更可靠
- 注意差异:AmsiOpenSession的跳转指令布局略有不同(多一个jne)
7. 防御措施
- 监控关键API调用:特别是内存修改相关API
- 行为分析:检测异常的内存修改行为
- AMSI自身保护:微软可加强AMSI组件的自我保护机制
- 多层防御:不依赖单一检测机制,结合其他安全措施
8. 总结
AMSI内存修补技术通过修改关键函数中的单个字节(跳转指令),可以有效地绕过AMSI的检测机制。这种技术简单但有效,突显了内存完整性保护的重要性。防御方需要采取多层次的防护措施来应对此类攻击。