终端防御规避技术-10.反恶意软件扫描接口AMSI

现代攻击却大量走脚本:PowerShell 一行命令、Office 宏、wscript、mshta、.NET 动态编译。这些载荷可以完全不落盘,或者落盘的是编码后的一串字符,静态扫描看到一排 Base64 判断不了任何东西。AMSI 就是为这个缺口造的——在脚本真正执行之前,把明文内容截下来交给杀软看一眼。

一、脚本恶意软件的挑战

脚本的执行方式和 PE 完全不同。PE 有文件头、导入表、节表,扫描器有一堆结构可以分析;脚本是纯文本,由解释器逐段解析、编译成内部结构再执行。

常见载体:

  • PowerShell:-EncodedCommand、下载后再 Invoke-Expression(IEX)执行。
  • VBScript / JScript:由 wscript.exe、cscript.exe 解释。
  • Office VBA 宏:打开文档即触发。
  • WMI 脚本:通过 WMI 服务远程或本地执行。
  • .NET 程序集:Assembly.Load 从字节数组直接加载,不落盘。
  • mshta、regsvr32、rundll32 等白名单程序做代理执行。

共有两个特点,正好打在传统扫描的软肋上:

  1. 文件不存在。载荷在内存里生成,磁盘上没有可扫的对象。
  2. 文件存在但看不懂。内容是 Base64、XOR 或多层拼接,特征匹配不上。

所以需要的机制不是"再扫一遍文件",而是:在解释器把脚本编译成可执行结构之前,把"将要执行的内容"截获,交给反恶意软件引擎判断。这就是 AMSI 的设计目标。

二、AMSI 是什么

AMSI 全称 Anti-Malware Scan Interface,Windows 自带的一套扫描接口。它不是杀软,是"客户端—接口—提供者"三方的一个约定。

三个角色:

  • 客户端(Client):要执行脚本的应用。powershell.exe、wscript.exe、mshta.exe、Office、.NET 运行时都可能是。
  • 接口(amsi.dll):提供 AmsiInitialize、AmsiOpenSession、AmsiScanBuffer、AmsiScanString、AmsiCloseSession、AmsiUninitialize 这几个导出函数。它负责把内容送进已注册的提供者。
  • 提供者(Provider):杀软实现的 COM 组件,注册在:
HKLM\SOFTWARE\Microsoft\AMSI\Providers\{GUID}

以 Windows Defender 为例,它的提供者 CLSID 通常是:

{2781761E-28E0-4109-99FE-B9D127C57AFE}

具体值以本机注册表为准。装了第三方杀软时,这里会多出对应厂商的 GUID。

调用流程:

  1. 进程启动,客户端调用 AmsiInitialize(L"PowerShell", &ctx),拿到一个上下文。
  2. 每次要执行一段内容前,先 AmsiOpenSession(ctx, &session)。
  3. 把内容传进去:AmsiScanBuffer(ctx, buffer, len, contentName, session, &result)。
  4. amsi.dll 把 buffer 交给提供者,提供者返回结果。
  5. 客户端看结果决定是否执行,最后 AmsiCloseSession。

结果码只有几种:

| 结果 | 值 | 含义 |
|

参与讨论