mcpField
G
grep

grep

github.com/allthingsida開発4948 回インストール3 週間前に更新
リポジトリ

grep について

IDA データベース内の関数、ラベル、型、メンバー名を探す IDASQL スキルです。SQL による絞り込みとページングで候補を見つけ、相互参照、逆コンパイル、型の作業へ進めます。

主な機能

  1. 01IDA の名前付きエンティティ検索
  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

パターンのルール

  • 大文字と小文字は区別されません。
  • プレーンテキストは部分一致として扱われます。
  • %は任意の文字列に一致します。
  • _は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を使用します。

コメント