functions について
functions は、idasql で IDA データベースを調査・変更する開発者向けのリファレンススキルです。逆アセンブル、バイト解析、メタデータ編集、逆コンパイル、データベース出力の SQL 関数とクエリ例をまとめています。
主な機能
- 01逆アセンブル用 SQL リファレンス
- 02バイトの読み取り・検索・パッチ
- 03関数とクロスリファレンスの照会
- 04コメントとメタデータの編集
- 05Hex-Rays による任意の逆コンパイル
- 06Python 実行とグラフ出力
活用シーン
- 01idasql 関数のシグネチャ確認
- 02バイナリのバイト列やオペコード検索
- 03関数とコメントへの注釈付け
- 04逆コンパイル結果や CFG の生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ allthingsida/ idasql-skills --skill functionsインストール後、Claude Code で/functionsを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
このスキルは、すべての idasql SQL 関数を網羅した包括的なカタログです。関数シグネチャ、パラメーター、使用方法を調べる際にご利用ください。
逆アセンブル
| 関数 | 説明 |
|---|---|
disasm_at(addr) | 対象のヘッドの標準リスティング行(コード/データの両方に対応) |
disasm_at(addr, n) | 前後 n 個のヘッドを含む標準リスティング行 |
disasm(addr) | 指定アドレスの逆アセンブル行 |
disasm(addr, n) | 指定アドレスからの次の N 個の命令(境界を考慮せず、個数で指定) |
disasm_range(start, end) | アドレス範囲 [start, end) 内のすべての逆アセンブル行 |
disasm_func(addr) | 指定アドレスを含む関数全体の逆アセンブル |
make_code(addr) | 指定アドレスに命令を作成(すでにコードである場合、または作成した場合は 1 を返します) |
make_code_range(start, end) | [start, end) 内に命令を作成し、作成数を返します |
SELECT disasm_at(0x401000);
SELECT disasm_at(0x401000, 2);
SELECT disasm_func(addr) FROM funcs WHERE name = '_main';
SELECT disasm_range(0x401000, 0x401100);
SELECT disasm(0x401000);
SELECT disasm(0x401000, 5);
SELECT make_code(0x401000);
SELECT make_code_range(0x401000, 0x401100);
関数の作成はテーブル駆動型です(SQL 関数ではありません)。
INSERT INTO funcs (addr) VALUES (0x401000);
バイトアクセスとパッチ適用
バイトの読み取り、一括読み取り、パッチ適用はすべて bytes テーブルを介して行います。
load_file_bytes(...) は、指定範囲の IDB にホストファイルのバイト列を書き込みます。成功時は 1、失敗時は 0 を返します。
| 関数 | 説明 |
|---|---|
load_file_bytes(path, file_offset, addr, size[, patchable]) | ホストファイルのバイト列を指定範囲の IDB メモリに書き込みます |
blob_concat(value) | 組み込み集約関数 — バイト値を連結して 1 つの BLOB にします |
-- Read 16 bytes as uppercase hex
SELECT hex(blob_concat(value))
FROM (SELECT value FROM bytes WHERE start_addr = 0x401000 AND n = 16 ORDER BY addr);
-- Read 64 bytes as a BLOB (its byte length; bind the raw BLOB itself, or wrap in
-- hex() for a text-safe transport)
SELECT length(blob_concat(value)) AS blob_len
FROM (SELECT value FROM bytes WHERE start_addr = 0x401000 AND n = 64 ORDER BY addr);
-- Patch 1 byte and 4 LE bytes
UPDATE bytes SET value = 0x90 WHERE addr = 0x401000;
UPDATE bytes SET dword = 0x90909090 WHERE addr = 0x401000;
SELECT value AS current, original_value AS original FROM bytes WHERE addr = 0x401000;
DELETE FROM bytes WHERE addr = 0x401000; -- revert
合成可能な行形式の読み取りには、bytes テーブルを直接使用します。
SELECT addr, value FROM bytes WHERE addr >= :start AND addr < :end ORDER BY addr。
項目のサイズ/型メタデータには heads を使用します。
バイナリ検索
生バイト列/オペコードの検索には byte_search テーブルを使用します。テーブル形式のため、結果を直接フィルタリング、結合、グループ化、制限できます。
| 列 | 説明 |
|---|---|
addr | 一致したアドレス |
matched_hex | 16 進テキストとして表した一致バイト列 |
matched_bytes | BLOB としての一致バイト列 |
size | バイト単位の一致サイズ |
pattern | 必須入力(非表示):IDA バイトパターン |
start_addr | 任意入力(非表示):包含する下限アドレス |
end_addr | 任意入力(非表示):包含しない上限アドレス |
max_results | 任意入力(非表示):ジェネレーターの上限 |
パターン構文(IDA ネイティブ):
"48 8B 05"- 完全一致バイト列(16 進数、スペース区切り)"48 ? 05"または"48 ?? 05"-?= 任意の 1 バイトのワイルドカード(バイト全体のみ)"(01 02 03)"- 選択肢(一致するバイトのいずれか)
SELECT addr, matched_hex, size
FROM byte_search
WHERE pattern = '48 8B ? 00'
LIMIT 10;
SELECT printf('0x%llX', addr) AS addr
FROM byte_search
WHERE pattern = 'CC CC CC'
ORDER BY addr
LIMIT 1;
最適化パターン:
-- Count unique functions containing RDTSC (opcode: 0F 31)
SELECT COUNT(DISTINCT f.addr) as count
FROM byte_search b
JOIN funcs f ON b.addr >= f.addr AND b.addr < f.end_addr
WHERE b.pattern = '0F 31';
名前と関数
アドレスおよびアドレスを含む関数のメタデータの取得には、テーブル検索を使用します。これらのパターンを使う前に、シンボル名を整数の EA に解決してください。
| パターン | 説明 |
|---|---|
SELECT name FROM names WHERE addr = :addr LIMIT 1 | アドレスの名前 |
SELECT name FROM funcs WHERE :addr >= addr AND :addr < end_addr LIMIT 1 | アドレスを含む関数 |
SELECT addr FROM funcs WHERE :addr >= addr AND :addr < end_addr LIMIT 1 | アドレスを含む関数の開始位置 |
SELECT end_addr FROM funcs WHERE :addr >= addr AND :addr < end_addr LIMIT 1 | アドレスを含む関数の終了位置 |
関数数の取得とインデックス検索はテーブル駆動型です。
SELECT COUNT(*) AS function_count FROM funcs;
SELECT addr FROM funcs WHERE rowid = 0;
クロスリファレンス
クロスリファレンスのエッジクエリはテーブル駆動型です。
SELECT from_addr, to_addr, type, is_code, from_func
FROM xrefs
WHERE to_addr = 0x401000;
SELECT from_addr, to_addr, type, is_code, from_func
FROM xrefs
WHERE from_addr = 0x401000;
SELECT from_addr, to_addr, type, is_code, from_func
FROM xrefs
WHERE from_func = 0x401000;
ナビゲーション
定義済み項目の移動には heads の並び順を使用し、表示文字列には SQLite の書式設定関数を使用します。アドレスの一致/範囲フィルターは最適化されており、次/前の項目を検索する際には ORDER BY addr または ORDER BY addr DESC が利用されます。
SELECT addr
FROM heads
WHERE addr > 0x401000
ORDER BY addr
LIMIT 1;
SELECT addr
FROM heads
WHERE addr < 0x401000
ORDER BY addr DESC
LIMIT 1;
SELECT printf('0x%llx', addr) AS address_hex
FROM heads
LIMIT 10;
セグメントの検索はテーブル駆動型です。
SELECT name
FROM segments
WHERE 0x401000 >= start_addr
AND 0x401000 < end_addr
LIMIT 1;
コメント
コメントの読み取りには comments テーブルを使用します。
SELECT COALESCE(NULLIF(comment, ''), NULLIF(rpt_comment, '')) AS comment
FROM comments
WHERE addr = 0x401000
LIMIT 1;
コメントの書き込みにはテーブルを使用します。
INSERT INTO comments(addr, comment) VALUES (0x401000, 'regular comment');
INSERT INTO comments(addr, rpt_comment) VALUES (0x401000, 'repeatable comment');
-- Replace an existing comment in place
UPDATE comments SET comment = 'revised comment' WHERE addr = 0x401000;
-- Remove a comment
DELETE FROM comments WHERE addr = 0x401000;
注意:すでにコメントがあるアドレスに対する INSERT は、既存のコメントを置き換えます(EA ごとに各スロットのコメントは 1 つです)。UPDATE も同等です。
変更
| サーフェス | 説明 |
|---|---|
applied_types(addr, decl, ordinal, type_name) | アドレスにある C 宣言を読み取り/適用/置換/クリアします |
parse_decls(text) | C 宣言(struct/union/enum/typedef)をローカル型にインポートします |
関数メタデータの書き込みには、次の SQL を優先して使用してください。
UPDATE funcs SET name = '...', prototype = '...', folder_path = 'idasql/review/annotated' WHERE addr = ...INSERT INTO names(addr, name) VALUES (..., '...')またはUPDATE names SET name = '...' WHERE addr = ...prototypeはapplied_typesの動作に対応し、デコンパイラーのキャッシュを無効化します。folder_pathは IDA の Function ウィンドウのツリー内で関数を移動します。空のフォルダーはdirtree_foldersを通じて作成/名前変更/削除できます。- 呼び出しごとの間接呼び出しの型付けには、
disasm_calls.callee_typeを更新します。
Python の実行
| 関数 | 説明 |
|---|---|
idapython_snippet(code[, sandbox]) | Python スニペットを実行し、キャプチャした出力テキストを返します |
idapython_file(path[, sandbox]) | Python ファイルを実行し、キャプチャした出力テキストを返します |
実行時ガード:
PRAGMA idasql.enable_idapython = 1;
SELECT idapython_snippet('print("hello from idapython")');
SELECT idapython_file('C:/temp/script.py');
SELECT idapython_snippet('counter = globals().get("counter", 0) + 1; print(counter)', 'alpha');
コンテキスト認識(プラグイン UI)
| 関数 | 説明 |
|---|---|
get_ui_context_json() | コンテキストを認識するプロンプト用に、現在の UI/ウィジェット/コンテキストの JSON を返します(すべての場所で登録済み。GUI プラグインではライブ UI、idalib/CLI では source:"cli" のスタブを返します) |
SELECT get_ui_context_json();
アイテム分析
アイテムの分類、サイズ、生のフラグには heads を使用します。
SELECT addr, size, type, flags, disasm
FROM heads
WHERE addr = 0x401000;
命令の詳細
デコード済み命令の情報には instructions と instruction_operands を使用します。instruction_operands は、void ではないオペランドごとに 1 行を返します。
SELECT addr, itype, mnemonic
FROM instructions
WHERE func_addr = 0x401000
LIMIT 10;
SELECT opnum, text, type_code, type_name, value
FROM instruction_operands
WHERE addr = 0x401000
ORDER BY opnum;
SELECT i.addr, i.itype, i.mnemonic, i.size, o.opnum, o.text, o.type_name, o.value
FROM instructions i
LEFT JOIN instruction_operands o
ON o.addr = i.addr AND o.addr = 0x401000
WHERE i.addr = 0x401000
ORDER BY o.opnum;
逆コンパイル
Hex-Rays が必要です。 このセクションのすべての関数(
decompile、call_arg_addrs、set_union_selection*/get_union_selection*ファミリー、call_arg_item、ctree_item_at、およびset_numform*/get_numform*ファミリー)は、Hex-Rays デコンパイラーが利用可能な場合にのみ登録されます。Hex-Rays のないビルド/ランタイムではこれらの関数は存在せず、呼び出すとno such functionが返されます。これらに依存する前に、SELECT decompile(<addr>)で利用可能か確認してください。
| 関数 | 説明 |
|---|---|
decompile(addr) | 推奨 — 行プレフィックス付きの完全な疑似コード |
decompile(addr, 1) | 強制的に再デコンパイルします(書き込み/名前変更後に使用) |
call_arg_addrs(call_addr) | 永続化された引数ローダー命令の EA を含む JSON 配列 |
set_union_selection(func_addr, addr, path) | EA におけるユニオン選択パスを設定/クリアします |
set_union_selection_item(func_addr, item_id, path) | ctree.item_id を指定してユニオン選択パスを設定/クリアします |
set_union_selection_addr_arg(func_addr, addr, arg_idx, path[, callee]) | 推奨 呼び出し引数の対象指定ヘルパー |
call_arg_item(func_addr, addr, arg_idx[, callee]) | 呼び出し引数の座標を明示的な arg_item_id に解決します |
ctree_item_at(func_addr, addr[, op_name[, nth]]) | 汎用式の座標を ctree.item_id に解決します |
set_union_selection_addr_expr(func_addr, addr, path[, op_name[, nth]]) | 式の座標を使ってユニオン選択を設定/クリアします |
get_union_selection(func_addr, addr) | EA におけるユニオン選択パスの JSON を読み取ります |
get_union_selection_item(func_addr, item_id) | ctree.item_id を指定してユニオン選択パスの JSON を読み取ります |
get_union_selection_addr_arg(func_addr, addr, arg_idx[, callee]) | 呼び出し引数の座標を使ってユニオン選択の JSON を読み取ります |
get_union_selection_addr_expr(func_addr, addr[, op_name[, nth]]) | 式の座標を使ってユニオン選択の JSON を読み取ります |
set_numform(func_addr, addr, opnum, spec) | EA とオペランドインデックスを指定して numform を設定/クリアします |
get_numform(func_addr, addr, opnum) | EA とオペランドインデックスを指定して numform の JSON を読み取ります |
set_numform_item(func_addr, item_id, opnum, spec) | ctree item ID を指定して numform を設定/クリアします |
get_numform_item(func_addr, item_id, opnum) | ctree item ID を指定して numform の JSON を読み取ります |
set_numform_addr_arg(func_addr, addr, arg_idx, opnum, spec[, callee]) | 呼び出し引数の座標を使って numform を設定/クリアします |
get_numform_addr_arg(func_addr, addr, arg_idx, opnum[, callee]) | 呼び出し引数の座標を使って numform の JSON を読み取ります |
set_numform_addr_expr(func_addr, addr, opnum, spec[, op_name[, nth]]) | 式の座標を使って numform を設定/クリアします |
get_numform_addr_expr(func_addr, addr, opnum[, op_name[, nth]]) | 式の座標を使って numform の JSON を読み取ります |
デコンパイラーのローカル変数とラベルの変更は、テーブルを使って行います。
SELECT idx, name, type, comment, size, is_arg, is_result, stkoff, mreg FROM ctree_lvars WHERE func_addr = ... ORDER BY idxでローカル変数を一覧表示します。func_addrと選択したidxを使い、UPDATE ctree_lvars SET name = ...またはcomment = ...でローカル変数の名前を変更するか、コメントを設定します。UPDATE ctree_labels SET name = ... WHERE func_addr = ... AND label_num = ...でラベルの名前を変更します。
ファイル生成
| 関数 | 説明 |
|---|---|
gen_listing(path) | データベース全体のリスティングファイル(LST)を生成します |
SELECT gen_listing('C:/tmp/full.lst');
グラフ生成
| 関数 | 説明 |
|---|---|
gen_cfg_dot(addr) | CFG を DOT グラフ文字列として生成します |
gen_cfg_dot_file(addr, path) | CFG の DOT をファイルに書き込みます |
gen_schema_dot() | データベーススキーマを DOT として生成します |
SELECT gen_cfg_dot(0x401000);
SELECT gen_schema_dot();
データベースの永続化
| 関数 | 説明 |
|---|---|
save_database() | 現在の IDA データベースファイルを永続化します。成功時は 1、失敗時は 0 を返します |
-- Save once after a batch of SQL edits
SELECT save_database();
書き込みを永続化する必要がある、長時間稼働する HTTP/MCP/プラグインセッションで使用してください。
IDAPython の保存用コードスニペットではなく、save_database() を使用してください。こちらは idasql 独自の永続化機能を利用します。大規模なデータベースでは save_database() に時間がかかる場合があるため、編集をまとめ、意図したタイミングで保存してください。
エンティティ検索(grep)
標準的なワークフローのガイダンスは ../grep/SKILL.md にあります。
| 対象 | 説明 |
|---|---|
grep テーブル | 組み合わせて使える SQL 検索用の構造化された行 |
SELECT name, kind, addr FROM grep WHERE pattern = 'sub%' LIMIT 10;
SELECT name, kind, addr FROM grep WHERE pattern = 'init' LIMIT 50 OFFSET 0;
文字列リスト関数
| 関数 | 説明 |
|---|---|
rebuild_strings() | ASCII と UTF-16 を使い、最小長 5(デフォルト)で再構築します |
rebuild_strings(minlen) | カスタムの最小長で再構築します |
rebuild_strings(minlen, types) | カスタムの長さとタイプマスクで再構築します |
タイプマスク:1=ASCII、2=UTF-16、4=UTF-32、3=ASCII+UTF-16(デフォルト)、7=すべて。
文字列の行を実体化せずに現在の文字列リストの件数を取得するには、COUNT(*) FROM strings を使用してください。
SELECT COUNT(*) AS strings FROM strings;
SELECT rebuild_strings();
SELECT rebuild_strings(4);
SELECT rebuild_strings(5, 7);
関連項目
connect— カタログとルーティングマトリックスの入口です。関数ではなくスキルを選ぶ際に使用してください。- 各関数に関連するトピック別スキル(バイト/文字列には
data、decompile()にはdecompiler、disasm_*にはdisassembly、parse_declsにはtypes、パッチ用ヘルパーにはdebugger)