目录导航
关于Cutter
Cutter是Rizin提供支持的Qt和C ++ GUI。其目标是在牢记用户体验的同时,打造一个先进的,可定制的FOSS逆向工程平台。Cutter是由逆向工程师为逆向工程师创建的。
Cutter由其开发人员团队积极维护,并每隔约5周发布一次新功能。自然,Cutter享受其核心Rizin的快速发展。这使该项目成为最积极开发的RE框架之一。
我们很高兴发布Cutter v2.0,这是使用Rizin作为其核心后端的Cutter的第一个版本。自创建rade2并创建Rizin以来,我们投入了无数时间来改善项目的功能,整体稳定性以及我们的工作方式。发行Cutter 2.0对我们来说是一个重要的里程碑,因为我们相信,我们对核心Rizin和Cutter本身所做的最新改进是创建更好的逆向工程软件的起点。
你们中的许多人都在等待我们与Rizin一起发布的第一版,现在终于到了时候。在这篇文章中,我们记下了我们对Cutter所做的一些最新更改以及您在新版本中应该看到的内容。要查看详细的变更日志或下载Cutter 2.0,请查看GitHub上的发行版!
官网地址
强调
使用Project保存和加载您的工作
在逆向工程会议期间,至关重要的是能够通过注释(例如注释,函数和变量名)跟踪所获得的知识。因此,正在使用的工具还需要提供一种可靠且面向未来的方式来保存和恢复此信息。此功能对我们和我们的用户都非常重要,并且经常需要社区的要求。
在此发行版之前,Cutter仅提供了一个基本且不可靠的支持来保存用户在项目中的工作,这是radare2提供的功能。当Rizin从radare2派生出来时,团队决定创建一种可靠的机制来从头开始保存和加载项目。在rizin的博客上发布的专门帖子中介绍了此新创建的项目功能的技术细节。
Cutter 2.0引入了对Projects的全面支持,现在您可以无缝保存和加载工作。该功能处于beta支持状态,将一直持续到Rizin的第一个主要版本(v1.0)。
顺便说一句,由于Cutter直接使用Rizin的项目格式,因此可以将直接在命令行Rizin中创建的项目直接加载到Cutter中,反之亦然,这使您可以随时在两种工具之间进行更改。
保存项目
将您的工作保存在项目中既简单又直观。单击“文件”菜单,然后选择“保存项目”或“将项目另存为”。这将打开一个对话框,询问您要将新项目保存在何处。Rizin和Cutter项目的扩展名是.rzdb
。
那些希望使用键盘快捷键的人可以Ctrl + S
用来保存项目。在工作期间,您可以多次使用这些快捷方式将更改保存到项目文件中。
载入项目
在Cutter中打开项目可以通过两种方式完成。第一个是在Cutter的打开对话框的“项目”选项卡中。为此,请打开Cutter,然后单击“项目”选项卡。在这里,您将看到您创建或加载的最新项目。双击一个项目,或单击“选择”,然后从对话框中选择另一个项目文件。
在Cutter中打开项目的第二个选项是通过命令行。为此,请使用-p
或--project
标志运行Cutter :
cutter -p demo.rzdb
Cutter现在支持反向调试
我们在此版本中非常兴奋的另一个功能是在所有调试后端(包括远程和ESIL)中添加了反向调试。反向调试允许您向后移动程序计数器,并在该点将程序状态恢复为已保存状态。
调试工具栏现在包括启动“跟踪会话”的选项,该选项可启用反向调试:
一旦开始跟踪会话,Cutter就会开始记录程序的内存并从当前程序计数器中注册更改。这使您可以向后退一步,并继续向后退一步,以恢复程序状态,直到跟踪会话的第一条记录指令为止:
当退后一步或继续前进时,我们在记录的会话中定位目标指令,并恢复到该点的寄存器和存储器的状态。重要的是要注意,Cutter不会处理诸如信号或系统调用之类的不确定事件。
继续回到未来
与常规继续类似,向后继续当前仅由于中断(通过单击“挂起过程”按钮)或断点而停止。否则,它将一直返回到会话的第一条指令。
由于Cutter在每条指令处停止以记录内存并在继续操作时记录更改,因此这可能会大大减慢两点之间的遍历速度。为了解决此问题,我们还向dbg.trace_continue
调试设置添加了(default = true)标志。该标志允许用户仅在两个状态之间保存程序的状态:第一个状态是继续之前的原始程序计数器位置,第二个状态是运行的目的地。这意味着向后退一步也将返回到最后记录的点,然后再继续,如图所示:
与继续执行dbg.trace_continue=true
以下操作后可以退回到任何点相比:
改善重命名工作流程
去年,我们问过您希望在Cutter中得到哪些改进。你们中的许多人都提到,重命名的基本工作流程不是用户友好的,可以改进。实际上,在最近几个月中,我们一直在进行改进,并创建了更简单的重命名工作流程,您可以N
在其中的反汇编中的许多位置按以重命名功能,标志等。您也可以用于N
在某些地址中添加新标志。
在Cutter中进行重命名时,还有更多改进要做,例如在反编译器中为重命名符号和重命名信息提供了更好的支持。我们计划在将来的版本中改进这些方面。
图表视图中的基本块标题
Cutter v2.0中添加的一项新功能是可以在“图形”视图中显示基本块偏移的选项。启用后,每个基本块的起始地址将显示在顶部。可以从首选项视图启用或禁用此功能:编辑→首选项→反汇编→图形→显示每个图形块中第一条指令的偏移量。
将鼠标悬停在地址上即可查看其内容
Cutter的功能窗口小部件具有一项功能,该功能允许用户通过将鼠标悬停在列表中的功能名称上来预览功能的内容。现在,在我们的新发行版中,我们扩展了此功能并增加了对功能,标志或地址内容的预览的支持,方法是将它们悬停在反汇编视图中。这将使您能够快速查看目标地址中的数据和代码,而无需导航到该地址。
多个表视图中的新注释列
我们改进了多个表格视图小部件,现在可以显示在这些地址中添加的注释。例如,如果用户将注释添加到字符串或标志的偏移量,则注释将显示在列表中。
Cutter下载地址
GitHub: https://github.com/rizinorg/cutter
Cutter-v2.0.0-x64.Linux.AppImage 110 MB
Cutter-v2.0.0-x64.macOS.dmg 51 MB
Cutter-v2.0.0-x64.Windows.zip 62.9 MB
Source code(zip)
Source code(tar.gz)
cutter插件
github.com/rizinorg/cutter-plugins
反编译器
吉德拉反编译器
这是针对Cutter和radare2的Ghidra反编译器的集成。它完全基于Ghidra的反编译器部分,该部分完全用C ++编写,因此根本不需要Ghidra本身或JAVA,并且插件可以独立构建。
由于其质量,默认情况下,Cutter版本中附带了ghidra decompiler插件。
类型:插件
状态:已维护
参考:Cutter v1.9中宣布的r2ghidra插件
RetDec反编译器
该插件将RetDec反编译器集成到Cutter中。
使用捆绑版本的RetDec,您可以反编译以下体系结构:
- 32位:Intel x86,ARM,MIPS,PIC32和PowerPC。
- 64位:x86-64,ARM64(AArch64)。
类型:插件
状态:已维护
r2dec
r2dec将函数的汇编转换为伪C代码。Cutter默认情况下集成r2dec。
类型:插件
状态:已维护
讨论:如何不编写反编译器-r2con 2018
整合方式
Jupyter插件
该插件将Jupyter笔记本集成在Cutter中
状态:已维护
x64dbgcutter
允许在Cutter中导入和导出x64dbg注释和断点
状态:已维护
Yara插件
一个Cutter插件,用于在运行时将项目与Yara规则进行匹配。
状态:已维护
Hyara
Hyara是一个插件,可以方便地从Cutter内部编写和测试Yara规则。
类型:插件
状态:WIP
AngrCutter
使用Angr向Cutter的调试器中添加动态符号执行的插件。
状态:已维护
霍比特人插件
一个将霍比特人显示添加到Cutter的插件。
状态:在制品
卡帕探险家
Capa是一个框架,它使用定义明确的规则集合来标识程序中的功能。您可以针对PE文件或Shellcode运行该插件,它会告诉您它认为程序可以做什么。
类型:插件
状态:已维护
恶意软件分析
APT32图形去混淆器
Cutter和Radare2的插件,用于对APT32流程图进行模糊处理。这是Cutter的python插件,也与radare2的r2pipe脚本兼容。该插件将帮助反向工程师对APT32(大洋莲花)样本进行模糊化处理并删除其中的垃圾块。
类型:插件
状态:维护的
文章:带切割器和Radare2的APT32流程图
Dropshot / StoneDrill解密器
这是一个基于r2pipe的脚本,用于解密Dropshot APT恶意软件中的字符串和资源。
类型:脚本
状态:维护
文章:
去混淆Bitpaymer API调用
Bitpaymer(v2)中API调用的反混淆脚本
类型:脚本
参考:https : //twitter.com/FraMauronz/status/1005138478261309440
覆盖范围
刀盘
CutterDrcov是代码覆盖率插件,可将DynamoRIO drcov可视化为Cutter静态分析。
类型:插件
状态:已维护
刀具灯塔
此Pull Request仍在进行中。
类型:插件
状态:WIP
增强功能
刀具参考
刀具全指令参考插件。该插件将监视您的光标的位置,并显示说明的完整文档。目前,它仅支持x86-64,ARM和MIPS 32位,但是添加对其他体系结构的支持相对容易。
类型:插件
状态:已维护
装配参考
Cutter插件,显示有关当前所选汇编指令的信息(仅适用于x86和x64)
类型:插件
状态:已维护
恢复堆栈字符串
剪切脚本以注释在堆栈上手动创建的字符串的值。
类型:脚本
状态:已维护
图表
刀具深图
一个Cutter插件来生成radare2图形。它还提供了一个称为Deep callgraph的新图,该图从当前函数构建一个深度callgraph,并递归添加其被调用者的调用。
类型:插件
状态:已维护
杂项
刀具插件模板
Python和C ++示例插件开始。
类型:插件
状态:已维护
Cutter安装方法
获取源¶
确保已git
安装在系统中(安装指南),然后执行以下操作:
git clone --recurse-submodules https://github.com/rizinorg/cutter
这将克隆切刀源及其依赖(rizin等)下刀,你应该看到下面的目录结构:
cutter/-| |-docs/ # Cutter Documentation |-rizin/ # Rizin submodule |-src/ # Cutter Source Code
以下各节假定裁纸器是您的工作目录。(如果没有,请执行)cd cutter
在Linux上构建
要求
在Linux上,您需要:
- build-essential
- cmake
- meson
- libzip-dev
- libzlib-dev
- qt5
- qt5-svg
- pkgconf
- curl*
- python-setuptools*
- KSyntaxHighlighter**
- graphviz**
*建议在使用make
/进行构建时使用Cmake
。
**可选。如果存在,这些将为Cutter添加额外的功能。请参阅CMake构建选项。
在基于Debian的Linux发行版上,可以使用以下单个命令安装所有这些基本软件包:
sudo apt install build-essential cmake meson libzip-dev zlib1g-dev qt5-default libqt5svg5-dev qttools5-dev qttools5-dev-tools
笔记
对于Ubuntu 18.04及更低版本,meson
应安装。pip install --upgrade --user meson
在基于Arch的Linux发行版上:
sudo pacman -Syu --needed base-devel cmake meson qt5-base qt5-svg qt5-tools
构建步骤
在Linux上构建Cutter的推荐方法是使用CMake。只需调用CMake即可构建Cutter及其依赖Rizin。
mkdir build && cd build cmake .. cmake --build .
如果您的操作系统具有较新版本的CMake(> v3.12),则可以使用以下更清洁的解决方案:
cmake -B build cmake --build build
如果要在其他版本的Rizin中使用Cutter,则可以进行设置-DCUTTER_USE_BUNDLED_RIZIN=OFF
。请注意,使用的Rizin版本不是Cutter使用的版本,可能会导致问题,并且编译可能会失败。
笔记
如果您对构建支持Python插件,语法突出显示,崩溃报告等的Cutter感兴趣,请查看CMake Building Options的完整列表。
构建过程完成后,您应该Cutter
在构建目录中包含可执行文件。您现在可以像这样执行Cutter:
./build/cutter
制作Linux发行版特定的软件包
制作特定于发行版的软件包时,默认安装目标应为您提供一个良好的起点。它使用CMake内置功能和GNUInstallDirs来安装可执行文件,桌面文件,标头和插件编译所需的其他文件。请参阅CMake文档以调整已安装文件的位置和属性。不需要从普通版本中手动复制文件。
建议将rizin作为单独的软件包进行构建和打包,以便无论是否使用Cutter都可以使用它。这样做还可以更好地控制rizin依赖项的处理方式。我们正在努力与Cutter发行时的最新rizin版本保持兼容性,并在发行新的rizin版本时制作新的Cutter版本。
如果要打包Cutter,并且还可以将rz-ghidra和jsdec反编译器打包为可选包,则用户会喜欢的。可以在不直接访问Cutter源代码的情况下针对正确的Cutter安装来编译Cutter插件。
如果名称“ Cutter”或“ cutter”与其他软件包或其内容冲突,则可以使用“ rz-cutter”。包装配置
-DCMAKE_BUILD_TYPE=Release
除非发行版对常见的编译器选项有更具体的指导,否则请打开发行优化。CUTTER_USE_BUNDLED_RIZIN=OFF
从子模块中关闭对rizin的使用,以使用以前打包的rizin。请注意,保持打开状态不会以适合Linux打包的方式安装rizin,而无需执行其他手动步骤,从而使打包过程更加复杂。捆绑的rizin也可能与独立的rizin软件包冲突。- 正确的安装前缀。默认情况下,CMake将安装到/ usr / local以适合用户构建。根据您的发行包装指南进行更改。
CUTTER_ENABLE_PYTHON
并且CUTTER_ENABLE_PYTHON_BINDINGS
建议打开以获取完整的用户体验。可能需要在具有多个python版本的发行版上手动指定路径。CUTTER_ENABLE_GRAPHVIZ
和CUTTER_ENABLE_KSYNTAXHIGHLIGHTING
可选的,但很高兴,因为它们在大多数发行版中都可用。CUTTER_EXTRA_PLUGIN_DIRS
如果发行版包装指南要求您将其放置在Cutter默认不使用的位置,则可使用它来指定其他插件搜索位置。
在Windows上构建
要求
切纸器可在Windows 7或更高版本上使用。要编译Cutter,必须安装以下软件:
- A version of Visual Studio (2015, 2017 and 2019 are supported)
- CMake
- Qt 5
- Meson
- Ninja
构建步骤
要使用CMake在Windows机器上构建Cutter,您必须确保可执行文件在您的%PATH%
环境变量中可用。
您可以通过打开PowerShell并执行以下命令来检查二进制文件是否可用。
ninja --version meson --version cmake --version
如果它们不可用,则可以使用PowerShell将它们一一添加到您的PATH中:
$Env:Path += ";C:\enter\path\here"
请注意,以下路径可能会根据您的Qt和Visual Studio版本而有所不同。
# First, set CMAKE_PREFIX_PATH to Qt5 intallation prefix $Env:CMAKE_PREFIX_PATH = "C:\Qt\5.15.2\msvc2019_64\lib\cmake\Qt5" # Then, add the following directory to your PATH $Env:Path += ";C:\Qt\5.15.2\msvc2019_64\bin" # Build Cutter cmake -B build cmake --build build
编译完成后,cutter.exe
二进制文件将在中提供.\build\Debug\cutter.exe
。
在macOS上构建
要求
- XCode
- CMake
- Qt
- meson
- ninja
对于基本构建,可以使用自制软件安装除XCode以外的所有依赖项:
brew install cmake qt5 meson ninja
开发者推荐的构建方式
mkdir build cd build cmake .. -DCMAKE_PREFIX_PATH=/local/opt/qt5 make
CMake的建筑选择
请注意,有一些主要的建筑选择可用:
CUTTER_USE_BUNDLED_RIZIN
从子模块自动编译Rizin(默认情况下启用)。CUTTER_ENABLE_PYTHON
在Python支持下进行编译。CUTTER_ENABLE_PYTHON_BINDINGS
使用Shiboken2自动生成Python绑定,这对于Python插件是必需的!CUTTER_ENABLE_KSYNTAXHIGHLIGHTING
使用KSyntaxHighlighting突出显示代码。CUTTER_ENABLE_GRAPHVIZ
为图形布局启用Graphviz。CUTTER_EXTRA_PLUGIN_DIRS
附加插件位置列表。为具有严格的程序包布局规则的Linux发行版准备程序包时很有用。
Cutter二进制发布选项,对于大多数用户而言不是必需的,并且在CI环境之外可能无法轻松使用:
CUTTER_ENABLE_CRASH_REPORTS
用于在启用了崩溃处理系统(Breakpad)的情况下编译Cutter。CUTTER_ENABLE_DEPENDENCY_DOWNLOADS
启用依赖项下载。设置为OFF不会影响Rizin build进行的任何下载。此选项用于准备Cutter二进制发行包。默认关闭。CUTTER_PACKAGE_DEPENDENCIES
在安装步骤中,包括第三方依赖项。此选项用于准备Cutter二进制发行包。
可以从传递给CMake的命令行参数启用或禁用这些选项。例如,要构建支持Python插件的Cutter,可以运行以下命令:
cmake -B build -DCUTTER_ENABLE_PYTHON=ON -DCUTTER_ENABLE_PYTHON_BINDINGS=ON
或者,如果要显式禁用某个选项,请执行以下操作:
cmake -B build -DCUTTER_ENABLE_PYTHON=OFF
具有Breakpad支持的编译器
如果要使用崩溃处理系统构建Cutter,则首先需要准备Breakpad。为此,只需从根Cutter目录运行一个脚本(根据您的操作系统):
source scripts/prepare_breakpad_linux.sh # Linux source scripts/prepare_breakpad_macos.sh # MacOS scripts/prepare_breakpad.bat # Windows
然后,如果您在Linux上构建,则需要更改PKG_CONFIG_PATH
环境变量,使其包含$CUSTOM_BREAKPAD_PREFIX/lib/pkgconfig
。为此,只需运行
export PKG_CONFIG_PATH="$CUSTOM_BREAKPAD_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
故障排除
- CMake找不到QtCMake:找不到Qt开发包
根据Qt的安装方式(发行软件包或使用Qt安装程序),如果不在常见位置,CMake可能无法自行找到它。如果是这种情况,请仔细检查是否安装了正确的Qt版本。找到其前缀(包含bin /,lib /,include /等的目录),并CMAKE_PREFIX_PATH
在上述过程中将其指定为CMake ,例如:
rm CMakeCache.txt # the cache may be polluted with unwanted libraries found before cmake -DCMAKE_PREFIX_PATH=/opt/Qt/5.9.1/gcc_64 ..
- 运行Cutter时找不到Rizin的librz _ *。so./cutter:加载共享库时出错:librz_lang.so:无法打开共享库文件:没有这样的文件或目录
找不到确切的Rizin .so文件可能会有所不同。在某些系统上,链接器默认情况下使用RUNPATH而不是RPATH,这与Rizin当前的编译方式不兼容。这导致在运行裁切器时找不到某些Rizin库。您可以通过运行ldd ./cutter来验证是否是问题所在。如果缺少所有Rizin库,那么您会遇到另一个问题。解决方法是在编译Cutter时添加–disable-new-dtags链接器标志,或者将Rizin安装路径添加到LD_LIBRARY_PATH环境变量。
cmake -DCMAKE_EXE_LINKER_FLAGS="-Wl,--disable-new-dtags" ..
- rz _ *。h:没有这样的文件或目录例如:rz_util / rz_annotated_code.h:没有这样的文件或目录
如果遇到错误,rz_
丢失了一些开头的头文件,则应检查rizin子模块,并确保它与上游Cutter存储库同步。只需运行:
git submodule update --init --recursive
- 找不到rz_core开发包
如果您安装了Rizin并仍然遇到此错误,则可能是您的 PATH
环境变量设置不正确(不包含 /usr/local/bin
)。您可以通过将Rizin安装目录添加到PATH
变量中来解决此问题。
macOS特定解决方案:
在macOS上,例如,也可能是由于将 其复制到。要解决此问题,请在Qt Creator的“构建环境”部分中将其追加 到变量中。如果遇到任何问题,请参见下面的屏幕截图。Qt Creator.app
/Applications
:/usr/local/bin
PATH
您也可以尝试:
PKG_CONFIG_PATH=$HOME/bin/prefix/rizin/lib/pkgconfig cmake ...
您也可以将Rizin安装到中/usr/lib/pkgconfig/
,然后添加一个PKG_CONFIG_PATH
带有value的变量/usr/lib/pkgconfig/
。
- macOS libjpeg错误
在macOS上,如果您libjpeg
安装了brew ,则Qt5应用程序无法在QtCreator上构建。运行以下命令来解决此问题:
sudo mv /usr/local/lib/libjpeg.dylib /usr/local/lib/libjpeg.dylib.not-found