【免杀技术】致盲组件 - 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修补

  1. 在IDA中分析,找到关键条件判断的汇编代码
  2. jne指令(操作码0x75)替换为je指令(操作码0x74
  3. 这样会使if判断逻辑反转,总是执行返回错误的路径

AmsiScanBuffer修补

  1. 同样找到返回错误码的条件判断
  2. 修改对应的跳转指令(jne改为je
  3. 由于AmsiScanString调用AmsiScanBuffer,修补后者也会影响前者

4. 实际操作步骤

  1. 附加进程:使用调试器(如x64dbg)附加到PowerShell进程
  2. 定位函数:找到amsi.dll中的AmsiScanBuffer函数
  3. 识别关键点:定位返回-2147024809的代码位置
  4. 修改指令:将jne改为je0x750x74
  5. 验证效果:执行恶意脚本测试是否绕过检测

5. 规避检测的技术

杀毒软件可能检测AMSI修补行为,常见检测点:

  1. API调用监控:如WriteProcessMemory、VirtualProtectEx等
  2. 规避方案
    • 使用系统调用直接绕过API监控
    • 使用C#编写POC,在PowerShell当前进程中执行
    • 利用白名单/可信进程排除项

6. 实战建议

  1. 无文件攻击:将技术写入ps1文件进行远程执行
  2. 语言选择:C#实现比C语言更隐蔽,不易触发告警
  3. 多函数修补:同时修补AmsiOpenSession和AmsiScanBuffer更可靠
  4. 注意差异:AmsiOpenSession的跳转指令布局略有不同(多一个jne)

7. 防御措施

  1. 监控关键API调用:特别是内存修改相关API
  2. 行为分析:检测异常的内存修改行为
  3. AMSI自身保护:微软可加强AMSI组件的自我保护机制
  4. 多层防御:不依赖单一检测机制,结合其他安全措施

8. 总结

AMSI内存修补技术通过修改关键函数中的单个字节(跳转指令),可以有效地绕过AMSI的检测机制。这种技术简单但有效,突显了内存完整性保护的重要性。防御方需要采取多层次的防护措施来应对此类攻击。

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函数 错误码 -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的检测机制。这种技术简单但有效,突显了内存完整性保护的重要性。防御方需要采取多层次的防护措施来应对此类攻击。