AMSI底层通信分析

在一些讨论amsi绕过的文章中,并没有讲得非常深入,都是说patch AmsiScanBuffer等等方法。但我想知道amsi.dll是怎么和杀软通信的(如Windows Defender),换句话说,AmsiScanBuffer的buffer参数是怎么传到杀软分析(AMSI Provider)的。

0x01.分析

逆向大致发现buffer数据是通过Windows Defender注入到受保护进程的mpclient.dll通过ALPC的方式进行RPC通信完成传输的。

image-20260512175948994

在MpOAV.dll中执行了如下函数

image-20260512193005971

在此库中会调用mpclient.dll中的MpAmsiScan API,此库显然也是Windows Defender的一个Dll。

image-20260512194547168

往下就能看到和RPC相关的代码,如下是获取Windows Defender后端服务的RPC Binding Handle。所以这个mpclient.dll是客户端库。

image-20260512200319040

ClientMpRpcMemoryScanStart猜测是向Windows Defender发送一个启动扫描请求。RPC opum为0x5E。

image-20260512201111148

往下还通过NdrClientCall3进行了两次RPC调用,第二次是返回一个扫描结果对应的事件码。

image-20260512202247269

事件码主要返回了四种:

  • 16392:返回结果0x8000,代表AMSI_RESULT_DETECTED
  • 16400:返回结果0x4000,代表AMSI_RESULT_BLOCKED_BY_ADMIN_START
  • 16401:没有返回结果,而是返回了一个附加字段,表示可能需要额外的检查等,默认返回AMSI_RESULT_NOT_DETECTED
  • 16389:表示退出,扫描完成 ,默认返回AMSI_RESULT_NOT_DETECTED

AMSI_RESULT是一个枚举类型,其中有两种结果并没有返回:AMSI_RESULT_CLEAN和AMSI_RESULT_BLOCKED_BY_ADMIN_END。

image-20260512203752347

image-20260513095140257

最后一次则是关闭、退出、销毁资源。

image-20260512202405011