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

### macOS

### Linux/Ubuntu

## 安装
在 [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, 二进制分析, 云安全运维, 云资产清单, 动态执行, 插件, 数据擦除, 逆向工程