google/binexport

GitHub: google/binexport

BinExport 是用于将 IDA Pro、Ghidra 和 Binary Ninja 反汇编数据导出为 Protocol Buffer 格式的插件,主要服务于 BinDiff 二进制差异比对分析。

Stars: 1177 | Forks: 238

# BinExport 版权所有 2011-2024 Google LLC。 [![Linux 构建状态](https://github.com/google/binexport/workflows/linux-build/badge.svg)](https://github.com/google/binexport/actions?query=workflow%3Alinux-build) [![Coverity Scan 构建状态](https://scan.coverity.com/projects/8977/badge.svg)](https://scan.coverity.com/projects/google-binexport) 免责声明:这不是一个官方的 Google 产品(无论是实验性的还是其他的), 它只是恰好归 Google 所有的代码。 # 目录 * [简介](#introduction) * [安装](#installation) * [IDA Pro](#ida-pro) * [Binary Ninja](#binary-ninja) * [Ghidra](#ghidra) * [用法](#usage) * [如何构建](#how-to-build) * [准备构建环境](#preparing-the-build-environment) * [Linux](#linux) * [macOS](#macos) * [Windows](#windows) ## 简介 BinExport 是 [BinDiff](https://www.zynamics.com/software.html) 的导出组件。它是用于反汇编工具 IDA Pro、Binary Ninja 和 Ghidra 的插件/扩展,用于将反汇编数据导出为 BinDiff 所需的 Protocol Buffer 格式。 用于开源软件逆向工程套件 Ghidra 的实验版本位于 `java/BinExport` 目录中。 本代码库包含构建 Linux、macOS 和 Windows 版 BinExport 插件二进制文件所需的完整源代码。 ## 安装 ### IDA Pro 从 [releases](https://github.com/google/binexport/releases) 页面下载二进制文件,并将它们复制到 IDA Pro 插件目录。以下是默认路径: | OS | 插件路径 | | ------- | ------------------------------------------- | | Linux | `/opt/idapro-8.2/plugins` | | macOS | `/Applications/IDA Pro 8.2/idabin/plugins` | | Windows | `%ProgramFiles%\IDA 8.2\plugins` | 若仅为当前用户安装,请将文件复制到以下目录之一: | OS | 插件 | | ----------- | ------------------------------------ | | Linux/macOS | `~/.idapro/plugins` | | Windows | `%AppData%\Hex-Rays\IDA Pro\plugins` | #### 验证安装版本 1. 在 IDA 中,选择 `Help`|`About programm...` 2. 点击 `Addons...` 3. 如果安装正确,将出现以下对话框: ![IDA addons 对话框](/doc/binexport10-ida-addons-dialog.png) ### Binary Ninja 从 [releases](https://github.com/google/binexport/releases) 页面下载二进制文件,并将它们复制到 Binary Ninja 插件目录。以下是当前用户的默认路径: | OS | 插件路径 | | ------- | ----------------------------------------------------- | | Linux | `~/.binaryninja/plugins` | | macOS | `~/Library/Application Support/Binary Ninja/plugins/` | | Windows | `%AppData%\Binary Ninja\plugins` | #### 验证安装版本 1. 启动 Binary Ninja 2. 选择 `Log` 原生停靠栏。如果不可见,通过 `View`|`Native Docks`|`Show Log` 启用它。 3. 如果安装正确,日志窗口将包含类似如下的一行: ``` BinExport 12 (@internal, Jan 3 2023), (c)2004-2011 zynamics GmbH, (c)2011-2024 Google LLC. ``` ### Ghidra 1. 从 [releases](https://github.com/google/binexport/releases) 页面下载二进制文件。 2. 启动 Ghidra,选择 `File`|`Install Extensions...` 3. 在 "Install Extensions" 对话框中,点击右上角的加号图标以 "Add extension"。 4. 在 "Select extension" 对话框中,输入第 1 步中下载的 `ghidra_BinExport.zip` 的路径,然后点击 `OK`。 5. 点击两次 `OK` 以关闭 "Install Extensions" 对话框和重启 Ghidra 的提示。 6. 退出 Ghidra。 #### 验证安装版本 1. 启动 Ghidra 2. 选择 `File`|`Install Extensions...` 3. 如果安装正确,"Install Extensions" 对话框应在选中复选框旁列出 "BinExport" 扩展。 ## 用法 主要用例是通过 [BinDiff](https://zynamics.com/bindiff.html)。但是,BinExport 也可用于将反汇编导出为不同格式: * 基于 Protocol Buffer 的完整导出 * 统计文本文件 * 用于调试的文本格式 ### IDA Pro 1. 打开一个 IDA Pro 数据库 2. 选择 `Edit`|`Plugins`|`BinExport 12` 3. 将出现以下对话框: ![BinExport 插件对话框](/doc/binexport10-plugin-dialog.png) 4. 选择要导出的文件类型 #### IDC 脚本 BinExport 插件注册了以下 IDC 函数。 | IDC 函数名 | 导出为 | 参数 | | ------------------- | ------------------ | -------- | | BinExportBinary | Protocol Buffer | filename | | BinExportText | Text file dump | filename | | BinExportStatistics | Statistics text file | filename | 或者,可以通过直接调用插件的主函数从 IDC 调用该插件: ``` static main() { batch(0); auto_wait(); load_and_run_plugin("binexport12_ida", 2 /* kBinary */); qexit(0); } ``` 请注意,这确实无法提供对输出文件名的任何控制。BinExport 将始终使用当前加载数据库的文件名(不带扩展名)并附加 ".BinExport"。 #### IDAPython 参数与 IDC(上面列出)相同。 调用已注册 IDC 函数之一的示例: ``` import idaapi idaapi.ida_expr.eval_idc_expr(None, ida_idaapi.BADADDR, 'BinExportBinary("exported.BinExport");') ``` #### 插件选项 BinExport 定义了以下插件选项,可以在 IDA 的命令行中指定: | 选项 | 描述 | | -------------------------------------- | ---------------------------------------------------------------- | | `-OBinExportAutoAction:` | 调用 BinExport IDC 函数并退出 | | `-OBinExportModule:` | `BinExportAutoAction` 的参数 | | `-OBinExportLogFile:` | 将日志消息记录到文件 | | `-OBinExportAlsoLogToStdErr:TRUE` | 如果指定,也记录到标准错误输出 | | `-OBinExportX86NoReturnHeuristic:TRUE` | 启用特定于 X86 的启发式方法以识别不返回的函数 | 注意:这些选项必须位于任何文件之前。 ### Binary Ninja 目前仅有最小的 Binary Ninja UI 集成。 1. 打开或创建一个新的分析数据库 2. 选择 `Tools`|`Plugins`|`BinExport`。这将启动导出过程。 `.BinExport` 文件将放置在分析数据库旁边,位于同一目录中。 ### Ghidra 1. 打开或创建一个项目。对于新项目,首先使用 `File`|`Import File...` 导入文件。 2. 右键单击当前项目列表中的文件,然后从上下文菜单中选择 `Export...`。 3. 在 "Export" 对话框的 "Format" 下,选择 "Binary Export (v2) for BinDiff"。 4. 在 "Output File" 下,输入所需的输出文件路径。如果缺少文件扩展名,将自动附加 `.BinExport`。 5. 可选:点击 "Options..." 以设置其他导出选项。 6. 点击 "OK",然后再次点击 "OK" 以关闭 "Export Results Summary" 对话框。 #### 脚本 `BinExport.java` Ghidra 脚本可以在无头模式和 GUI 模式下运行。在 GUI 模式下,它位于脚本管理器的 `BinExport` 类别下。对于无头模式,可以使用包含以下内容(或类似内容,具体取决于您要使用的选项)的 `BinExport.properties` 文件: ``` Choose export file Export = test.BinExport Choose options IDA Pro Compatibility = "Subtract Imagebase;Remap mnemonics;Prepend Namespace to Function Names" ``` ##### 无头模式下的示例用法 创建一个项目,导入并分析二进制文件: ``` $ ./analyzeHeadless -import ``` 运行 `BinExport.java`,它将生成 `BinExport.properties` 中指定的 `.BinExport` 文件: ``` $ ./analyzeHeadless -process -propertiesPath -preScript BinExport.java -noanalysis ``` 或者,使用命令行参数代替 `BinExport.properties`: ``` $ ./analyzeHeadless -process -preScript BinExport.java test.BinExport "Prepend Namespace to Function Names" -noanalysis ``` ## 如何构建 以下是 IDA Pro 和 Binary Ninja 原生代码插件的构建说明。要构建基于 Java 的 Ghidra 扩展,请参阅 [BinExport for Ghidra](/java) 说明。 ### 准备构建环境 有相当多的依赖项需要满足: * Boost 1.83.0 或更高版本(1.83.0 的部分副本包含在 `boost_parts` 中) * [CMake](https://cmake.org/download/) 3.14 或更高版本 * 建议:[Ninja](https://ninja-build.org/) 用于快速构建 * Linux/macOS 上使用 GCC 9 或最新版本的 Clang。在 Windows 上,使用 Visual Studio 2019 编译器和 Windows SDK for Windows 10。 * Git 1.8 或更高版本 * 仅限 IDA Pro:IDA SDK 8.2 或更高版本(解压到 `third_party/idasdk`) * 将被下载的依赖项: * Abseil, GoogleTest 和 Protocol Buffers (25.2) * Binary Ninja SDK ### Linux #### 前置条件 首选的构建环境是 Debian 11 ("Bullseye")。 这应该安装所有必要的软件包: ``` sudo apt update -qq sudo apt install -qq --no-install-recommends build-essential ``` 安装最新稳定版本的 CMake: ``` wget https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-linux-x86_64.sh mkdir ${HOME}/cmake sh cmake-3.25.1-linux-x86_64.sh --prefix=${HOME}/cmake --exclude-subdir export PATH=${HOME}/cmake/bin:${PATH} ``` 以下部分假设您当前的工作目录位于克隆代码库的根目录。 #### IDA SDK 将 IDA SDK 的内容解压到 `third_party/idasdk`。显示的命令适用于 IDA Pro 8.2: ``` unzip PATH/TO/idasdk_pro82.zip -d third_party/idasdk mv third_party/idasdk/idasdk_pro82/* third_party/idasdk rmdir third_party/idasdk/idasdk_pro82 ``` #### 构建 BinExport 所有前置条件就绪后,配置并构建 BinExport 并运行其测试: ``` mkdir -p build_linux && cd build_linux cmake .. \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ "-DCMAKE_INSTALL_PREFIX=${PWD}" \ -DBINEXPORT_ENABLE_IDAPRO=ON \ "-DIdaSdk_ROOT_DIR=${PWD}/../third_party/idasdk" \ -DBINEXPORT_ENABLE_BINARYNINJA=ON \ cmake --build . --config Release ctest --build-config Release --output-on-failure cmake --install . --config Release --strip ``` 注意:如果您不想使用 Ninja 执行实际构建,请省略 `-G Ninja` 部分。 要禁用 IDA Pro 构建,设置 `-DBINEXPORT_ENABLE_IDAPRO=OFF`。同样,要禁用 Binary Ninja 构建,设置 `-DBINEXPORT_ENABLE_BINARYNINJA=OFF`。 这将下载并构建 Abseil、GoogleTest、Protocol Buffers 和 Binary Ninja API。如果一切顺利,`build_linux/binexport-prefix` 目录应包含两个文件 `binexport12_ida.so` 和 `binexport12_ida64.so`(分别用于 `ida` 和 `ida64`)以及 `binexport12_binaryninja.so`(用于 Binary Ninja)。 ### macOS #### 前置条件 首选的构建环境是使用 Xcode 15.1 的 macOS 13 "Ventura"。使用 macOS 12 "Monterey" 也应该可行。 安装 Developer Tools 后,请确保同时安装命令行工具: ``` sudo xcode-select --install ``` 以下部分假设您当前的工作目录位于克隆代码库的根目录。 #### CMake 从官方网站下载最新稳定版本的 CMake 并挂载其磁盘映像: ``` curl -fsSL https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-Darwin-x86_64.dmg \ -o $HOME/Downloads/cmake-osx.dmg hdiutil attach $HOME/Downloads/cmake-osx.dmg ``` 此时,您需要查看并接受 CMake 的许可协议。现在安装 CMake: ``` sudo cp -Rf /Volumes/cmake-3.25.1-Darwin-x86_64/CMake.app /Applications/ hdiutil detach /Volumes/cmake-3.25.1-Darwin-x86_64 sudo /Applications/CMake.app/Contents/bin/cmake-gui --install ``` 最后一条命令使 CMake 在系统路径中可用。 #### IDA SDK 将 IDA SDK 的内容解压到 `third_party/idasdk`。显示的命令适用于 IDA Pro 8.2: ``` unzip PATH/TO/idasdk_pro82.zip -d third_party/idasdk mv third_party/idasdk/idasdk_pro82/* third_party/idasdk rmdir third_party/idasdk/idasdk_pro82 ``` #### 构建 BinExport 所有前置条件就绪后,配置并构建 BinExport 并运行其测试: ``` mkdir -p build_mac && cd build_mac cmake .. \ -DCMAKE_BUILD_TYPE=Release \ "-DCMAKE_INSTALL_PREFIX=${PWD}" \ -DBINEXPORT_ENABLE_IDAPRO=ON \ "-DIdaSdk_ROOT_DIR=${PWD}/../third_party/idasdk" \ -DBINEXPORT_ENABLE_BINARYNINJA=ON \ cmake --build . --config Release -- "-j$(sysctl -n hw.logicalcpu)" ctest --build-config Release --output-on-failure cmake --install . --config Release --strip ``` 注意:这将使用标准的 CMake "Makefile Generator"。您也可以使用 XCode 或 Ninja 作为生成器。 要禁用 IDA Pro 构建,设置 `-DBINEXPORT_ENABLE_IDAPRO=OFF`。同样,要禁用 Binary Ninja 构建,设置 `-DBINEXPORT_ENABLE_BINARYNINJA=OFF`。 这将下载并构建 Abseil、GoogleTest、Protocol Buffers 和 Binary Ninja API。如果一切顺利,`build_mac/binexport-prefix` 目录应包含两个文件 `binexport12_ida.dylib` 和 `binexport12_ida64.dylib`(分别用于 `ida` 和 `ida64`)以及 `binexport12_binaryninja.dylib`(用于 Binary Ninja)。 ### Windows 首选的构建环境是使用 Visual Studio 2022 编译器和 [Windows SDK for Windows 10](https://dev.windows.com/en-us/downloads/windows-10-sdk) 的 Windows 10(64 位 Intel)。 #### CMake 从其[下载页面](https://cmake.org/download/)下载并安装最新的稳定版 CMake(撰写本文时为 3.25.1)。确保选择 "Add CMake to the system PATH for all users"。 #### Git 从其[下载页面](https://git-scm.com/download/win)下载并安装 Git。确保选择以下选项: * 安装目录应保留在默认的 `%ProgramFiles%\Git\bin\git.exe` * "Use Git from the Windows Command Prompt" - 让安装实用程序将 Git 添加到您的系统路径。 * "Use Windows' default console window" - 以便能够从常规命令提示符使用 Git。 #### 准备 以下部分假设打开了一个命令提示符,其当前工作目录位于克隆的 BinExport 代码库的根目录: ``` git clone https://github.com/google/binexport.git cd binexport ``` #### IDA SDK 将 IDA SDK 的内容解压到 `third_party/idasdk`。显示的命令适用于 IDA Pro 8.2,假设 Git 首先安装到了默认目录: ``` "%ProgramFiles%\Git\usr\bin\unzip" PATH\TO\idasdk_pro82.zip -d third_party rename third_party\idasdk_pro82 idasdk ``` #### 构建 BinExport 所有前置条件就绪后,配置并构建 BinExport: ``` if not exist build_msvc mkdir build_msvc cd build_msvc cmake .. ^ -G "Visual Studio 17 2022" ^ -DCMAKE_BUILD_TYPE=Release ^ "-DCMAKE_INSTALL_PREFIX=%cd%" ^ -DBINEXPORT_ENABLE_IDAPRO=ON ^ -DIdaSdk_ROOT_DIR=%cd%\..\third_party\idasdk ^ -DBINEXPORT_ENABLE_BINARYNINJA=ON cmake --build . --config Release -- /m /clp:NoSummary;ForceNoAlign /v:minimal ctest --build-config Release --output-on-failure cmake --install . --config Release --strip ``` 注意:这将使用 CMake "Visual" 生成器。您也可以使用 Ninja 生成器。 要禁用 IDA Pro 构建,设置 `-DBINEXPORT_ENABLE_IDAPRO=OFF`。同样,要禁用 Binary Ninja 构建,设置 `-DBINEXPORT_ENABLE_BINARYNINJA=OFF`。 这将下载并构建 Abseil、GoogleTest、Protocol Buffers 和 Binary Ninja API。如果一切顺利,`build_msvc/binexport-prefix` 目录应包含两个文件 `binexport12_ida.dll` 和 `binexport12_ida64.dll`(分别用于 `ida.exe` 和 `ida64.exe`)以及 `binexport12_binaryninja.dll`(用于 Binary Ninja)。
标签:Bash脚本, Binary Ninja, BinDiff, DAST, Ghidra, Google, IDA Pro, JS文件枚举, Nuclei, Wayback Machine, 二进制分析, 二进制静态分析, 云安全运维, 云资产清单, 代码导出, 协议缓冲区, 反汇编, 恶意软件分析, 情报收集, 插件, 漏洞研究, 逆向工程