跨构建匹配原生函数¶
match_native_functions 将两个现有的 list_procedures Evidence 清单配对。选择 list_procedures 的 detail: "summary",即可在不转移整个清单的情况下保留完整的源行。其 parent_evidence_id 是匹配所消费的引用。
目标可以顺序打开;匹配绝不会打开目标、重新读取其文件、执行它或启动提供者。在关闭目标前保留每个清单,或稍后导入其 Evidence 包。close_binary 会清除会话记录。在关闭前导出每个包;在收集两侧并关闭最后一个目标后,导入两个包,然后使用它们的引用。仅跨关闭保留一个 Evidence ID 是不够的。完整的内联 Evidence 和 CLI source_bundle 输入是可移植的替代方案。将 Evidence 或精确的会话引用作为 left 和 right 传入:
{
"left": { "kind": "retained-evidence", "evidence_id": "ev_<left digest>" },
"right": { "kind": "retained-evidence", "evidence_id": "ev_<right digest>" }
}
具有已观测符号来源的唯一精确名称会首先配对。清单行或可选的 list_names Evidence 用于识别要排除的动态/默认名称。未知或冲突的来源不能建立名称对应关系;完整的独立主体字节仍然符合条件。精确名称建立的是名称对应关系,而非未更改代码或原始来源身份。Ghidra 会发布其符号事实;Hopper、IDA 和较旧导入的 dossiers 在没有观察到此类事实时保留未知来源。仅凭显示拼写(包括 EntryPoint 或 FUN_ 前缀)并不能确定名称是否由工具生成。
如果将真实 Evidence 选择到错误的侧、角色、目标、提供者、配置或文档,则会返回输入错误,指明所选的字段或观察索引。请重新选择兼容的观察;认证或相互矛盾的生产者事实会保留其各自的完整性失败。
对于未匹配的候选,可选择提供 left_observations 和 right_observations。procedure_info 或现有的 analyze_function 档案可提供精确的包含式主体范围;read_bytes 提供内存字节。MCP 的 analyze_function 摘要回复不是档案:请将其 parent_evidence_id 作为 retained-evidence 引用传入。观察必须属于该侧的精确目标/提供者/配置和文档上下文。相邻、一致重叠和部分返回的读取会按它们观测到的范围组合;冲突的区间仍保持为缺口。字节匹配要求每个主体字节、相等的总大小、相等的有序范围长度、唯一的 SHA-256 指纹和相同的已知架构。范围永远不会根据下一个条目猜测,重定位不会被归一化。较大的映射读取可为多个观测到的主体服务;只需捕获需要的范围。
这一首批切片会复用现有的范围观察。当这些事实尚未保留时,剥离后的构建可能需要大量轻量级范围查询。匹配不会掩盖这一获取成本,也不会静默启动这些查询。完全反编译并非必要。
重复的候选仍保持为 unresolved 组,不会进行笛卡尔积对扩展。only_left/only_right 表示在所提供观察中不存在精确对应物;重命名、内联、剥离、字节更改或不完整的发现都可以解释它们。它们并不证明源代码的新增/移除。source_coverage 明确保持清单完整性未知,并分别统计已知字节指纹和已解析的对应关系。提供者的限制仍然可访问。
默认的 detail: "summary" 会在 MCP 中保留完整的匹配 Evidence,并返回计数、双方身份和覆盖率。查询其 parent_evidence_id:
{
"source": {
"kind": "retained-evidence",
"evidence_id": "ev_<matching digest>"
},
"view": {
"kind": "function-matches",
"collection": "functions",
"states": ["matched"],
"sides": ["left"],
"fields": ["name", "body_sha256"],
"offset": 0,
"limit": 20
}
}
collection: "matches" 返回关系身份、状态、基础和成员数量。默认省略大型成员列表;请显式选择 left/right 列,或分页查看单个 functions。批量 match_ids/function_ids、精确函数 names、状态和侧过滤器会交叉生效。必选身份和来源信息在列选择后仍然保留。分页覆盖会涵盖所选的已保留事实。函数身份将清单 Evidence 与所属清单的 source_index 绑定,从而保留同地址的替代项。每个不可变父项保留一次验证、惰性成员索引和有界最近过滤器;不会缓存任何实时目标状态。
当两个函数在观察中都已拥有明确的 analyze_function 档案时,匹配关系会包含 compare_functions_input,其中带有可直接使用的保留引用。否则,只需在各自目标中分析选定的规范地址,然后比较这些档案。匹配从不声称行为等价。可选的、来自所提供档案的 CFG/调用/字符串信息指纹仅用于连接未解析的候选组。它们要求已观察到 CFG、被调用函数和字符串、完整的已观察调用覆盖、没有未解析调用,并且具有相同的分析配置身份。空的叶函数桶会被排除。structural_candidate_sha256 标识该派生的候选签名;其档案链接保留完整的支持事实。组成员关系并不断言每一对成员都是候选或等价。
CLI 使用相同的服务和 JSON 输入:
rea match-native-functions request.json \
--source_bundle left-bundle.json --source_bundle right-bundle.json \
--evidence_output matching-bundle.json --json
source_bundle 从经过认证的本地包解析精确引用。默认 summary 需要 evidence_output,保留完整的匹配 Evidence 及其选定的源闭包,包括跨所提供包的传递性 Evidence 链接。缺失依赖会以完整性错误失败;无关记录会被省略。发布从不覆盖。如需所有组都以内联方式呈现,请在 JSON 中设置 detail: "complete"。将包导入 MCP 以查看,或将其匹配 Evidence 记录提取到 JSON 文件中,作为现有 CLI inspect-analysis-view 的 evidence-file 来源。输入包保持不变。
表示准入在克隆所选观察结果、扩展匹配索引和重复的每函数源链接之前,以 96 MiB 为界。工作会因取消而中止。不引入任何 worker/provider 并发;此预算不是对进程总 RSS 的限制。摘要交付在完整匹配证据构建并保留之后进行。它会减少初始回复,但不会避免该构建,也不会提高配额。没有运行时覆盖。重复的来源仍是完整成员契约的一部分;将清单拆分为单独的匹配会改变全局名称/主体唯一性,因此不是等效的变通方法。
自有的源码夹具是 nativeFunctionMatching.c。在 Linux x86-64 上,使用 cc -O2 -g0 -fno-pie -no-pie -DVERSION=1 和 -DVERSION=2 编译;复制第二个二进制文件,并对该副本运行 strip --strip-all。它包含未更改/已更改的代码、字节完全相同的重命名、移除/添加的观察结果、一个内联函数、相同代码的别名,以及一个已重命名且已更改的函数,带有已观察到的调用/字符串签名。分析时不要执行该夹具。完整提供方的验证仍需要调用方提供的 Ghidra 和 Java。
格式错误的行内证据会在准入后连同其选定的输入字段和观察索引一起被拒绝。结构上有效但其认证内容或摘要不一致的记录仍然是完整性失败;更改输入诊断并不会使该记录变得可信。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea