mcpField
G
grep

grep

github.com/allthingsida开发4948 次安装3 周前更新
代码仓库

关于 grep

用于在 IDA 数据库中查找函数、标签、类型和成员名称的 IDASQL 技能。它支持通过 SQL 筛选和分页,帮助分析人员发现目标,再进入交叉引用、反编译或类型处理流程。

主要功能

  1. 01搜索已命名的 IDA 实体
  2. 02按类型和通配模式筛选
  3. 03排序并分页浏览结果
  4. 04将结果与函数元数据联接
  5. 05引导后续相关分析流程

适用场景

  1. 01按名称或前缀查找函数
  2. 02定位结构体、枚举和成员
  3. 03追踪引用前筛选候选项

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/allthingsida/idasql-skills --skill grep

安装后在 Claude Code 中输入/grep确认已加载。

附带文件agents/openai.yaml

详细介绍

grep 是 IDASQL 的实体搜索接口。在深入 xrefs、反编译器或类型相关工作之前,可先用它查找命名函数、标签、段、结构体、枚举和成员。


触发意图

在用户要求以下操作时使用此技能:

  • 按名称查找函数、标签、类型或成员
  • 按前缀或子串搜索,例如 sub_、EH、Zw、CreateFile 或 main
  • 快速浏览搜索结果
  • 从名称发现开始,启动基于表的 xref/反编译器/类型工作流

转到:

  • 找到候选被调函数/导入项/函数后,如需查找调用方、被调方或引用,则转到 xrefs
  • 选定候选函数并需从语义上检查时,转到 decompiler
  • 命中的是需要检查或编辑的结构体/枚举/成员时,转到 types

先做这一步(快速开始)

-- 1) Start with a structured search while you learn the result shape
SELECT name, kind, addr
FROM grep
WHERE pattern = 'main'
ORDER BY kind, name
LIMIT 20;
-- 2) Narrow immediately when the result set is noisy
SELECT name, ordinal, full_name
FROM grep
WHERE pattern = 'EH%' AND kind = 'struct'
ORDER BY name;
-- 3) Page with ordinary SQL
SELECT name, kind, addr
FROM grep
WHERE pattern = 'sub_%'
ORDER BY kind, name
LIMIT 10 OFFSET 10;

使用说明:

  • grep 是一张表。使用常规 SQL 进行筛选、排序、联接、分组和分页。
  • 如需下游解析,请直接选择行,而不是将结果包装为 JSON。

结果结构

grep 以行的形式提供命名的 IDA 实体:

  • name
  • kind
  • addr
  • ordinal
  • parent_name
  • full_name

常见的 kind 值:

  • function(函数)
  • label(标签)
  • segment(段)
  • struct(结构体)
  • union(联合体)
  • enum(枚举)
  • member(成员)
  • enum_member(枚举成员)

模式规则

  • 匹配不区分大小写。
  • 纯文本会被视为包含匹配。
  • % 匹配任意子串。
  • _ 匹配单个字符。
  • 接受 *,并将其规范化为 %。
  • 空模式不返回任何行。
  • 这不是正则表达式。
  • 这与 byte_search 无关。

示例:

-- Contains-match
SELECT name, kind
FROM grep
WHERE pattern = 'main'
LIMIT 20;
-- Prefix wildcard
SELECT name, kind, addr
FROM grep
WHERE pattern = 'sub_%'
ORDER BY name
LIMIT 20;
-- Shell-style star is accepted too
SELECT name, kind
FROM grep
WHERE pattern = 'Zw*'
LIMIT 20;

常见工作流

按名称查找候选函数
SELECT name, addr
FROM grep
WHERE pattern = 'main%' AND kind = 'function'
ORDER BY name;
解析导入的 API
SELECT module, name, addr
FROM imports
WHERE name LIKE 'CreateFile%'
ORDER BY module, name;
按命名约定查找类型
SELECT name, kind, ordinal, full_name
FROM grep
WHERE pattern = 'EH%' AND kind IN ('struct', 'enum')
ORDER BY kind, name;
查找父类型下的成员
SELECT name, parent_name, ordinal
FROM grep
WHERE pattern = 'flag%' AND kind = 'member'
ORDER BY parent_name, name
LIMIT 30;
联接以获取更丰富的函数元数据
SELECT g.name, f.size, f.prototype
FROM grep g
JOIN funcs f ON f.addr = g.addr
WHERE g.pattern = 'sub_%' AND g.kind = 'function'
ORDER BY f.size DESC
LIMIT 20;
从发现结果转到 xrefs
SELECT caller_name, printf('0x%X', caller_addr) AS from_addr
FROM callers
WHERE func_addr = (
    SELECT addr
    FROM imports
    WHERE name = 'CreateFileW'
    ORDER BY name
    LIMIT 1
);

与其他搜索接口的对比

  • 使用 grep 搜索 IDA 发现的命名实体。
  • 需要查找字面字符串内容时,使用 strings。
  • 需要搜索原始字节或操作码模式时,使用 byte_search。
  • 发现目标后,如果实际问题是“谁引用了它?”,则使用 xrefs。

故障与恢复

  • 命中太多: 添加 kind = ...,缩小前缀范围,或将纯文本搜索改为更具体的通配符模式。
  • 未找到预期符号: 扩大模式范围,尝试包含搜索;或者如果目标可能仅作为导入的 API 存在,则转到 imports。
  • 需要搜索注释、伪代码文本或字符串内容: grep 不是合适的接口;请转到 strings、反编译器表或其他领域表。
  • 需要搜索字节/操作码: 使用 byte_search,而不是 grep。

评论

支持 Markdown