一键生成Windows x86 shellcode的IDA Python脚本
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/jxust-xiaoxiong/Shellcode_Generator
一键生成windows x86 shellcode的python脚本
📖目录
👨🏻💻 预览演示
演示生成的shellcode代码功能为创建regedit进程,向regedit进程远程线程注入添加自启动注册表项完成持久化功能。

🔥 介绍
本项目主要想解决手动编写shellcode的过程中痛点问题(全局变量、重定位、Windows API调用等),帮助用户使用C语言实现的方法一键转换成shellcode。
优点和不足之处
优点:
- 使用简单方便,对于shellcode编写不熟练的用户,使用它可以大大提高效率
- 大胆使用全局变量和系统API,再也不用担心地址重定位问题
- 不局限于MSF和CS提供shellcode模板、随意发挥。
- 支持嵌套使用shellcode
不足:
- 暂不支持x64的shellcode生成。
- 对于有些C标准库函数处理不了,比如strtok函数。
- 生成的shellcode长度会比手动编写的长不少,但相对于ReflectiveLoader反射加载的长度小很多。
🔗 使用环境
- 项目目前仅支持生成x86的shellcode
- 需要安装IDA软件并支持运行python脚本
- 使用VS编译项目时需要禁用优化并把代码生成设置为多线程/MT
- 能使用Windows API和C标准库函数完成功能时,优先使用Windows API,可以减少大量系统依赖。比如exit和ExitProcess可以实现结束进程,优先使用ExitProcess方法。
💡 用法
-
打开VS项目,在Shellcode_Generator_Demo.c文件中的strat函数处添加需要生成的shellcode代码,编译项目
-
使用IDA打开编译好的程序,一路默认选项,可参考演示实例
-
在IDA中找到main函数,光标选中main函数内任意地址
-
按下快捷键ALT+F7,选择项目中ida_shellcode_generator.py脚本
-
运行结束后会生成一个shellcode文件路径和大小,可以生成raw或txt格式(需要修改脚本中的outType)
-
可以使用Shellcode_Generator_Demo.c中的testShellcodeRun方法测试shellcode是否可用
🔩 设计思路
python脚本:
- 输入启动函数的地址,递归遍历所有被调用的函数写入shellcode
- 修复shellcode中函数体的调用指令的偏移操作数
- 在shellcode去除security_check相关内容(替换为nop)
- 拷贝全局变量和已初始化变量到shellcode末尾
- 构造IAT的字符串数据到shellcode末尾,替换C代码中iatInfoOffset变量值
- 构造IAT表到shellcode末尾,修复IAT表中的函数调用偏移,替换C代码中iatBeginOffset变量值
- 构造重定位表到shellcode末尾,修复重定位数据的引用偏移,替换C代码中relocBeginOffset和relocEndOffset变量值
- 输出shellcode到指定文件格式,打印输出路径和shellcode长度
C文件:
- 获取shellcode所在的基址
- 根据relocBeginOffset变量判断是否有重定位信息需要修复,有的话就根据基址和重定位表修复
- 根据iatInfoOffset变量判断是否有IAT表需要修复,不需要修复时直接跳转到用户定义的start函数
- 需要修复IAT表时,需要先通过汇编代码获取到GetProcAddress、GetModuleHandle等方法
- 根据iatInfoOffset存放的IAT的字符串信息依次修复IAT表
- 跳转到用户定义的start函数执行
标签:工具分享, 免杀工具, shellcode生成工具, IDA PRO