项目简介

ReVA (Reverse Engineering Assistant) 是一个开源项目,旨在构建一个不依赖特定模型的AI助手,专注于逆向工程任务。它以一个基于 Model Context Protocol (MCP) 的服务器形式存在,作为一个Ghidra扩展运行。ReVA 通过向大型语言模型 (LLM) 客户端暴露一系列精心设计的工具和资源,使得LLM能够访问和操作Ghidra内部的逆向工程数据,从而协助完成复杂的分析任务。

主要功能点

ReVA 作为MCP服务器,通过提供以下功能为LLM客户端赋能:

  • 程序信息访问: 获取Ghidra中当前打开的程序列表及其基本信息。
  • 项目文件浏览: 列出Ghidra项目中特定文件夹或整个项目的文件和目录。
  • 内存数据读取: 根据地址读取程序的内存内容,并支持多种格式显示。
  • 内存块列表: 获取程序的内存块列表及其属性(如读、写、执行权限)。
  • 符号信息查询: 列出程序中的符号(如函数、标签、数据)及其地址、类型、命名空间等,支持过滤和分页。
  • 函数信息获取: 列出程序中的函数,包括名称、地址、大小、签名、参数等,支持过滤。
  • 代码反编译/汇编: 获取指定函数的反编译C代码和汇编代码。
  • 变量重命名: 允许LLM根据分析结果建议,对函数中的变量进行重命名。
  • 字符串查找: 列出程序中识别出的字符串,支持分页以处理大量数据。
  • 交叉引用查询: 获取指定地址或符号的引用关系(谁调用/访问了它,它调用/访问了谁)。
  • 数据类型管理: 列出Ghidra中可用的数据类型存档,并查询存档中的数据类型。
  • 应用数据类型: 允许LLM根据分析结果,在特定地址或符号位置应用预定义的数据类型。
  • 创建标签: 允许LLM在指定地址创建标签。

这些功能以标准化的MCP工具和资源形式提供,使得任何支持MCP的LLM客户端都能利用ReVA来与Ghidra进行交互,执行逆向工程分析任务。

安装步骤

ReVA 是一个 Ghidra 扩展,需要安装在 Ghidra 反编译平台中。目前 ReVA 支持 Ghidra 11.3 及以上版本。

安装方法:

  1. 下载发布版本: 从 ReVA 的 GitHub Release 页面下载与你的 Ghidra 版本对应的扩展包(通常是一个'.zip'文件)。
  2. 打开 Ghidra 扩展管理器: 在 Ghidra 中,导航到 'File' -> 'Install Extensions...'。
  3. 安装扩展: 在弹出的窗口中,点击绿色的加号图标('+'),选择你下载的 ReVA 扩展 '.zip' 文件,然后点击 'OK'。
  4. 重启 Ghidra: 安装完成后,需要重启 Ghidra 使扩展生效。

或者,你可以从源代码构建:

  1. 克隆仓库: 'git clone https://github.com/cyberkaida/reverse-engineering-assistant.git'
  2. 进入目录: 'cd reverse-engineering-assistant'
  3. 设置 Ghidra 安装路径: 确保 'GHIDRA_INSTALL_DIR' 环境变量指向你的 Ghidra 安装目录。例如:'export GHIDRA_INSTALL_DIR=/path/to/ghidra'
  4. 运行构建脚本: './gradlew' (或 'gradle' 如果已添加到PATH)
  5. 安装扩展: 构建成功后,扩展文件会在 'dist/' 目录生成。按照上面的步骤通过 Ghidra 扩展管理器安装 'dist/reva-<版本号>.zip' 文件。
  6. 重启 Ghidra: 重启 Ghidra 使扩展生效。

安装并重启 Ghidra 后,ReVA 插件会自动运行并尝试启动 MCP 服务器。

服务器配置 (供 MCP 客户端使用)

ReVA 插件启动后,会自动在其默认端口 '8080' (可在 Ghidra 设置中修改) 通过 SSE 传输协议暴露 MCP 服务。你的 MCP 客户端(如支持 MCP 的 LLM 应用或终端)需要配置连接到 ReVA 服务器。

以下是 MCP 客户端配置所需的基本信息及示例(请根据你使用的 MCP 客户端软件的文档进行具体配置):

  • 服务器名称 (name): 'ReVa' (这是LLM客户端用来引用此服务器的名称)
  • 传输协议和地址: ReVA 默认使用 SSE (Server-Sent Events) 协议,监听地址为 'http://localhost:8080/mcp/sse'。
  • 连接命令 (command/args): 对于不支持 SSE 原生连接的客户端,可以使用 'mcp-remote' 工具作为代理。

例如,对于需要使用 'mcp-remote' 的客户端 (如 Claude、oterm): MCP配置通常是一个JSON文件或JSON结构,你需要添加一个服务器配置块,类似这样:

{
  "mcpServers": [
    {
      "name": "ReVa", // 服务器名称,用于客户端识别
      "command": "npx", // 启动连接代理的命令
      "args": [ // 传递给命令的参数
        "-y",
        "mcp-remote",
        "http://localhost:8080/mcp/sse" // ReVA服务器的地址
      ]
    }
    // ... 其他MCP服务器配置
  ]
}

解释:

  • 'name': 客户端中显示和使用的服务器名称。
  • 'command': 客户端启动一个外部进程来处理连接。这里使用 'npx' 来执行 'mcp-remote' 工具。你需要确保 Node.js 和 npm/npx 已安装。
  • 'args': 'npx' 命令的参数,'-y mcp-remote' 表示自动安装并运行 'mcp-remote','http://localhost:8080/mcp/sse' 是 ReVA 服务器监听的实际地址。

对于支持 SSE 原生的客户端 (如 VSCode): 配置会更简单,直接指定类型和URL:

{
  "mcp": {
    "servers": {
      "ReVa": { // 服务器名称
        "type": "sse", // 传输协议类型
        "url": "http://localhost:8080/mcp/sse" // ReVA服务器的地址
      }
    }
  }
  // ... 其他MCP配置
}

注意: 具体的配置位置和格式请参考你使用的 MCP 客户端软件的官方文档。确保 Ghidra 正在运行并且 ReVA 插件已加载。

基本使用方法

一旦 ReVA 作为 Ghidra 扩展安装并启动,并且你的 MCP 客户端已配置连接到 ReVA,你就可以通过客户端与 ReVA 交互。

通常,这意味着你可以在 LLM 客户端中向模型提问,模型将识别 ReVA 提供的工具和资源,并在需要 Ghidra 中的逆向工程上下文时自动调用 ReVA 的工具。

例如,你可以直接在LLM客户端中询问:

  • "Get the list of open programs from ReVa." (可能会调用 'list-open-programs' 工具或读取 'ghidra://programs' 资源)
  • "Using the 'get-functions' tool from ReVa, list the functions in program '/path/to/my_program.reva' filtering out default names." (这会提示LLM调用 'get-functions' 工具)
  • "Decompile the function named 'main' in '/path/to/my_program.reva'." (LLM可能会调用 'get-decompiled-function' 工具)
  • "What are the interesting strings in '/path/to/my_program.reva'?" (LLM可能会调用 'get-strings' 或 'get-strings-count' 工具)
  • "Read 32 bytes of memory at address 0x401000 in '/path/to/my_program.reva'." (LLM可能会调用 'read-memory' 工具)

LLM会根据你的提问、其内置能力以及 ReVA 提供的工具描述来决定调用哪个工具,并解析工具返回的结果,将其整合到回复中。ReVA 在后台与 Ghidra 交互,执行实际的逆向工程操作并将结果返回给 LLM。

确保你在Ghida中打开了你想让LLM分析的程序,并在命令中提供正确的程序路径(即程序在Ghidra项目中的路径,例如 '/my_project/my_program.reva')。你可以使用 'list-project-files' 或 'list-open-programs' 工具来查找正确的程序路径。

信息

分类

AI与计算