SuperAPI AI 工具集

data

数据与分析

查看项目

更新于 11-01 16:10

技能介绍

用途

该技能面向二进制文件中的非代码事实查询与操作,包括:可打印字符串、映射字节及初始化状态、已定义数据符号/字符串、字节模式匹配、汇编助记符与字节间转换、C++/Rust/Swift/MSVC 符号名 demangle、任意地址读取以 NUL 结尾的字符串、可回滚的原始十六进制字节补丁(直接写入或通过汇编助记符)、导入函数、加载器入口点与导出、重定位表、链接库列表、顶层二进制元数据(架构、位数、二进制类型、操作系统等)以及 r2 加载的类型定义与成员。代码结构(函数/基本块/指令)应使用 disassembly 技能;代码与数据间的交叉引用应使用 xrefs 技能。

主要能力与表结构

  • bytes:来源 omj + p8 + iSj,列 addr、value、is_initialized,value 可写。
  • data_items:来源 isj + izj,列 addr、name、data_type、size、value_repr、segment_name、is_string、is_initialized。
  • byte_search:来源 /xj + p8,列 addr、matched_hex、matched_bytes、size;隐藏参数 pattern/bounds。
  • assemble:来源 pa,列 hex、bytes、size、error;隐藏参数 asm(必填)、addr。
  • search_asm:来源 /a,列 addr、matched_hex;隐藏参数 asm(必填)、max_results。
  • demangle:来源 iD/iDj,列 demangled、error;隐藏参数 mangled(必填)、lang(可选)。
  • read_cstr:来源 pszj,列 content、length、section、type、truncated、error;隐藏参数 addr(必填)、max_len(可选,默认 128)。
  • patches:来源 wcj(write-cache),列 addr、size、original_bytes、patched_bytes、asm_text、committed,可写。
  • strings:来源 izj,列 addr、length、section、type、content、paddr。
  • imports:来源 iij,列 addr、ordinal、bind、type、name、module。
  • entries:来源 iej + iEj,列 addr、size、type、bind、name。
  • relocs:来源 irj,列 addr、paddr、type、ntype、name、demname、sym_vaddr、is_ifunc。
  • libs:来源 ilj,列 name。
  • binary:来源 iIj + quick-counts,键值对形式。
  • types:来源 tk* + tks,列 ordinal(只读)、name、kind、size、format。
  • types_members:来源 tk* + tkj,包含类型/成员名称、种类、布局、大小、值。

使用方式

通过 SQL 风格查询访问上述表。常见查询示例包括:查找所有包含 "password" 的字符串并区分虚拟地址与文件偏移;按库分组统计导入;筛选加密 API(如 Crypt%、AES、RSA、BCrypt%)和网络/IO 表面(WS2_32.dll、WINHTTP.dll、WININET.dll、URLMON.dll);列出入口点/导出与链接库;查询命名导入的重定位;读取指定地址范围内已初始化的可读字节;直接覆写单字节;按十六进制模式(支持 . 通配半字节及可选 :mask)搜索字节;将汇编助记符编码为字节或搜索该指令出现位置;demangle 符号名;读取任意地址的 C 字符串;暂存并提交可回滚补丁;查询二进制图像类型、架构、位数、操作系统、字节序等元数据。

引导查询为 SELECT key, value FROM binary ORDER BY key; binary 表包含原始 iIj 键以及 func_count、string_count、import_count、section_count 等快速计数,并有 radare2_version(运行中引擎版本)区别于 r2xsql_version/tool_version。db_info 风格的键值摘要无需专用表,binary 与 bininfo 已覆盖相应字段。

性能说明

在进程内构建上,strings、imports、entries 直接读取 radare2 进程内二进制状态(r_bin_get_strings、RBinImport、RBinAddr/RBinSymbol),而非运行 izj/iij/iej+iEj 并解析 JSON,结果行一致,包括 imports.name 的 demangle 以及 entries.name 保持原始(未 demangle)名称。三者均无需分析流程即可读取已加载二进制自身元数据。relocs/libs 各为单次全扫描命令(irj/ilj),无逐函数/逐地址循环,因此在所有构建上均走命令路径;二者也无需分析流程,直接读取已加载二进制的 bin-info。

适用场景

  • 恶意软件/逆向工程初期快速梳理二进制字符串、导入表、入口点、链接库与重定位。
  • 识别加密/网络相关 API 表面。
  • 搜索特定字节模式或汇编指令出现位置。
  • 将符号名 demangle 为可读形式。
  • 从任意地址读取以 NUL 结尾的字符串,包括启发式未标记的位置。
  • 以可回滚方式暂存并提交原始字节补丁,或通过汇编助记符生成补丁。
  • 查看二进制顶层元数据与类型定义。

限制与注意事项

  • strings.type 区分 ascii、utf16le、utf8 等,若仅需可打印 ASCII 需按类型过滤。
  • imports.addr 是 IAT 槽位,并非解析后的外部地址;需结合 xrefs 技能查找通过该槽位调用的代码。
  • entries 合并加载器入口点与导出,因此可执行文件即使不导出符号也可能有行。
  • bytes.value 对未初始化或不可读的映射字节为 NULL。
  • UPDATE bytes SET value = X WHERE addr = Y 是直接、立即、永久的一字节覆写(wx),与 patches 机制不同;它绕过 io.cache,无法暂存、撤销或与 patches 条目交互;无撤销;value 必须为 0-255,且仅能写入当前已初始化的地址;不支持 INSERT/DELETE;addr/is_initialized 只读。
  • relocs 无 addend 列;relocs.name/demname/sym_vaddr 各自可空,sym_vaddr 仅在重定位通过真实符号解析时填充。
  • libs 为单列表(name),ilj 不提供序号、加载顺序索引或解析路径。
  • patches 的 INSERT 必须且只能提供原始十六进制(patched_bytes)或汇编助记符(asm_text)之一;asm_text 为只写,SELECT 该列始终为空。
  • assemble/search_asm/patches.asm_text 对助记符文本进行字符集校验(字母、数字、空格及 ,.+-*/:%#_$);assemble 与 patches.asm_text 是地址作用域的,需传入 addr 或补丁目标地址。
  • pa(assemble 后端)无 JSON 输出模式,坏助记符时 stdout 为空,失败表现为空 hex 加 error。
  • /a(search_asm 后端)无可用 JSON 模式,/aj 会错误路由到 /at 家族;search_asm 自行解析纯文本命中行。
  • demangle 的 lang 仅为参考,radare2 根据 mangled 文本前缀自动检测实际 demangler;无法 demangle 时 demangled 为空、error 填充(包括 plain 未 mangled 字符串如 main)。
  • read_cstr 的 max_len=0 在命令发出前被拒绝;truncated=1 只表示扫描窗口内未找到 NUL,不区分更长字符串与未映射地址;越界读取返回填充字节且 section/type 为 unknown;name_at/section_at/string_at 是查询配方而非表;name_at 的 names 查询可能每个地址返回多行,需按 namespace 消歧。
  • patches 提交是表级操作:UPDATE patches SET committed = 1 WHERE addr = X 会提交会话中所有待处理补丁;SET committed = 0 被拒绝;无已验证的 uncommit 原语。
  • DELETE FROM patches WHERE addr = X 仅在目标补丁为最近暂存时撤销未提交补丁;radare2 的 undo 无地址定向,总是撤销最后暂存的补丁。
  • INSERT 的 stage(wx)是地址作用域的,在进程内后端上也会走与其他可写表地址作用域写入相同的结构化命令派发路径。commit(wci)与 undo(wcu)为固定命令,无用户输入。