关于 grep
用于在 IDA 数据库中查找函数、标签、类型和成员名称的 IDASQL 技能。它支持通过 SQL 筛选和分页,帮助分析人员发现目标,再进入交叉引用、反编译或类型处理流程。
主要功能
- 01搜索已命名的 IDA 实体
- 02按类型和通配模式筛选
- 03排序并分页浏览结果
- 04将结果与函数元数据联接
- 05引导后续相关分析流程
适用场景
- 01按名称或前缀查找函数
- 02定位结构体、枚举和成员
- 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 实体:
namekindaddrordinalparent_namefull_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