项目简介 Tenrec是一个专为IDA Pro逆向工程设计的模型上下文协议(MCP)服务器。它允许大型语言模型(LLM)客户端以标准化的方式与IDA Pro进行交互,获取二进制分析上下文、调用特定工具来执行逆向任务,并通过插件系统灵活扩展功能。Tenrec支持无头IDA Pro操作、多会话分析,并可自动生成插件文档。

主要功能点

  • IDA Pro集成: 实现IDA Pro的无头交互,通过插件提供对IDA数据库的全面访问和操作能力。
  • 多会话管理: 支持IDA Pro数据库的多会话并行管理,方便处理复杂项目或相关库文件。
  • 可扩展插件系统: 核心功能通过模块化插件提供,如函数分析、交叉引用追踪、符号管理、内存段查询等,允许用户轻松创建自定义插件扩展功能。
  • LLM工具接口: 将IDA Pro的各项功能封装为LLM可调用的工具(Tools),通过标准JSON-RPC协议进行通信。
  • 上下文提供: 向LLM客户端提供二进制的结构化上下文信息,包括函数、字符串、段等。
  • 多种传输协议: 支持Stdio、HTTP、SSE、Streamable HTTP等多种传输协议。

安装步骤

  1. 先决条件:
    • Python 3.10 或更高版本
    • IDA Pro 9.1+ 版本安装
  2. 通过'uv'安装:
    uv tool install tenrec
  3. 设置IDA Pro路径: Tenrec依赖'ida-domain'库,需要设置'IDADIR'环境变量指向你的IDA Pro安装目录。
    • macOS示例:'export IDADIR="/Applications/IDA Professional 9.1.app/Contents/MacOS"'
    • Linux示例:'export IDADIR="/opt/idapro"'
    • Windows示例 (PowerShell, 管理员权限运行):'setx IDADIR "C:\Program Files\IDA Pro" /M'

服务器配置 (MCP客户端) Tenrec服务器需要由MCP客户端启动。以下是一个MCP客户端配置Tenrec服务器的JSON示例,通常存储在客户端的配置文件中(例如,'.cursor/mcp.json' 或 '~/.claude.json'):

{
  "mcpServers": {
    "tenrec": {
      "command": "uvx",
      "args": ["tenrec", "run"],
      "env": {
        "IDADIR": "你的IDA Pro安装路径" 
        // 示例: "/Applications/IDA Professional 9.1.app/Contents/MacOS" (macOS)
        // 示例: "/opt/idapro" (Linux)
        // 示例: "C:\\Program Files\\IDA Pro" (Windows)
      },
      "timeout": 1800, 
      // 可选:服务器启动超时时间,单位秒。
      "disabled": false, 
      // 可选:是否禁用此服务器。
      "autoApprove": [
        "server_new_session",
        "server_list_sessions",
        "server_set_session",
        "server_remove_session",
        "server_remove_all_sessions",
        "bytes_create_data_at",
        "bytes_get_value_at",
        "bytes_is_type_at",
        "bytes_patch_value_at",
        "bytes_set_value_at",
        "bytes_get_original_value_at",
        "bytes_check_flags_at",
        "bytes_delete_value_at",
        "bytes_find_bytes_between",
        "bytes_find_immediate_between",
        "bytes_find_text_between",
        "bytes_get_all_flags_at",
        "bytes_get_bytes_at",
        "bytes_get_data_size_at",
        "bytes_get_disassembly_at",
        "bytes_get_flags_at",
        "bytes_get_next_address",
        "bytes_get_next_head",
        "bytes_get_original_bytes_at",
        "bytes_get_previous_address",
        "bytes_get_previous_head",
        "bytes_has_any_flags_at",
        "bytes_has_user_name_at",
        "bytes_is_code_at",
        "bytes_is_data_at",
        "bytes_is_flowed_at",
        "bytes_is_forced_operand_at",
        "bytes_is_head_at",
        "bytes_is_manual_insn_at",
        "bytes_is_not_tail_at",
        "bytes_is_tail_at",
        "bytes_is_unknown_at",
        "bytes_is_value_initialized_at",
        "bytes_revert_byte_at",
        "comments_delete",
        "comments_get",
        "comments_get_all",
        "comments_get_all_filtered",
        "comments_set",
        "entries_add",
        "entries_exists",
        "entries_get_addresses",
        "entries_get_all",
        "entries_get_at_index",
        "entries_get_at",
        "entries_get_by_name",
        "entries_get_by_ordinal",
        "entries_get_count",
        "entries_get_forwarders",
        "entries_get_start",
        "entries_get_ordinals",
        "entries_rename",
        "entries_set_forwarder",
        "functions_get_all",
        "functions_get_all_filtered",
        "functions_get_by_name",
        "functions_get_at",
        "functions_get_between",
        "functions_get_callees",
        "functions_get_callers",
        "functions_get_pseudocode",
        "functions_get_signature",
        "functions_set_name",
        "functions_rename_local_variable",
        "names_delete",
        "names_demangle_name",
        "names_force_name",
        "names_get_all",
        "names_get_all_filtered",
        "names_get_at",
        "names_get_at_index",
        "names_get_count",
        "names_get_demangled_name",
        "names_set_name",
        "segments_get_all",
        "segments_get_at",
        "segments_set_name",
        "strings_get_all",
        "strings_get_all_filtered",
        "strings_get_at_address",
        "strings_get_at_index",
        "strings_get_between",
        "types_declare_c_type",
        "types_list_local_types",
        "types_set_local_variable_type",
        "types_set_function_prototype",
        "types_set_global_variable_type",
        "xrefs_get_xrefs_from",
        "xrefs_get_xrefs_to",
        "xrefs_get_xref_graph"
      ],
      // 可选:LLM可以自动调用这些工具,无需用户批准。
      "alwaysAllow": [
        // ... (与autoApprove类似,但通常用于需要更高权限的工具)
      ]
    }
  }
}

请注意:'IDADIR'环境变量必须设置正确,否则Tenrec服务器无法启动。'autoApprove'和'alwaysAllow'列表会在运行'tenrec install'命令时自动填充默认安全工具。

基本使用方法 配置好MCP客户端后,你的LLM客户端即可通过Tenrec服务器与IDA Pro进行交互。

  1. 启动Tenrec服务器: 通常由MCP客户端在需要时自动启动。你也可以手动运行(不常用):
    tenrec run --transport stdio
    ('--transport'参数可选'stdio'、'http'、'sse'、'streamable-http',具体取决于客户端需求)
  2. LLM交互示例: 在支持MCP的LLM客户端中,你可以直接向LLM提问,并让它调用Tenrec提供的工具来分析IDA Pro数据库。例如,让LLM打开一个二进制文件并进行分析:

    "你已获得当前目录下的 'darn_mice.exe' 二进制文件。使用 Tenrec 打开一个会话并逆向分析此二进制文件。主要任务是找到入口点,追踪执行流以获得高级理解。请在分析过程中重命名变量和函数。xref 插件对此任务可能很有帮助。最终你将寻找一个标志,其格式为电子邮件地址,可能需要解密。不要尝试猜测标志,而是根据二进制分析来引导你找到正确的答案。"

信息

分类

开发者工具