GeekNeo/CutterPlusPlus

GitHub: GeekNeo/CutterPlusPlus

Cutter++ 是一个 Cutter 逆向工程插件,通过 ICPP 引擎在二进制分析工作流中提供交互式 C++23 脚本执行能力。

Stars: 2 | Forks: 1

# Cutter++ — 用于二进制分析的交互式现代 C++ **Cutter++** 是一个 [Cutter](https://github.com/rizinorg/cutter) 插件,它将交互式 **C++** REPL 直接引入你的**逆向工程**工作流中。 无需编写 Python 脚本或编译原生插件,你可以针对当前打开的二进制文件实时编写和执行现代 C++23 代码片段。 在 [ICPP](https://github.com/vpand/icpp) 的支持下,**Cutter++ 将 C++ 变成了一种**用于逆向工程的脚本语言。 ICPP 允许以极小的启动开销交互式地执行 C++,这使得将 C++ 用作嵌入式脚本语言成为可能。 这使得逆向工程师能够使用: * 模板 * 概念 * STL * 范围 * 现有的 C++ 头文件/库 而无需离开 Cutter。 ## 愿景 Python 普及了脚本编程。 Cutter++ 将现代 C++ 的表现力、性能和生态系统带入交互式逆向 工程。 目标不是取代 Python。 目标是使现代 C++ 成为二进制分析的一等公民语言。 ## 适用人群? * 逆向工程师 * 恶意软件分析师 * 安全研究员 * CTF 选手 * 编译器开发者 * 固件研究员 * 二进制插桩开发者 如果你已经习惯使用 C++ 思考,Cutter++ 能让你在探索二进制文件时始终留在 C++ 的世界中。 ## 为什么? 逆向工程师经常需要自动化重复的分析任务: * 重命名函数 * 遍历控制流图 * 分析交叉引用 * 搜索特征码 * 修补二进制文件 * 构建自定义分析工具 如今通常有两个选项: * **Python 脚本** * 快速迭代 * 动态执行 * 对现有 C++ 库的访问受限 * 没有模板或编译期编程 * **原生 C++ 插件** * 最高性能 * 完整的语言支持 * 开发周期缓慢 * 需要编译并重启 Cutter **Cutter++ 填补了这一空白,将脚本编程的便利性与现代 C++ 的强大功能结合在一起**。 ## 示例 ### Hello World ``` #include #include int main() { Core()->message("Hello, Cutter."); cpp::print("Hello, Cutter++."); return 0; } ``` ### 查找 Call ``` // A sample C++ script to find all the call instructions within the current // function #include #include int main() { auto addr = Core()->getOffset(); // get the current function auto func = Core()->functionIn(addr); if (!func) return -1; auto fnstart = rz_analysis_function_min_addr(func); auto fnend = rz_analysis_function_max_addr(func); cpp::print("Current function 0x%x - 0x%x", fnstart, fnend); RzAnalysisOp op{0}; uint8_t buf[16]{0}; auto core = Core()->lock(); for (addr = fnstart; addr < fnend;) { // read the current machine opcode buffer rz_io_nread_at(core->io, addr, &buf[0], sizeof(buf)); // analyze the current instruction auto bytes = rz_analysis_op(core->analysis, &op, addr, &buf[0], sizeof(buf), RZ_ANALYSIS_OP_MASK_BASIC); if (bytes <= 0) break; // print the call instruction if (op.type == RZ_ANALYSIS_OP_TYPE_CALL) Core()->message(QString("%1 %2") .arg(addr, 8, 16, QChar('0')) .arg(Core()->disassembleSingleInstruction(addr))); addr += bytes; } return 0; } ``` ## 截图 ### Windows ![ScreenshotWin](https://static.pigsec.cn/wp-content/uploads/repos/cas/a1/a17a58dbf3ee2769e7b20b83c3c507ee646e5655c1f2284d44e22d29920e16c1.png) ### macOS ![ScreenshotMac](https://static.pigsec.cn/wp-content/uploads/repos/cas/b4/b49f69ecae7643b73dd54b2637f50871c43e439c81e0c28cd6b1d4ab78d2bb4b.png) ### Linux/Ubuntu ![ScreenshotLinux](https://static.pigsec.cn/wp-content/uploads/repos/cas/c0/c0863b52131313dd59e538dce4c67464f9f0be458fc87debb5be44e0abdf8364.png) ## 安装 在 [Release](https://github.com/GeekNeo/CutterPlusPlus/releases) 页面下载软件包,并根据你运行的操作系统执行以下 symlink 命令。 ### Windows ``` mklink C:\Users\%USERNAME%\AppData\Roaming\rizin\cutter\plugins\native\Cutter++.dll DRIVE:\path\to\cutter++-xxx\Cutter++.dll ``` ### macOS ``` ln -s -f /path/to/cutter++-xxx/Cutter++.so ~/Library/Application\ Support/rizin/cutter/plugins/native ``` ### Linux/Ubuntu ``` ln -s -f /path/to/cutter++-xxx/Cutter++.so ~/.local/share/rizin/cutter/plugins/native ``` ## 安全性 Cutter++ 在 Cutter 进程内执行 C++ 脚本代码。 与原生插件一样,执行的代码具有与正在运行的应用程序相同的权限。 **仅运行受信任的代码**。 ## 构建 要构建你自己的 Cutter++ 版本,请确保提供了所有**前置条件**: * **CMake**; * **Cutter**:官方 Cutter 产品已经包含了头文件和 cmakes,因此我们可以直接使用它; * **Qt**:你应该安装可以在 Cutter 的“关于”对话框中找到的 Qt 版本; ``` git clone --recursive --depth=1 https://github.com/GeekNeo/CutterPlusPlus.git cd CutterPlusPlus mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/path/to/Qt_DIR;/path/to/Cutter_DIR" .. cmake --build . -- -j8 ``` 新构建的裸 Cutter++ 需要 ICPP 和 Qt 相关的文件才能工作。运行你自己的版本的最简单方法是替换官方发布包中的 Cutter++.so/dll,否则你应该构建以下结构: ``` ---Cutter++.so/dll ; Cutter plugin shared library ---Cutter++ ------icpp ; icpp execution engine ------include ; Cutter++ headers ------QtCore ; QtCore headers ------QtGui ; QtGui headers ------QtWidgets ; QtWidgets headers ``` ## API ### 已实现 ``` // C style print log to Cutter's Console void print(const char *format, ...); // execute a snippet code, it will automatically wrap in a main function and add // basic Cutter's headers int exec(const char *snippet); // execute a source file int exec_file(const char *path); ``` ### 计划中 ``` currentBinary() currentFunction() currentAddress() functions() imports() exports() strings() sections() segments() comments() xrefs() graph() disassemble() decompile() patch() ``` ``` auto suspicious = cpp::functions() | std::views::filter(is_obfuscated) | std::views::transform(&Function::name); for (auto &name : suspicious) cpp::print("Suspicious function %s", name.data()); ``` ## 问题 如果你在使用 Cutter++ 时遇到任何问题,在提 issue 之前,请检查 [Bug 报告](https://github.com/GeekNeo/CutterPlusPlus/blob/main/.github/ISSUE_TEMPLATE/bug_report.md)模板,并尽可能提供详细信息。只有当我们能够重现问题时,我们才能解决它。 ## 联系方式 如果你有任何问题或想法,随时欢迎给我发邮件: ``` neoliu2011@gmail.com ``` 欢迎任何反馈。
标签:Bash脚本, C++, Cloudflare Workers, 二进制分析, 云安全运维, 云资产清单, 动态执行, 插件, 数据擦除, 逆向工程