grep について
IDA データベース内の関数、ラベル、型、メンバー名を探す IDASQL スキルです。SQL による絞り込みとページングで候補を見つけ、相互参照、逆コンパイル、型の作業へ進めます。
主な機能
- 01IDA の名前付きエンティティ検索
- 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の値:
functionlabelsegmentstructunionenummemberenum_member
パターンのルール
- 大文字と小文字は区別されません。
- プレーンテキストは部分一致として扱われます。
%は任意の文字列に一致します。_は1文字に一致します。*も使用でき、%に正規化されます。- 空のパターンは行を返しません。
- 正規表現ではありません。
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;
検索結果からxrefに進む
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
);
他の検索インターフェースとの比較
- IDAで検出された名前付きエンティティには
grepを使用します。 - 文字列の内容そのものが必要な場合は
stringsを使用します。 - 生のバイト列やオペコードのパターンが必要な場合は
byte_searchを使用します。 - 検索後、実際に知りたいことが「これを参照しているのは誰か」である場合は
xrefsを使用します。
失敗と復旧
- 該当結果が多すぎる場合:
kind = ...を追加するか、接頭辞を絞り込むか、プレーンテキストからより具体的なワイルドカードパターンに切り替えます。 - 期待するシンボルが見つからない場合:
パターンを広げるか、部分一致検索を試すか、対象がインポートされたAPIとしてのみ存在する可能性がある場合は
importsに切り替えます。 - コメント、疑似コードのテキスト、または文字列の内容を検索する必要がある場合:
grepは適切なインターフェースではありません。strings、逆コンパイラーテーブル、または他のドメインテーブルに切り替えます。 - バイト列/オペコードが必要な場合:
grepではなくbyte_searchを使用します。
コメント
Markdown 対応