此仓库包含一个 Binary Ninja 插件、MCP 服务器和桥接组件,使 Binary Ninja 的功能能够无缝集成到您最喜欢的 LLM 客户端中。

查看 YouTube 上的演示视频,该视频使用扩展程序解决了一个 CTF 挑战。
此仓库包含两个独立的组件:
在安装 Binary Ninja MCP 之前,请先安装 MCP 客户端,以便 MCP 客户端可以自动设置。我们目前支持以下 MCP 客户端的自动设置:
1. Cline(推荐)
2. Roo Code
3. Claude Desktop(推荐)
4. Cursor
5. Windsurf
6. Claude Code
7. LM Studio
在安装 MCP 客户端后,您可以使用 Binary Ninja 插件管理器或手动安装 MCP 服务器。两种方法都支持 MCP 客户端的自动设置。
如果您的 MCP 客户端未设置,请先安装它,然后再尝试重新安装扩展。
您可以通过 Binary Ninja 的插件管理器 (Plugins > Manage Plugins) 安装扩展。

要手动安装扩展,可以将此仓库复制到 Binary Ninja 插件文件夹。
如果您使用的是支持的 MCP 客户端,并且按照安装步骤操作,则无需手动设置。
您还可以从命令行管理 MCP 客户端条目:
python scripts/mcp_client_installer.py --install # 自动设置支持的 MCP 客户端
python scripts/mcp_client_installer.py --uninstall # 删除条目并删除 `.mcp_auto_setup_done`
python scripts/mcp_client_installer.py --config # 打印通用的 JSON 配置片段
对于其他 MCP 客户端,这是一个示例配置:
{
"mcpServers": {
"binary_ninja_mcp": {
"command": "/ABSOLUTE/PATH/TO/Binary Ninja/plugins/repositories/community/plugins/fosdickio_binary_ninja_mcp/.venv/bin/python",
"args": [
"/ABSOLUTE/PATH/TO/Binary Ninja/plugins/repositories/community/plugins/fosdickio_binary_ninja_mcp/bridge/binja_mcp_bridge.py"
]
}
}
}
注意:请将 /ABSOLUTE/PATH/TO 替换为您项目的实际绝对路径。必须使用虚拟环境中的 Python 解释器来访问已安装的依赖项。
现在您可以开始对当前打开的二进制文件(或多个二进制文件)进行提示。示例如下:
你是世界上最好的 CTF 玩家。请使用 Binary Ninja 解决位于 <folder_name> 文件夹中的这个逆向 CTF 挑战。在分析过程中重命名所有函数和变量(除了 main 函数),以便我可以更好地阅读代码。如果需要,编写一个 Python 解决脚本。另外,如果需要创建结构体或其他内容,请继续进行。像人类逆向工程师一样反编译代码,以便我可以阅读经过您分析的反编译代码。
您的任务是分析当前在 Binary Ninja 中打开的一个未知文件。您可以使用现有的 MCP 服务器“binary_ninja_mcp”与 Binary Ninja 实例交互并检索信息,使用此服务器提供的工具。通常采用以下策略:
- 从代码的入口点开始
- 如果此函数调用其他函数,请确保跟踪这些调用并分析这些函数以了解其上下文
- 如果需要更多细节,请反汇编或反编译该函数,并添加您的发现作为注释
- 检查反编译结果,并在代码的重要区域添加注释
- 为每个函数添加一个简短总结其功能的注释
- 将变量和函数参数重命名为更合理的名称
- 如有必要更改变量和参数类型(特别是指针和数组类型)
- 将函数名称更改为更具描述性的名称,使用 vibe_ 作为前缀
- 切勿自行转换数字基数。如有必要,请使用 convert_number MCP 工具!
- 分析完成后,请报告分析所花费的时间
- 最后,根据您的发现创建一份报告
- 根据这些发现评估该文件是否具有恶意性质
下表列出了可用的 MCP 函数:
| 函数 | 描述 |
|---|---|
decompile_function | 反编译特定名称的函数并返回带有地址的类似 HLIL 的代码。 |
get_il(name_or_address, view, ssa) | 获取函数的 hlil、mlil 或 llil 的 IL(MLIL/LLIL 支持 SSA)。 |
define_types | 从 C 字符串类型定义中添加类型定义。 |
delete_comment | 删除特定地址处的注释。 |
delete_function_comment | 删除函数的注释。 |
declare_c_type(c_declaration) | 创建/更新来自单个 C 声明的本地类型。 |
format_value(address, text, size) | 转换一个值并在 BN 地址处注释它(添加注释)。 |
function_at | 检索地址所属的函数名称。 |
get_assembly_function | 通过名称或地址获取函数的汇编表示。 |
get_entry_points() | 列出加载的二进制文件的入口点。 |
get_binary_status | 获取加载的二进制文件的当前状态。 |
get_comment | 获取特定地址处的注释。 |
get_function_comment | 获取函数的注释。 |
get_user_defined_type | 检索用户定义类型的定义(结构体、枚举、typedef、联合)。 |
get_xrefs_to(address) | 获取指向地址的所有交叉引用(代码和数据)。 |
get_data_decl(name_or_address, length) | 返回数据符号或地址的 C 类似声明和十六进制转储。 |
hexdump_address(address, length) | 在地址处进行文本十六进制转储。length < 0 读取确切定义的大小(如果可用)。 |
hexdump_data(name_or_address, length) | 通过数据符号名称或地址进行十六进制转储。length < 0 读取确切定义的大小(如果可用)。 |
get_xrefs_to_enum(enum_name) | 获取与枚举相关的使用情况(匹配代码中的成员常量)。 |
get_xrefs_to_field(struct_name, field_name) | 获取命名结构字段的所有交叉引用。 |
get_xrefs_to_struct(struct_name) | 获取与结构体相关的交叉引用/使用情况(成员、全局、代码引用)。 |
get_xrefs_to_type(type_name) | 获取与结构体/类型相关的交叉引用/使用情况(全局、引用、HLIL 匹配)。 |
get_xrefs_to_union(union_name) | 获取与联合相关的交叉引用/使用情况(成员、全局、代码引用)。 |
get_type_info(type_name) | 解析类型并返回声明、类型和成员。 |
make_function_at(address, platform) | 在地址处创建一个函数。platform 可选;使用 default 选择 BinaryView/平台默认值。 |
list_platforms() | 列出所有可用的平台名称。 |
list_binaries() | 列出具有 ID 和活动标志的管理/打开的二进制文件。 |
select_binary(view) | 通过 ID 或文件名选择活动的二进制文件。 |
list_all_strings() | 列出所有字符串(不分页;聚合所有页面)。 |
list_classes | 列出程序中的所有命名空间/类名称。 |
list_data_items | 列出已定义的数据标签及其值。 |
list_exports | 列出导出的函数/符号。 |
list_imports | 列出程序中的导入符号。 |
list_local_types(offset, count) | 列出现有数据库中的本地类型(名称/类型/声明)。 |
list_methods | 列出程序中的所有函数名称。 |
list_namespaces | 列出程序中的所有非全局命名空间。 |
list_segments | 列出程序中的所有内存段。 |
list_strings(offset, count) | 列出数据库中的所有字符串(分页)。 |
list_strings_filter(offset, count, filter) | 列出匹配的字符串(分页,按子字符串过滤)。 |
rename_data | 重命名指定地址处的数据标签。 |
rename_function | 将函数的当前名称更改为新的用户定义名称。 |
rename_single_variable | 重命名函数内的单个局部变量。 |
rename_multi_variables | 批量重命名函数内的多个局部变量(映射或成对)。 |
set_local_variable_type(function_address, variable_name, new_type) | 设置局部变量的类型。 |
retype_variable | 在给定函数内重新设置变量类型。 |
search_functions_by_name | 搜索名称包含给定子字符串的函数。 |
search_types(query, offset, count) | 按子字符串搜索本地类型(名称/声明)。 |
set_comment | 在特定地址处设置注释。 |
set_function_comment | 为函数设置注释。 |
set_function_prototype(name_or_address, prototype) | 通过名称或地址设置函数原型。 |
以下是可调用的 HTTP 端点列表:
/allStrings: 所有字符串在一个响应中。/formatValue?address=<addr>&text=<value>&size=<n>: 转换并在地址处设置注释。/getXrefsTo?address=<addr>: 地址的交叉引用(代码+数据)。/getDataDecl?name=<symbol>|address=<addr>&length=<n>: 数据符号或地址的声明式字符串和十六进制转储的 JSON。键:address,name,size,type,decl,hexdump。length < 0 读取确切定义的大小(如果可用)。/hexdump?address=<addr>&length=<n>: 在地址处对齐的文本十六进制转储;length < 0 读取确切定义的大小(如果可用)。/hexdumpByName?name=<symbol>&length=<n>: 通过符号名称进行文本十六进制转储。识别 BN 自动标签如 data_<hex>,byte_<hex>,word_<hex>,dword_<hex>,qword_<hex>,off_<hex>,unk_<hex>,以及纯十六进制地址。/makeFunctionAt?address=<addr>&platform=<name|default>: 在地址处创建一个函数(如果已存在则幂等)。platform=default 使用 BinaryView/平台默认值。/platforms: 列出所有可用的平台名称。/binaries 或 /views: 列出具有 ID 和活动标志的管理/打开的二进制文件。/selectBinary?view=<id|filename>: 选择后续操作的活动二进制文件。/data?offset=<n>&limit=<m>&length=<n>: 已定义的数据项及其预览。length 控制每项读取的字节数(上限为定义的大小)。默认行为在可用时读取确切定义的大小;length=-1 强制精确大小。/getXrefsToEnum?name=<enum>: 枚举的使用情况,通过匹配成员常量。/getXrefsToField?struct=<name>&field=<name>: 结构体字段的交叉引用。/getXrefsToType?name=<type>: 与结构体/类型名称相关的交叉引用/使用情况。/getTypeInfo?name=<type>: 解析类型并返回声明和详细信息。/getXrefsToUnion?name=<union>: 联合的交叉引用/使用情况(成员、全局、引用)。/localTypes?offset=<n>&limit=<m>: 列出本地类型。/strings?offset=<n>&limit=<m>: 分页字符串。/strings/filter?offset=<n>&limit=<m>&filter=<substr>: 过滤字符串。/searchTypes?query=<substr>&offset=<n>&limit=<m>: 按子字符串搜索本地类型。/renameVariables: 批量重命名函数内的局部变量。参数:
functionAddress,address,function,functionName 或 name 中的一个。renames: JSON 数组 {old, new} 对象mapping: JSON 对象 old->newpairs: 紧凑字符串 old1:new1,old2:new2
返回每项结果及总计。顺序被尊重;后面的对可以引用前面的新名称。欢迎贡献。请随时提交拉取请求。