在一些讨论amsi绕过的文章中,并没有讲得非常深入,都是说patch AmsiScanBuffer等等方法。但我想知道amsi.dll是怎么和杀软通信的(如Windows Defender),换句话说,AmsiScanBuffer的buffer参数是怎么传到杀软分析(AMSI Provider)的。
0x01.分析
逆向大致发现buffer数据是通过Windows Defender注入到受保护进程的mpclient.dll通过ALPC的方式进行RPC通信完成传输的。

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

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

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

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

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

事件码主要返回了四种:
- 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。


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