# step_veh_64_shellcode_loader **Repository Path**: cutecuteyu/step_veh_64_shellcode_loader ## Basic Information - **Project Name**: step_veh_64_shellcode_loader - **Description**: 一个基于 Windows 异常处理机制的 64 位 Shellcode 加载器,支持 XOR 加密和动态内存保护。 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-14 - **Last Updated**: 2026-02-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Shellcode Loader (64-bit) > 参考资料:https://github.com/Ymjie/ShellStepVEH > 主要修改部分:支持64位、shellcode原始输入和加密内容处理 一个基于 Windows 异常处理机制的 64 位 Shellcode 加载器,支持 XOR 加密和动态内存保护。 ## 项目概述 本项目实现了一个完整的 Shellcode 加载框架,主要功能包括: - **XOR 加密/解密**:使用简单的 XOR 算法对 Shellcode 进行加密,绕过静态特征检测 - **异常处理机制**:利用 Windows VEH(Vectored Exception Handler)实现单步跟踪和内存保护 - **指令解析**:支持 x86/x64 指令的 ModR/M 和 SIB 解析,用于分析内存访问 - **模块化设计**:代码解耦为多个独立模块,便于维护和扩展 ## 文件结构 ``` . ├── main.cpp # 程序入口(约 58 行) ├── registers.hpp # 64位寄存器结构定义 ├── instruction.hpp/.cpp # x86/x64 指令解析模块 ├── exception_handler.hpp/.cpp # 异常处理模块 ├── enc_shellcode.hpp # 加密后的 Shellcode(自动生成) ├── encrypt_shellcode.cpp # Shellcode 加密工具 ├── shellcode.cpp # 原始 Shellcode(示例) └── README.md # 本文件 ``` ## 编译说明 ### 环境要求 - Windows 操作系统(64位) - MinGW-w64 或 MSVC 编译器 - C++17 标准支持 ### 编译步骤 #### 1. 编译加密工具 ```bash g++ encrypt_shellcode.cpp -o encrypt_shellcode.exe -std=c++17 ``` #### 2. 生成加密 Shellcode ```bash .\encrypt_shellcode.exe ``` 运行后会生成 `enc_shellcode.hpp` 文件,包含: - `XOR_KEY`:加密密钥(默认 0x1C) - `SHELLCODE_SIZE`:Shellcode 大小 - `ENCRYPTED_SHELLCODE[]`:加密后的 Shellcode 数组 #### 3. 编译主程序 ```bash g++ main.cpp instruction.cpp exception_handler.cpp -o main.exe -std=c++17 -Wall ``` ### 编译选项说明 - `-std=c++17`:使用 C++17 标准 - `-Wall`:启用所有警告 - `-O2`:可选,启用优化(发布版本建议添加) ## 使用说明 ### 基本使用流程 1. **准备 Shellcode** - 将原始 Shellcode 放入 `shellcode.cpp` 的 `buf[]` 数组中 - 或使用 `encrypt_shellcode.cpp` 中的默认 Shellcode 2. **加密 Shellcode** ```bash .\encrypt_shellcode.exe ``` 3. **编译并运行** ```bash g++ main.cpp instruction.cpp exception_handler.cpp -o main.exe -std=c++17 .\main.exe ``` ### 更换 Shellcode 1. 修改 `encrypt_shellcode.cpp` 中的 `buf[]` 数组: ```cpp unsigned char buf[] = "\xfc\x48\x83..."; // 你的 Shellcode ``` 2. 重新运行加密工具生成新的头文件 3. 重新编译主程序 ## 代码架构详解 ### 1. 寄存器定义模块 (registers.hpp) ```cpp typedef struct { DWORD64 rax, rcx, rdx, rbx; DWORD64 rsp, rbp, rsi, rdi; DWORD64 r8, r9, r10, r11; DWORD64 r12, r13, r14, r15; DWORD64 rip; } Registers64; ``` 定义了完整的 x64 寄存器集合,用于异常处理时保存和恢复 CPU 状态。 ### 2. 指令解析模块 (instruction.hpp/cpp) #### 核心功能 - **ModR/M 解析**:解析 x86/x64 指令的 ModR/M 字节 ```cpp void parse_modrm(uint8_t modrm, uint8_t* mod, uint8_t* reg, uint8_t* rm); ``` - **SIB 解析**:解析 Scale-Index-Base 字节 ```cpp void parse_sib(uint8_t sib, uint8_t* scale, uint8_t* index, uint8_t* base); ``` - **内存地址计算**:根据指令计算目标内存地址 ```cpp DWORD64 calculate_memory_address(...); ``` - **指令分析**:识别 MOV、LEA 等访问内存的指令 ```cpp DWORD64 analyze_instruction(uint8_t* opcode, const Registers64* regs); ``` #### 支持的指令类型 - 字符串操作指令(MOVSB、MOVSW、MOVSD、MOVSQ) - 两字节操作码(0F xx) - 带 ModR/M 的通用指令 - REX 前缀(64位模式) ### 3. 异常处理模块 (exception_handler.hpp/cpp) #### 全局状态变量 ```cpp extern unsigned char* g_shellcode; // Shellcode 基地址 extern SIZE_T g_shellcodeSize; // Shellcode 大小 extern DWORD64 g_previousRip; // 上一条指令地址 extern bool g_inShellcode; // 是否在 Shellcode 范围内 extern Registers64 g_regs; // 寄存器状态 ``` #### 核心函数 **初始化异常处理** ```cpp void initExceptionHandler(unsigned char* shellcode, SIZE_T size); ``` **安装/卸载异常处理程序** ```cpp bool installExceptionHandler(); void uninstallExceptionHandler(); ``` **异常处理回调** ```cpp LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo); ``` #### 异常处理流程 1. **STATUS_ACCESS_VIOLATION**(访问冲突) - 检测是否在 Shellcode 范围内执行 - 修改内存保护属性为 `PAGE_EXECUTE_READWRITE` - 设置单步标志(EFlags |= 0x100) - 继续执行 2. **EXCEPTION_SINGLE_STEP**(单步异常) - 如果在 Shellcode 内:继续单步跟踪 - 如果在 Shellcode 外:设置内存为 `PAGE_NOACCESS` 3. **外部访问检测** - 检测是否有代码尝试读取 Shellcode 内存 - 临时修改保护属性允许访问 ### 4. 主程序 (main.cpp) #### 执行流程 ``` ┌─────────────────────────────────────┐ │ 1. 分配可读写的内存 (RW) │ │ VirtualAlloc(..., PAGE_READWRITE)│ ├─────────────────────────────────────┤ │ 2. 复制加密的 Shellcode │ │ memcpy(shellcode, ENCRYPTED_...) │ ├─────────────────────────────────────┤ │ 3. XOR 解密 │ │ xorDecrypt(shellcode, size, key) │ ├─────────────────────────────────────┤ │ 4. 安装异常处理程序 │ │ AddVectoredExceptionHandler(...) │ ├─────────────────────────────────────┤ │ 5. 执行 Shellcode │ │ shellcodeFunc() │ ├─────────────────────────────────────┤ │ 6. 清理资源 │ │ RemoveVectoredExceptionHandler │ │ VirtualFree │ └─────────────────────────────────────┘ ``` ## 技术原理 ### 1. XOR 加密 XOR 加密是一种对称加密算法,使用相同的密钥进行加密和解密: ``` 加密:cipher = plain ^ key 解密:plain = cipher ^ key ``` 优点: - 实现简单,速度快 - 加密解密使用相同代码 - 不改变数据长度 ### 2. 异常处理机制 #### VEH (Vectored Exception Handler) Windows 提供的结构化异常处理机制,允许程序注册全局异常处理函数: ```cpp PVOID AddVectoredExceptionHandler( ULONG First, // 1 = 最先调用 PVECTORED_EXCEPTION_HANDLER Handler // 处理函数 ); ``` #### 单步执行 通过设置 EFLAGS 寄存器的 TF(Trap Flag)位实现: ```cpp ExceptionInfo->ContextRecord->EFlags |= 0x100; ``` 每执行一条指令后触发 `EXCEPTION_SINGLE_STEP` 异常。 #### 内存保护属性 - `PAGE_READWRITE` (RW):可读写,不可执行 - `PAGE_EXECUTE_READWRITE` (RWX):可读写执行 - `PAGE_NOACCESS`:不可访问 ### 3. x86/x64 指令格式 #### ModR/M 字节结构 ``` 7 6 5 4 3 2 1 0 +-----+------+------+ | Mod | Reg | R/M | +-----+------+------+ ``` - **Mod** (2位):寻址模式 - 00:间接寻址(无位移) - 01:间接寻址(8位位移) - 10:间接寻址(32位位移) - 11:寄存器直接寻址 - **Reg** (3位):寄存器编号或操作码扩展 - **R/M** (3位):寄存器/内存操作数 #### SIB 字节结构 ``` 7 6 5 4 3 2 1 0 +-----+------+------+ |Scale| Index| Base | +-----+------+------+ ``` 用于复杂的内存寻址计算: ``` 地址 = Base + (Index << Scale) + Displacement ``` ## 安全注意事项 ### 1. 检测规避 - **静态分析**:XOR 加密使 Shellcode 在文件中不以明文形式存在 - **动态分析**:异常处理机制增加了调试难度 - **内存扫描**:频繁修改内存保护属性干扰内存扫描 ### 2. 局限性 - XOR 加密强度较低,可被简单破解 - 异常处理有性能开销 - 某些 EDR 产品可能监控异常处理程序 ### 3. 改进建议 - 使用更强的加密算法(AES、RC4 等) - 添加反调试技术 - 实现代码混淆 - 使用间接系统调用 ## 调试技巧 ### 1. 使用 WinDbg ```bash windbg -g main.exe ``` ### 2. 设置断点 ``` bp main!main bp main!ExceptionHandler ``` ### 3. 查看异常信息 ``` !analyze -v .exr -1 ``` ### 4. 常见错误 | 错误 | 原因 | 解决方案 | |------|------|----------| | 访问冲突 | Shellcode 尝试访问无效内存 | 检查 Shellcode 是否完整 | | 非法指令 | Shellcode 损坏或架构不匹配 | 确认是 64 位 Shellcode | | 异常循环 | 异常处理逻辑错误 | 检查 EFlags 设置 | ## 许可证 本项目仅供学习和研究使用,请勿用于非法用途。 ## 参考资料 1. [Intel 64 and IA-32 Architectures Software Developer's Manual](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html) 2. [Windows VEH Documentation](https://docs.microsoft.com/en-us/windows/win32/debug/vectored-exception-handling) 3. [x86-64 Instruction Encoding](https://wiki.osdev.org/X86-64_Instruction_Encoding)