ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ida-pro-mcp 中的第三方编译器类型解析:ida_srclang 模块完整指南

ida-pro-mcp 中的第三方编译器类型解析:ida_srclang 模块完整指南 逆向工程MCP 服务AI 应用【免费下载链接】ida-pro-mcpAI-powered reverse engineering assistant that bridges IDA Pro with language models through MCP.项目地址https://gitcode.com/gh_mirrors/id/ida-pro-mcp点击查看免费下载导读ida_srclang是 IDA Pro 提供的 Python 模块负责第三方编译器支持——即通过外部编译器/解析器把 C、C、Objective-C 等语言的类型声明批量解析并导入 IDA 的类型库til_t。在本仓库 ida-pro-mcpAI 驱动的逆向工程助手通过 MCP 桥接 IDA Pro 与大语言模型中这一能力是让 LLM 把分析出的结构体、函数原型等类型声明直接写回 IDA 本地类型库这一核心链路的底层依赖。读完本文你将掌握ida_srclang的常量、解析器选择、类型声明解析与解析器配置四大 API 组并理解它如何在 ida-pro-mcp 的declare_type工具中被调用。模块定位为第三方编译器提供统一的类型解析入口ida_srclang的官方模块说明非常简短——Third-party compiler support.第三方编译器支持。它解决的是 IDA 类型系统中的一个现实问题IDA 内置的解析器擅长解析自身格式如 til 库、部分 C 声明但面对真实项目里由 GCC/Clang/MSVC 等第三方编译器产出的头文件、宏展开后的复杂声明时需要一个更贴近真实编译器行为的解析入口。ida_srclang将这类解析器抽象为按名称注册、可切换、可配置命令行参数的组件解析器按名称管理默认解析器之外可以存在多个命名解析器例如指向不同编译器前端解析结果统一落库无论使用哪个解析器解析出的类型最终都写入同一个til_t类型库语言支持可查询通过srclang_t语言掩码描述解析器支持的语言集合。从本仓库源码看ida-pro-mcp 在 src/ida_pro_mcp/ida_mcp/api_python.py 中通过lazy_import(ida_srclang)将ida_srclang注册为可按需惰性加载的 IDAPython 模块之一与ida_typeinf、ida_hexrays等并列说明该模块被视作类型系统基础设施的一部分。语言常量SRCLANG_*模块定义了 5 个语言常量作为srclang_t类型的取值用于描述输入源码期望的语言或解析器支持的语言常量含义当前支持状态SRCLANG_CC支持SRCLANG_CPPC支持SRCLANG_OBJCObjective-C支持SRCLANG_SWIFTSwift尚不支持not supported yetSRCLANG_GOGolang尚不支持not supported yet两个要点值得注意常量可组合srclang_t本质上是位掩码select_parser_by_srclang要求所选解析器同时支持传入的全部语言因此你可以传入SRCLANG_C | SRCLANG_CPP要求解析器同时覆盖 C 与 C 声明明确标注未支持语言Swift 与 Go 的常量已预留但官方标注为 not supported yet在选用前应先用select_parser_by_srclang探测是否存在对应解析器避免误用。解析器选择 APIselect_parser_by_name(name: str) - bool按名称把某个解析器设为当前解析器。传入None或空字符串则恢复默认解析器。import ida_srclang # 切换到默认解析器 ok ida_srclang.select_parser_by_name() # 切换到某个命名解析器名称需与已注册解析器一致 ok ida_srclang.select_parser_by_name(clang) if not ok: print(未找到名为 clang 的解析器)返回值语义找不到同名解析器时返回False。select_parser_by_srclang(lang: srclang_t) - bool按语言能力选择解析器——设置一个支持给定语言集合的解析器为当前解析器要求该解析器必须支持传入的全部语言。import ida_srclang # 选择支持 C 的解析器 if ida_srclang.select_parser_by_srclang(ida_srclang.SRCLANG_C): print(C 解析器已就绪) # 要求同时支持 C 和 C if ida_srclang.select_parser_by_srclang( ida_srclang.SRCLANG_C | ida_srclang.SRCLANG_CPP ): print(C/C 解析器已就绪)找不到同时满足全部语言的解析器时返回False。get_selected_parser_name() - str获取当前解析器名称用于在切换后确认实际生效的解析器。current ida_srclang.get_selected_parser_name() print(f当前解析器: {current or (default)})类型声明解析 API这一组是ida_srclang的核心价值所在把字符串或源码文件中的类型声明解析进til_t类型库返回解析过程中遇到的错误数量0 表示完全成功。parse_decls_for_srclang(lang, til, input, is_path) - int按语言自动选择解析器并解析声明适合只关心语言、不关心具体解析器的场景。参数类型说明langsrclang_t输入中期望出现的源语言可组合tiltil_t存放解析结果类型的类型库传None通常表示使用 IDB 当前的本地类型库inputstr输入源可以是文件路径或声明字符串is_pathboolTrue表示 input 是源码文件路径False表示 input 是内存中的声明片段返回值为int-1没有找到支持该语言集合的解析器其他值输入源中解析出的错误数量0表示无错误。import ida_srclang decls struct Point { int x; int y; }; typedef struct Point *PPoint; errors ida_srclang.parse_decls_for_srclang( ida_srclang.SRCLANG_C, # 输入为 C 语言 None, # 使用当前 IDB 的本地类型库 decls, # 声明字符串 False, # 不是文件路径 ) print(f解析完成错误数: {errors})parse_decls_with_parser(parser_name, til, input, is_path) - int显式指定解析器名称进行解析其余参数与parse_decls_for_srclang一致is_path语义相同。适合先通过select_parser_by_name之外的途径锁定特定解析器或绕过按语言自动选择逻辑。import ida_srclang errors ida_srclang.parse_decls_with_parser( default, # 指定解析器名称 None, # til struct Foo { int a; };, False, # 内存片段 ) if errors 0: print(未找到指定解析器) elif errors 0: print(解析成功类型已写入本地类型库)parse_decls_with_parser_ext(parser_name, til, input, hti_flags) - int扩展版本用hti_flagsType 格式化标志组合取代is_path。hti_flags中的HTI_*标志直接对应ida_typeinf中定义的一组解析行为标志可同时控制输入形式与解析行为例如HTI_TIL结果存入指定 tilHTI_RAWARGS/HTI_RELAXED宽松解析模式容忍更多语法差异HTI_SEMICOLON/HTI_STANDALONE控制声明是否需以分号结尾、是否独立解析HTI_NOBASE不加载基础类型定义。更完整的HTI_*标志清单可在 skills/idapython/docs/ida_typeinf.rst 中查看。import ida_srclang import ida_typeinf errors ida_srclang.parse_decls_with_parser_ext( default, None, struct Vec { float x, y, z; };, ida_typeinf.HTI_TIL | ida_typeinf.HTI_RELAXED, ) print(f错误数: {errors})返回值约定与parse_decls_with_parser相同-1表示未找到解析器否则返回错误数。解析器配置 APIset_parser_argv(parser_name: str, argv: str) - int为指定名称的解析器设置调用时使用的命令行参数。返回值为-1未找到该名称的解析器-2该解析器不支持此操作0成功。import ida_srclang rc ida_srclang.set_parser_argv(clang, -I/path/to/headers -DDEBUG1) if rc -1: print(解析器不存在) elif rc -2: print(该解析器不支持命令行参数) else: print(参数已设置)典型用途为第三方解析器补充头文件搜索路径-I、宏定义-D等编译期上下文使类型解析结果与真实编译环境一致。get_parser_option / set_parser_option读写指定解析器的选项import ida_srclang # 读取选项 value ida_srclang.get_parser_option(default, some_option) # 设置选项返回是否成功 ok ida_srclang.set_parser_option(default, some_option, value)注意get_parser_option的返回值为字符串文档标注 returns: success若解析器不存在或选项无效时返回空字符串建议先通过select_parser_by_name验证解析器存在再读取set_parser_option返回bool表示设置是否成功。在 ida-pro-mcp 中的实战链路declare_type 工具ida_srclang的能力在本仓库中不是孤立存在的而是与ida_typeinf.parse_decls共同构成了类型声明导入的底层实现。在 src/ida_pro_mcp/ida_mcp/utils.py 中parse_decls_ctypes函数给出了两条与模块文档对应的调用路径非 Windows 平台直接调用ida_typeinf.parse_decls(None, decls, False, hti_flags)即以默认解析器解析内存声明片段、结果写入当前类型库——这正是ida_srclang文档所描述语义的一个落地实现Windows 平台通过ctypes加载ida.dll并调用其parse_decls导出符号同时注册一个magic_printer回调函数捕获解析器输出的诊断信息messages从而把解析错误带回上层。上层工具declare_type位于 src/ida_pro_mcp/ida_mcp/api_types.py它接收 LLM 生成的 C 类型声明字符串或字符串列表以PT_SIL | PT_EMPTY | PT_TYP标志组合调用parse_decls_ctypes并根据返回的错误数决定结果是成功导入本地类型库还是携带解析错误信息返回给调用方。由此可见当你在 ida-pro-mcp 中让 AI 助手把这个结构体定义写进 IDA时其底层类型解析正是由本文所述机制完成的。结合 skills/idapython/docs/ida_typeinf.md 中关于til_t序列化类型存储与tinfo_t类型对象的说明可以拼出完整链路解析器ida_srclang 管理→ 解析声明 → 写入 til_t → 上层以 tinfo_t 读取/应用。常见用法小结与注意事项先探测后使用调用任何按名称/语言选择解析器的 API 后检查返回值对 Swift/Go 常量不要假设解析器已存在。解析错误数即质量信号所有parse_decls_*返回0的值都是错误计数0才是完全成功配合解析器输出的诊断信息定位语法问题。is_path与hti_flags二选一简单场景用带is_path的版本字符串或文件路径需要精细控制解析行为宽松模式、分号要求、基础类型加载等时使用parse_decls_with_parser_ext。配置先行涉及#include或宏的头文件级声明先用set_parser_argv补全-I/-D参数否则容易因缺失编译上下文而解析失败。与 ida_typeinf 协同srclang_t与til_t的定义、HTI_*/PT_*标志的完整清单均以 skills/idapython/docs/ida_typeinf.rst 为准本文 API 与之一致时可直接交叉查阅。参考文件skills/idapython/docs/ida_srclang.rst本文的权威 API 参考模块常量、函数签名与返回值约定skills/idapython/docs/ida_srclang.md快速速查版skills/idapython/docs/ida_typeinf.rsttil_t、srclang_t与HTI_*/PT_*标志的完整定义src/ida_pro_mcp/ida_mcp/utils.pyparse_decls_ctypes底层实现含 Windows ctypes 路径src/ida_pro_mcp/ida_mcp/api_types.pydeclare_typeMCP 工具如何消费解析结果src/ida_pro_mcp/ida_mcp/api_python.pyida_srclang在 ida-pro-mcp 中的惰性导入注册。赞分享逆向工程MCP 服务AI 应用【免费下载链接】ida-pro-mcpAI-powered reverse engineering assistant that bridges IDA Pro with language models through MCP.项目地址https://gitcode.com/gh_mirrors/id/ida-pro-mcp点击查看免费下载相关推荐深度解析res-downloader如何实现跨平台资源捕获与智能下载深度解析res downloader如何实现跨平台资源捕获与智能下载 在数字内容爆炸式增长的时代你是否曾好奇那些看似不可下载的网络资源背后隐藏着怎样的技逆向工程MCP 服务AI 应用如何用QuickCut实现智能视频剪辑3步搞定Vlog和教程视频如何用QuickCut实现智能视频剪辑3步搞定Vlog和教程视频 在当今视频内容爆炸的时代无论是制作Vlog分享生活还是录制教程传递知识视频剪辑都成为了逆向工程MCP 服务AI 应用5分钟掌握Video Speed Controller让你的视频观看效率提升3倍的终极指南5分钟掌握Video Speed Controller让你的视频观看效率提升3倍的终极指南 你是一个文章写手你负责为开源项目写专业易懂的文章。Video S逆向工程MCP 服务AI 应用上一篇Triton GPU后端支持NVIDIA与AMD架构适配下一篇洛雪音乐音源配置终极指南快速解锁全网高品质音乐资源创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表