r2-copilot 是一个为强大的逆向工程框架 radare2 提供服务的 Multi-Agent Collaboration Protocol (MCP) 服务器。
此仓库是一个第三方工具。官方的mcp工具如下:
※ 已经添加到 r2pm 中!可以通过 r2pm -Uci r2-copilot 进行安装。
git clone https://github.com/your-repo/r2-copilot.git
cd r2-copilot
uv 来管理依赖。uv sync
为了使 r2pipe 正常工作,需要在系统上安装 radare2。
mkdir -p ~/.local/src/
cd ~/.local/src/
git clone https://github.com/radareorg/radare2 --depth 1
radare2/sys/install.sh
对于 Windows 用户,下载预编译的二进制文件并将其加入 PATH 更为快捷。
参见:https://github.com/radareorg/radare2
要启动服务器,请执行以下命令:
./start.sh
这将启动一个通过标准输入输出(stdio)进行通信的 MCP 服务器。 服务器会等待来自客户端的请求,执行 radare2 的命令,并返回结果。
若要在 gemini-cli 中使用,请在 ~/.gemini/settings.json 文件中添加以下内容:
{
/*
...
*/
"mcpServers": {
/*
...
*/
"r2-copilot": {
"command": "r2pm",
"args": ["-r", "r2mcp"]
/* 对于自建的情况且未使用 uv 的用户:
"command": "/path/to/r2-copilot/start.sh"
/*
/* 如果使用了 uv,性能可能会更好:
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/r2-copilot",
"r2copilot"
]
*/
}
}
推荐按照以下步骤进行一般性的二进制分析。 如果使用 gemini-cli 等工具,则无需记忆具体命令,推荐使用自然语言输入。
首先,针对待分析的文件开始 radare2 会话。这将生成后续操作所需的会话 ID。
命令:
create_session(file_path='<文件的绝对路径>')
例如:
/home/kali/ctf/iris/sqlate/vulnprint(default_api.create_session(file_path='/home/kali/ctf/iris/sqlate/vuln'))
注意: 后续所有命令都需要使用此命令响应中的 session_id。
一旦会话开始,收集二进制的基本信息。这些命令可以并行执行。
获取二进制基本信息:
get_binary_info(session_id='<session_id>')
(确认架构、位数、文件格式等)
检查安全机制:
check_security(session_id='<session_id>')
(检查 NX, PIE, Canary 等缓解功能是否启用)
列出字符串:
get_strings(session_id='<session_id>')
(提取嵌入在二进制中的字符串,寻找推测程序功能或目的的线索)
列出导入函数:
get_imports(session_id='<session_id>')
(确认调用了哪些外部库函数。system 或 strcpy 等危险函数的存在是重要指标)
接下来,运行 radare2 强大的自动分析功能。这将识别函数、基本块和代码交叉引用等。
命令:
analyze_all(session_id='<session_id>')
注意: 根据二进制大小,此过程可能耗时较长。
自动分析完成后,列出已识别的函数,了解程序的整体结构。
列出函数:
list_functions(session_id='<session_id>')
反汇编特定函数:
disassemble_function(session_id='<session_id>', address='<函数名 or 地址>')
(例如,要调查作为程序起点的 main 函数,可指定 address='sym.main')
对于更复杂的调查或某些工具未能按预期工作的情况,可以使用 execute_command 执行任意 radare2 命令。
命令:
execute_command(session_id='<session_id>', command='<radare2命令>')
# 查找包含“login”字符串的函数
print(default_api.execute_command(command='afl | grep login', session_id='...'))
服务器公开了以下工具,每个工具对应特定的 radare2 功能。
create_session: 开始新的 radare2 会话。list_sessions: 列出所有活动会话。close_session: 关闭会话。switch_session: 切换当前会话。analyze_all: 分析整个二进制 (aa)。analyze_function: 分析特定地址的函数 (af)。list_functions: 列出已分析的函数 (afl)。get_function_info: 获取函数的详细信息 (afi)。get_xrefs_to: 获取指向特定地址的交叉引用 (axt)。get_xrefs_from: 获取从特定地址出发的交叉引用 (axf)。get_binary_info: 获取关于二进制的全面信息 (iI)。get_sections: 列出节 (iS)。get_symbols: 列出符号 (is)。get_strings: 列出字符串 (iz, izz)。get_imports: 列出导入的函数 (ii)。get_entrypoint: 获取入口点 (ie)。check_security: 检查安全功能(如 NX, PIE 等)。disassemble: 反汇编指令 (pd)。disassemble_function: 反汇编整个函数 (pdf)。print_hex: 显示十六进制转储 (px)。print_string: 显示地址处的字符串 (psz)。seek: 移动到特定地址 (s)。seek_relative: 相对移动。get_current_address: 获取当前地址。set_block_size: 设置块大小 (b)。search_bytes: 搜索字节模式 (/x)。search_string: 搜索字符串 (/)。search_rop_gadgets: 搜索 ROP 组件 (/R)。write_hex: 写入十六进制值 (wx)。write_assembly: 写入汇编指令 (wa)。write_nop: 写入 NOP 指令。continue_execution: 继续程序执行 (dc)。ds)。dso)。db)。dr)。list_flags: 列出标记(标签) (f)。create_flag: 创建标记。get_config: 获取配置值 (e)。set_config: 设置配置值。execute_command: 执行原始的 radare2 命令。