什么是AMSI

AMSI全称(Antimalware Scan Interface),反恶意软件扫描接口,他的本体是一个DLL文件,存在于 c:\windows\system32\amsi.dll。它提供了通用的标准接口(COM接口、Win32 API)。这些接口中 Win32 API是为正常应用程序提供的,方便正常程序调用这些API针对用户输入做扫描。其中的COM接 口,是为杀软供应商提供的,方便杀软厂商接入自身针对恶意软件的识别能力。

在windows10和windows2016上默认安装并启用

AMSI如何工作的

服务和应用程序可以通过AMSI来与系统中已安装的反病毒软件进行通信,也就是和windows defender
AMSI采用了hook方式进行检测

  • 创建PowerShell进程时,AMSI.DLL将从磁盘加载到其内存地址空间。
  • 在AMSI.DLL中,有一个名为AmsiScanBuffer()的函数,是用来扫描脚本内容的函数。
  • 在PowerShell中执行命令时,任何内容都将首先发送到AmsiScanBuffer(),然后再执行。
  • 随后,AmsiScanBuffer()将Windows Defender检查,以确定是否创建了任何签名。
  • 如果该内容被认为是恶意的,它将被阻止运行。

随着以.NET(C#)为基础的攻击技术的逐渐成熟,AMSI在.NET 4.8引入了针对Assembly导入的内存扫描, 同时针对WMI的扫描也被加入到了AMSI当中。

在windows 10上,实现AMSI的所有组件如下

  • 用户帐户控制,或UAC(EXE、COM、MSI或ActiveX时的权限提升)
  • Powershell(脚本、交互式使用和动态代码执行)
  • Windows脚本主机(wscript.exe和cscript.exe)
  • JavaScript和VBScript
  • Office VBA宏

整体架构

Windows AMSI - 图1

WIN32 API 如下(根据查询amsi.dll记录):

  • AmsiCloseSession
  • AmsiInitialize
  • AmsiOpenSession
  • AmsiScanBuffer
  • AmsiScanString
  • AmsiUacInitialize
  • AmsiUacScan
  • AmsiUacUninitialize
  • AmsiUninitialize

    总结

    总体来说,由于AMSI仅仅是一个连接应用程序和杀软程序的通道,微软主要还是在defender上做各种 对抗,针对通道本身的加固较少。

    bypass技术

  • 降级PowerShell版本到2.0(依赖于.Net 3.0,Windows 10 默认不预装)

  • 混淆攻击脚本
  • 使用一行命令关闭AMSI(针对这一行命令本身使用混淆绕过对抗AMSI检测)

    1. [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('a
    2. msiInitFailed','NonPubilc,Static').SetValue($null,$true)
  • 设置注册表“HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable”设置为 0, 以禁用 AMSI

  • 卸载当前进程中的amsi.dll
  • PowerShell.exe同目录下放入傀儡amsi.dll劫持正常amsi.dll(正常amsi.dll存在于 c:\windows\system32\amsi.dll
  • Null字符绕过
  • COM Server劫持(劫持杀软接入接口)
  • 内存补丁技术

微软对抗手段

Windows 10 1709以后,如果AMSI提供程序依赖于同目录下其他DLL同时加载,将不能工作。 Windows 10 1903以后,AMSI提供商DLL没有Authenticode-signed,可能将不能加载。这个取决 于注册表:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\FeatureBits的值, 默认0x01,签名检测被禁止。也就是说微软增加了这个功能但没有默认开启 提醒杀软监控注册表“HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable”的值