onedays12/Convert2Shellcode
GitHub: onedays12/Convert2Shellcode
一款将 EXE/DLL 转换为位置无关 shellcode 的工具,聚焦 RDI 技术的多种实现以解决 PE 文件内存加载与执行的需求。
Stars: 41 | Forks: 6
[English](README.md) | [中文](README_zh.md)
# 介绍
MASM 汇编中实现的两种 SRDI 类型——**前向式 RDI** 与 **后向式 RDI**——可以将 EXE/DLL 转换为位置无关的 shellcode。
**嵌入式 RDI**(改进变体)仅支持 DLL 到 shellcode 的转换。该 DLL 必须导出一个加载器函数(例如 `ReflectiveLoader` 或类似 `HahaLoader` 的自定义名称)。尽管对于不熟悉 RDI 的实践者来说颇具挑战性,但其简洁性使其已被 C2 框架广泛采用。
**当前 SRDI 限制**:
1. EXE 的 `main` 或 `wmain` 可以带有参数。
2. DLL 的 `DllMain` 必须遵循 Microsoft 的官方规范。
3. 不支持用 C# 编写的 EXE/DLL。
4. 仅支持 x64 架构。
**嵌入式 RDI 特性**:
1. 仅支持 DLL 转换。
2. 需要一个导出的加载器函数(名称可自定义,例如 `HahaLoader`)。
# 项目结构
Convert2Shellcode
- `Convert2Shellcode_embed.cpp`:C++ 版本,使用改进的 RDI(嵌入式)将 DLL 转换为 shellcode
- `Convert2Shellcode_embed.go`:Go 版本,使用改进的 RDI(嵌入式)将 DLL 转换为 shellcode
- `Convert2Shellcode_front.cpp`:C++ 版本,使用前向式 RDI 将 EXE/DLL 转换为 shellcode
- `Convert2Shellcode_front.go`:Go 版本,使用前向式 RDI 将 EXE/DLL 转换为 shellcode
- `Convert2Shellcode_post.cpp`:C++ 版本,使用后向式 RDI 将 EXE/DLL 转换为 shellcode
- `Convert2Shellcode_post.go`:Go 版本,使用后向式 RDI 将 EXE/DLL 转换为 shellcode
调试
- `DebugForRDI.asm`:为调试和开发 RDI 创建的 ASM 文件,功能已验证
- `Sever.py`:Python 编写的 TCP 服务器,配合 `DebugForRDI.asm` 使用
SRDI Asm
- `RDI_front.asm`:前向式 RDI shellcode
- `RDI_post.asm`:后向式 RDI shellcode
测试
- `ReflectiveDLL.cpp`:带有导出 `ReflectiveLoader` 函数的 DLL 源代码
- `ReflectiveDLL.dll`:已编译的带有导出 `ReflectiveLoader` 函数的 DLL 二进制文件
- `stager_x64_reverseTcp.asm`:类似 Cobalt Strike 的 stager;运行 `Sever.py` 启动服务器后,执行此 ASM 以获取/执行载荷
- `Test_for_dll.cpp`:测试 DLL 源代码
- `Test_for_dll.dll`:测试 DLL 二进制文件
- `Test_for_exe.cpp`:测试 EXE 源代码
- `Test_for_exe.exe`:测试 EXE 二进制文件
# 使用方法
```
1.Convert2Shellcode_post.exe [Output File Path]
2.Convert2Shellcode_post.exe [Output File Path]
3.Convert2Shellcode_embed.exe [Output File Path] [The Export Function Name of Loader]
```
示例
```
PS C:\Users\Xxxxxxxx\Desktop\Convert2Shellcode_v1.0> .\Convert2Shellcode_front.exe .\mimikatz.exe
╔══════════════════════════════════════════════════════════════════════════════════════╗
║ Convert2Shellcode_front ║
║------------------------------------------------------------------------------------- ║
║ Function: Use front-style RDI to convert EXE/DLL into position-independent shellcode ║
║ Author:oneday ║
║ Compilation Date:Jun 12 2025 21:29:52 ║
╚══════════════════════════════════════════════════════════════════════════════════════╝
[+] Successfully opened .
[*] File size is 1355264
[+] Memory allocation successful, address is 0x4bc9b040
[*] 1355264 bytes read into memory
[+] Memory allocation successful, address is 0x4bdf9040
[+] Successfully generated shellcode file: s (Size: 1356147 bytes)
```
使用 runshc64.exe 配合 pe2shellcode 进行验证:[hasherezade/pe_to_shellcode: Converts PE into a shellcode](https://github.com/hasherezade/pe_to_shellcode),或您也可以编写自己的加载器。

# 更多信息
如果您对实现细节感兴趣,可以查看我撰写的文章:[从SRDI原理剖析再到PE2Shellcode的实现-先知社区](https://xz.aliyun.com/news/18239)
我的博客:[关于这个博客 | onedaybook](https://oneday.gitbook.io/onedaybook)
# 待办事项
**我将持续维护该项目,重点关注以下关键点:**
1. **添加 x86 支持**
2. **引入高级特性**,例如支持用户数据、混淆 PE 头等等。
3. **添加 .NET 程序集支持**
4. **增强 RDI 功能**,包括延迟导入、导出转换等。
5. **进一步减小 SRDI shellcode 体积**
6. **修复错误并处理社区反馈的问题**
# 免责声明
本工具仅供教育和研究用途。旨在供安全专业人员在合法授权的任务中使用。作者不对本软件的任何滥用负责。用户必须确保在对该工具进行任何系统操作之前已获得适当授权。
另外,我已不再从事安全领域工作,请勿追踪。
标签:C++, C2框架, DLL转换, EXE转换, Go, HahaLoader, Loader导出函数, MASM汇编, RDI反射加载, ReflectiveLoader, Ruby工具, Shellcode生成, SRDI, T1050, T1055, x64, 云资产清单, 代码转换, 位置无关Shellcode, 前向RDI, 反射DLL注入, 后向RDI, 安全学习资源, 安全报告生成, 嵌入式RDI, 数据擦除, 日志审计, 自动回退, 逆向工具, 逆向工程