两种使用MASM汇编实现的SRDI(前置式RDI和后置式RDI)可以将EXE/DLL转换为位置无关Shellcode。
一种改良型RDI(内嵌式RDI)只能将DLL转换为shellcode,且这个DLL必须导出ReflectiveLoader函数,对于不熟悉RDI的师傅使用相对困难,但因原理和其制作简单,被大量C2广泛使用。
目前两种SRDI有以下要求:
- main或者wmain可以有参数
- DLL的dllmain按微软官方定义(大多数都满足)
- 不支持用C# 编写的EXE和DLL
- 只支持x64
一种改良型RDI:
- 只支持DLL
- 必须在DLL内部编写ReflectiveLoader函数,且导出,当然不一定要将Loader命名为“ReflectiveLoader”,也可以命名为“HahaLoader”
Convert2Shellcode
Convert2Shellcode_embed.cpp:cpp语言版本,使用改良型RDI(内嵌式)将DLL转换为shellcodeConvert2Shellcode_embed.go:go语言版本,使用改良型RDI(内嵌式)将DLL转换为shellcodeConvert2Shellcode_front.cpp:cpp语言版本,使用前置式RDI将EXE/DLL转换为shellcodeConvert2Shellcode_front.go:go语言版本,使用前置式RDI将EXE/DLL转换为shellcodeConvert2Shellcode_post.cpp:cpp语言版本,使用后置式RDI将EXE/DLL转换为shellcodeConvert2Shellcode_post.go:go语言版本,使用后置式RDI将EXE/DLL转换为shellcode
Debug
DebugForRDI.asm:在调试和编写RDI时创建了这个asm文件,并最终完成了验证。Sever.py:一个使用python编写的TCP服务器,配合DebugForRDI.asm一起使用
SRDI Asm
RDI_front.asm:前置式RDI shellcodeRDI_post.asm:后置式RDI shellcode
Test
ReflectiveDLL.cpp:具有导出函数ReflectiveLoader的DLL源码ReflectiveDLL.dll:具有导出函数ReflectiveLoader的DLL二进制版本stager_x64_reverseTcp.asm:一个类似于 Cobalt Strike 的stager,使用 Server.py 启动服务器,然后运行这个汇编文件从服务器下载并执行该stageTest_for_dll.cpp:测试DLL源码Test_for_dll.dll:测试DLL二进制版本Test_for_exe.cpp:测试EXE源码Test_for_exe.exe:测试EXE二进制版本
1.Convert2Shellcode_post.exe <DLL/EXE Path> [Output File Path]
2.Convert2Shellcode_post.exe <DLL/EXE Path> [Output File Path]
3.Convert2Shellcode_embed.exe <DLL Path> [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)
使用pe2shellcode的runshc64.exe:hasherezade/pe_to_shellcode: Converts PE into a shellcode进行验证,也可以自己编写一个loader
如果你对实现细节感兴趣,可以去看看我写的这篇文章:从SRDI原理剖析再到PE2Shellcode的实现-先知社区
我的博客:关于这个博客 | onedaybook
这个项目,我会去维护,主要是以下几点
- 增加x86的支持
- 增加高级功能,比如说支持用户数据、混淆PE特征等等
- 增加对 .NET程序的支持
- 继续完善RDI的功能,比如说增加延迟导入、导出转换等等
- 进一步缩小srdi的体积
- 修复bug和解决师傅们提出的issue
本工具仅提供给安全研究人员进行合法安全研究及学习使用。使用者应遵守当地相关法律,未经授权不得对任何计算机系统进行测试。作者不对任何滥用此工具的行为负责,包括但不限于未经授权的入侵、破坏、数据窃取等行为。使用者应对其行为负全部责任。
还有一点,现在我不干安全了,别溯源我。
