终端防御规避技术-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 等白名单程序做代理执行。
共有两个特点,正好打在传统扫描的软肋上:
- 文件不存在。载荷在内存里生成,磁盘上没有可扫的对象。
- 文件存在但看不懂。内容是 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。
调用流程:
- 进程启动,客户端调用
AmsiInitialize(L"PowerShell", &ctx),拿到一个上下文。 - 每次要执行一段内容前,先
AmsiOpenSession(ctx, &session)。 - 把内容传进去:
AmsiScanBuffer(ctx, buffer, len, contentName, session, &result)。 - amsi.dll 把 buffer 交给提供者,提供者返回结果。
- 客户端看结果决定是否执行,最后
AmsiCloseSession。
结果码只有几种:
| 结果 | 值 | 含义 |
|
参与讨论