wwh1004/c2sc

GitHub: wwh1004/c2sc

一个将 C 代码编译为高度优化、无 PE 头的 Windows Shellcode 框架,用于生成极小且隐蔽的执行载荷。

Stars: 3 | Forks: 2

# c2sc:高级 C 转 Shellcode 框架 [English](README.md) | [简体中文](README.zh-Hans.md) ## 摘要 **c2sc** 是一个专为安全研究人员和红队成员设计的专用框架,用于将 C 代码直接编译为适用于 Windows x86 和 x64 架构的位置无关代码 (PIC) shellcode。与依赖编写复杂汇编或使用重型反射式 DLL 注入技术的传统方法不同,c2sc 允许您充分利用 C 语言的强大功能,同时生成极其紧凑、隐蔽且抗分析的 Payload。 ## 介绍 在现代攻击性安全领域,隐蔽地执行代码至关重要。传统的汇编 Shellcode 开发既耗时又容易出错。虽然反射式 DLL 注入允许使用高级语言,但它引入了显著的开销和取证特征(PE 头、节),这些很容易被 EDR/AV 解决方案标记。 **c2sc** 通过利用先进的**编译器和链接器配置**来弥补这一差距,从根本上重组 PE 结构。它生成的不是标准可执行文件,而是一个高度优化的二进制文件,其中导入地址表 (IAT) 和重定位表被压缩和最小化。这种方法剥离了大部分 PE 头和结构性开销,从而产生了一个原始的、位置无关的 shellcode 二进制块,其体积比传统 Payload 更小、更隐蔽。 ## 功能特性 - **跨架构支持**:无缝支持 **x86** 和 **x64** Windows 环境的编译。 - **纯 C 开发**:使用标准 C (`main.c`) 编写 Payload 逻辑,避免汇编的复杂性。 - **位置无关**:生成的 shellcode 完全位置无关,可以注入到任何进程内存中。 - **无 CRT 依赖**:使用自定义编译器标志和链接选项来消除对 C 运行时 (CRT) 的依赖,从而实现最小的 Payload 体积。 - **动态 API 解析**:实现自定义哈希 (ROR13) 以动态解析 Windows API,向静态分析隐藏导入表。 - **自动提取**:包含一个专用工具 (`tools/c2sc.c`),用于解析编译后的 PE 并将可执行 shellcode 提取为 `.bin` 和 C 头文件 (`.h`) 格式。 ## 代码结构 该框架由以下关键组件组成: ### 1. Payload 逻辑 (`src/main.c`) 这是您编写 Payload 的地方。它暴露了一个由启动例程调用的 `Main` 函数。 ``` #include #include WCHAR HelloWorldText[] = L"Hello, World! 123"; WCHAR ProcessPath[MAX_PATH] = {0}; // The entry point for your payload logic EXTERN_C VOID Main(PVOID parameter) { // Example: Resolve API and execute logic GetModuleFileName(NULL, ProcessPath, MAX_PATH); printf("Process path: %ls\n", ProcessPath); MessageBox(NULL, HelloWorldText, L"Hello, World!", MB_OK); } ``` ### 2. Shellcode 加载器 (`src/startup.c`) 该文件处理底层初始化。它遍历 PEB(进程环境块)以查找 kernel32.dll,使用哈希比较解析必要的 API(如 `LoadLibrary`、`GetProcAddress`),并在调用 `Main` 之前准备环境。 ``` // (Snippet from src/startup.c) // Walks the PEB to find loaded modules typedef struct _PEB_LDR_DATA { ... } PEB_LDR_DATA, *PPEB_LDR_DATA; // Custom hash function for API resolution #define HASH_KEY 17 #define HASH_ROUND(h, c) (_rotr((h), HASH_KEY) + (c)) ... ``` ### 3. 构建系统 (`build.bat`) 构建脚本使用特定标志配置 MSVC 编译器,以禁用安全检查 (`/GS-`)、针对体积进行优化 (`/O1`) 并移除默认库,确保输出适合 shellcode 转换。 ``` set CC_FLAGS=/nologo /O1 /Os /Oi /GS- /Zc:inline /permissive- /W3 ... cl src\startup.c src\main.c %CC_FLAGS% /Fe"bin\myshellcode.x86.exe" ... ``` ### 4. 转换工具 (`tools/c2sc.c`) 一个自定义实用程序,用于读取编译后的 PE 文件,提取 `.text` 节(代码),并处理最终格式化以生成原始 shellcode 文件。 ## 使用方法 ### 前置条件 - Microsoft Visual Studio(MSVC 编译器 `cl.exe` 必须位于您的 PATH 中,或者从开发者命令提示符运行)。 ### 构建步骤 1. **修改 Payload**:编辑 `src/main.c` 以包含所需的功能。 2. **编译**:从项目根目录运行构建脚本。 build.bat 3. **获取 Shellcode**:输出文件将生成在 `bin/` 目录中。 - `bin/myshellcode_x64.bin`:原始 shellcode 二进制文件。 - `bin/myshellcode_x64.h`:包含作为字节数组的 shellcode 的 C 头文件。 ## 相比反射式 DLL 注入的优势 **c2sc** 与传统的反射式 DLL 注入 (RDI) 技术相比具有显著优势,特别是在规避和体积方面。 | 特性 | 反射式 DLL 注入 (RDI) | c2sc (Shellcode) | | :--- | :--- | :--- | | **Payload 结构** | 完整 PE 文件 (DLL) | 原始二进制代码 | | **体积** | 大 (头、节、填充) | **极小** (仅代码和数据) | | **文件头** | 包含 DOS/NT 头 (`MZ`, `PE`) | **无文件头** | | **内存占用** | 易于指纹识别 (RWX 节, 堆中的 PE 头) | 极低,在执行前看起来像随机数据 | | **分析** | 解析器可以轻松读取导入/导出 | **不透明**,需要反汇编/模拟 | | **开发** | 标准 C/C++ DLL | 带约束的 C (PIC, 无 CRT) | ### 为什么 c2sc 更适合红队: 1. **体积**:由于 PE 结构和 CRT,RDI Payload 通常在 10KB 到 100KB+ 之间。**c2sc** Payload 可以小到几百字节。 2. **反取证**:安全工具经常扫描内存以查找 `MZ` 魔术字节或特征性的 PE 头模式。由于 **c2sc** 生成原始 shellcode,这些根本不存在。 3. **灵活性**:生成的 shellcode 可以轻松嵌入到其他 Exploit、宏或加载器(例如 Donut、Cobalt Strike)中,而无需复杂的反射式加载器存根。 *免责声明:本工具仅用于教育目的和授权安全测试。严禁将此软件滥用于恶意目的。*
标签:C 语言, DNS 反向解析, PE 结构优化, PIC, RFI远程文件包含, Shellcode 开发, Windows 安全, x86/x64, 二进制安全, 位置无关代码, 动态 API 解析, 反射式注入替代, 安全意识培训, 安全测试, 客户端加密, 恶意代码分析, 攻击性安全, 无 CRT 依赖, 端点可见性, 编译器优化, 配置文件