disassembly について
disassemblyは、IDASQLを使ってバイナリを命令、関数、制御フローの観点から調べるスキルです。SQLによる分析と編集に対応し、意味の解釈、関係の分析、デバッグは別のスキルに引き継ぎます。
主な機能
- 01関数、セグメント、命令、オペランドの調査
- 02基本ブロックと制御フローエッジの分析
- 03解決済み呼び出し先と呼び出し箇所の型の検索
- 04名前、関数メタデータ、オペランド形式の編集
活用シーン
- 01関数内の命令列の確認
- 02呼び出し箇所を追跡して呼び出し先を調査
- 03バイナリの挙動を調べる際の制御フロー確認
- 04オペランド形式や関数・シンボル名の更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ allthingsida/ idasql-skills --skill disassemblyインストール後、Claude Code で/disassemblyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/disassembly-examples.mddisassembly-tables.md詳細
トリガーとなる意図
以下の依頼でこのスキルを使用します:
- 関数/セグメント/命令の調査
- 逆アセンブル結果に基づく呼び出し箇所や制御フローの分析
- オペランドの書式や低レベルのコード構造
- 生のバイト列/命令レベルの根拠
以下に引き継ぎます:
- AST/擬似コードの意味解釈には
decompiler - 呼び出し元/呼び出し先の関係を重視するワークフローには
xrefs - パッチ適用/ブレークポイント操作には
debugger
最初に行うこと(ウォームスタート手順)
-- 1) Orientation
SELECT * FROM binary;
-- 2) Segment map
SELECT name, printf('0x%X', start_addr) AS start_addr, printf('0x%X', end_addr) AS end_addr, perm
FROM segments
ORDER BY start_addr;
-- 3) Largest functions (triage anchors)
SELECT name, printf('0x%X', addr) AS addr, size
FROM funcs
ORDER BY size DESC
LIMIT 20;
解釈の指針:
- 実行可能なセグメントと、規模が大きい/接続性の高い関数から始めます。
- 命令の多い対象をクエリするときは、早い段階で
func_addr制約を使用します。
障害と復旧
instructions/headsのクエリが遅い場合:WHERE func_addr = Xまたは範囲を絞った EA 範囲を追加します。
- 想定したシンボル名が見つからない場合:
- アドレスベースのワークフローに切り替え、後から
namesの更新で情報を補います。
- アドレスベースのワークフローに切り替え、後から
- 制御フローの挙動が曖昧な場合:
disasm_callsで照合し、その後decompilerに引き継ぎます。
引き継ぎパターン
disassembly-> 関係を展開するにはxrefs。disassembly-> 意味を解釈するにはdecompiler。disassembly-> パッチ適用/ブレークポイントの実行にはdebugger。
エンティティテーブル
funcs
バイナリ内で検出されたすべての関数とプロトタイプ情報です。
| Column | Type | Description |
|---|---|---|
addr | INT | 関数の開始アドレス |
name | TEXT | 関数名 |
size | INT | 関数のサイズ(バイト単位) |
end_addr | INT | 関数の終了アドレス |
flags | INT | 関数フラグ |
folder_path | TEXT | Function ウィンドウのルートからの相対パスで表した RW 関数フォルダー。NULL/'' はルートを意味します |
full_path | TEXT | 関数名を含む RO の完全な dirtree パス |
プロトタイプ列(型情報がある場合に設定されます):
| Column | Type | Description |
|---|---|---|
return_type | TEXT | 戻り値の型を表す文字列(例:"int"、"void *") |
return_is_ptr | INT | 戻り値の型がポインターの場合は 1 |
return_is_int | INT | 戻り値の型が厳密に int の場合は 1 |
return_is_integral | INT | 戻り値の型が整数型に類する場合(int、long、DWORD、BOOL)は 1 |
return_is_void | INT | 戻り値の型が void の場合は 1 |
arg_count | INT | 関数の引数の数 |
calling_conv | TEXT | 呼び出し規約(cdecl、stdcall、fastcall など) |
-- 10 largest functions
SELECT name, size FROM funcs ORDER BY size DESC LIMIT 10;
-- Functions starting with "sub_" (auto-named, not analyzed)
SELECT name, printf('0x%X', addr) as addr FROM funcs WHERE name LIKE 'sub_%';
-- Functions returning integers with 3+ arguments
SELECT name, return_type, arg_count FROM funcs
WHERE return_is_integral = 1 AND arg_count >= 3;
-- Functions organized by IDASQL annotation folders
SELECT addr, name, folder_path
FROM funcs
WHERE folder_path LIKE 'idasql/%'
ORDER BY folder_path, name;
書き込み操作:
-- Create a function
INSERT INTO funcs (addr) VALUES (0x401000);
-- Rename a function
UPDATE funcs SET name = 'my_func' WHERE addr = 0x401000;
-- Move a function into an IDA Function window folder
INSERT INTO dirtree_folders(tree, path) VALUES ('funcs', 'idasql/triage/network');
UPDATE funcs SET folder_path = 'idasql/triage/network' WHERE addr = 0x401000;
-- Move it back to root
UPDATE funcs SET folder_path = NULL WHERE addr = 0x401000;
-- Delete a function
DELETE FROM funcs WHERE addr = 0x401000;
フォルダーパスは相対 / パスです。IDASQL は、./..、重複する区切り文字、バックスラッシュ、空でないフォルダーの削除、および移動先がすでに存在するフォルダー名の変更を拒否します。
segments
メモリセグメントです。INSERT で領域を追加し、DELETE で削除し、UPDATE で start_addr
(リベース/移動)、end_addr(サイズ変更)、name、class、perm を更新する CRUD 全操作に対応します。
| Column | Type | RW | Description |
|---|---|---|---|
start_addr | INT | RW | セグメントの開始位置。UPDATE するとセグメントをリベース(移動)します |
end_addr | INT | RW | セグメントの終了位置。UPDATE するとセグメントのサイズを変更します |
name | TEXT | RW | セグメント名(.text、.data など) |
class | TEXT | RW | セグメントクラス(CODE、DATA) |
perm | INT | RW | 権限(R=4、W=2、X=1) |
-- Find executable segments
SELECT name, printf('0x%X', start_addr) as start FROM segments WHERE perm & 1 = 1;
-- Rename a segment
UPDATE segments SET name = '.mytext' WHERE start_addr = 0x401000;
-- Add a region (e.g. SRAM for a raw firmware image), then rebase it
INSERT INTO segments(start_addr, end_addr, name, class, perm)
VALUES (0x20000000, 0x20005000, 'SRAM', 'DATA', 6);
UPDATE segments SET start_addr = 0x08000000 WHERE name = '.text'; -- rebase
names
名前付きのすべての場所(関数、ラベル、データ)です。INSERT、UPDATE、DELETE に対応しています。
| Column | Type | RW | Description |
|---|---|---|---|
addr | INT | R | アドレス |
name | TEXT | RW | 名前 |
folder_path | TEXT | RW | 名前フォルダーのパス。NULL はルートを意味します |
full_path | TEXT | R | 名前の完全な dirtree パス |
-- Create/set a name
INSERT INTO names (addr, name) VALUES (0x401000, 'my_symbol');
-- Rename
UPDATE names SET name = 'my_symbol_renamed' WHERE addr = 0x401000;
-- Organize globals/labels into IDA name folders
UPDATE names SET folder_path = 'idasql/names/globals' WHERE name LIKE 'g_%';
UPDATE names SET folder_path = NULL WHERE addr = 0x401000;
entries
エントリーポイント(エクスポート、プログラムのエントリー、TLS コールバックなど)です。
| Column | Type | Description |
|---|---|---|
ordinal | INT | エクスポートの序数 |
addr | INT | エントリーアドレス |
name | TEXT | エントリー名 |
命令テーブル
命令
instructions は逆アセンブルテーブルです。特定の EA におけるスカラーの逆アセンブルテキストを取得するには、disasm_at(addr[, context]) を使用します。
関数または範囲の一覧が明示的に必要な場合は、disasm_func() または disasm_range() を使用します。
デコード済み命令では、DELETE(命令を未解析のバイトに変換)と、operand*_format_spec によるオペランド表現の更新がサポートされています。
WHERE func_addr = X は高速パスです(関数項目イテレーター)。これがない場合、テーブルはすべてのコードヘッドをスキャンします。
| 列 | 型 | 説明 |
|---|---|---|
addr | INT | 命令アドレス |
func_addr | INT | 所属する関数 |
itype | INT | 命令タイプ(アーキテクチャ固有) |
mnemonic | TEXT | 命令ニーモニック |
size | INT | 命令サイズ |
operand0..operand7 | TEXT | オペランドテキスト(0..7) |
disasm | TEXT | 逆アセンブル行全体 |
operand0_class..operand7_class | TEXT | オペランドクラス:reg、imm、displ、mem、... |
operand0_repr_kind..operand7_repr_kind | TEXT | 現在の表現:plain、hex、dec、oct、bin、char、float、enum、offset、stroff、sizeof、segment、stkvar、forced |
operand0_repr_type_name..operand7_repr_type_name | TEXT | Enum/stroff/sizeof の型、オフセットの基準(16 進数)、または強制テキスト |
operand0_format_spec..operand7_format_spec | TEXT (RW) | 特定のオペランドに表現を適用/解除します(下記の用語一覧を参照) |
-- Instruction profile of a function (FAST)
SELECT mnemonic, COUNT(*) as count
FROM instructions WHERE func_addr = 0x401330
GROUP BY mnemonic ORDER BY count DESC;
-- Find all call instructions in a function
SELECT addr, disasm FROM instructions
WHERE func_addr = 0x401000 AND mnemonic = 'call';
-- Apply enum representation to operand 1
UPDATE instructions
SET operand1_format_spec = 'enum:MY_ENUM'
WHERE addr = 0x401020;
-- Apply struct-offset representation to operand 0
-- e.g. makes `[rax+10h]` display as `[rax+command_t.field_name]`
UPDATE instructions
SET operand0_format_spec = 'stroff:command_t'
WHERE addr = 0x140001BE8;
-- Struct-offset with a base delta (subtracted before member resolution)
UPDATE instructions
SET operand0_format_spec = 'stroff:command_t,delta=16'
WHERE addr = 0x140001BE8;
-- Nested member path: separate type names with '/'
UPDATE instructions
SET operand0_format_spec = 'stroff:outer_t/inner_t'
WHERE addr = 0x140001BE8;
-- Clear representation back to plain
UPDATE instructions
SET operand1_format_spec = 'clear'
WHERE addr = 0x401020;
適用後にフォーマット指定が検証されます。UPDATE はオペランドを再読み込みし、結果の repr_kind、型パス、またはデルタが要求内容と一致しない場合、SQL エラーとして失敗します。確認するには operandN_repr_kind /
operandN_repr_type_name を読み戻します。
operandN_format_spec の全用語一覧(すべて逆アセンブルレベルで利用でき、IDAPython は不要です):
| 指定 | 効果 |
|---|---|
hex dec oct bin | 数値の基数 |
char | 文字定数 |
float | 浮動小数点 |
offset | 基準 0 のプレーンオフセット |
offset:<base> | ユーザー定義の基準を持つオフセット(<base> = シンボル名またはアドレス) |
enum:<NAME>[,serial=N] / enum:<NAME>::<MEMBER> | 列挙型定数 |
stroff:<Type[/Nested...]>[,delta=N] | 構造体メンバーのオフセット |
sizeof:<STRUCT> | 構造体サイズ定数 — size STRUCT として表示 |
segment | セグメントセレクター |
stkvar | スタック変数(オペランドはスタック参照である必要があります) |
forced:<text> | 強制(手動)オペランドテキスト。例:forced:5 shl 3 |
clear / plain / none | デフォルトの表現に戻す |
組み合わせ可能な修飾子(任意の基底へのサフィックス、または現在の表現を変更する単独指定):,signed / ,unsigned(負数表示を切り替えます)および
,bnot / ,nobnot(ビット単位 NOT の表示を切り替えます)。例:dec,signed、
hex,bnot、または signed のみ。
-- Number base, character, and sign/bitwise-not modifiers
UPDATE instructions SET operand1_format_spec = 'hex' WHERE addr = 0x401020;
UPDATE instructions SET operand1_format_spec = 'dec,signed' WHERE addr = 0x401020;
UPDATE instructions SET operand1_format_spec = 'char' WHERE addr = 0x401020;
-- Offsets (plain and user-defined base)
UPDATE instructions SET operand1_format_spec = 'offset' WHERE addr = 0x401020;
UPDATE instructions SET operand1_format_spec = 'offset:tbl_start' WHERE addr = 0x401020;
-- sizeof: an immediate equal to sizeof(STRUCT) renders as `size STRUCT`
UPDATE instructions SET operand1_format_spec = 'sizeof:FILEDEF' WHERE addr = 0x4015EB;
-- Forced operand text
UPDATE instructions SET operand1_format_spec = 'forced:5 shl 3' WHERE addr = 0x401020;
instruction_operands
デコードされた非voidオペランド1つにつき1行です。オペランドの型や値の詳細、および旧オペランド/デコードヘルパー関数の代替として結合可能な情報には、このテーブルを使用してください。
| Column | Type | Description |
|---|---|---|
addr | INT | 命令アドレス |
func_addr | INT | 所属する関数 |
opnum | INT | オペランドのインデックス |
text | TEXT | オペランドのテキスト |
type_code | INT | IDA オペランド型コード |
type_name | TEXT | オペランド型名(reg、imm、near など) |
dtype | INT | オペランドのデータ型 |
reg | INT | 該当する場合のレジスタ番号 |
op_addr | INT | 該当する場合の参照アドレス/変位 |
raw_value | INT | オペランドの生の値 |
value | INT | 可能な範囲で推定したスカラーオペランド値 |
注(addr と op_addr の違い):
addrは命令アドレスです。オペランドが参照するアドレスはop_addrです。オペランドが指すターゲット(ジャンプ/呼び出し/データ参照など)が必要な場合は、op_addrを選択してください。addrはオペランドが属する命令を示すものであり、参照先を示すものではありません。
SELECT opnum, text, type_name, value
FROM instruction_operands
WHERE addr = 0x401000
ORDER BY opnum;
SELECT i.addr, i.itype, i.mnemonic, o.opnum, o.text, o.type_name, o.value
FROM instructions i
LEFT JOIN instruction_operands o
ON o.addr = i.addr AND o.func_addr = 0x401000
WHERE i.func_addr = 0x401000
ORDER BY i.addr, o.opnum;
パフォーマンス: WHERE addr = X は1つの命令をデコードします。WHERE func_addr = X は O(function_size) の反復処理を行います。これらの制約がない場合、データベース全体をスキャンします。
disasm_calls
解決済みターゲットと、任意の呼び出し箇所プロトタイプの上書きを含む、すべての呼び出し命令です。
| Column | Type | Description |
|---|---|---|
func_addr | INT | 呼び出しを含む関数 |
addr | INT | 呼び出し命令のアドレス |
callee_addr | INT | ターゲットアドレス(不明な場合は0) |
callee_name | TEXT | ターゲット名 |
callee_type | TEXT | RW の呼び出し箇所プロトタイプ。UPDATE で適用/置換され、NULL または空値でクリア |
-- Functions that call malloc
SELECT DISTINCT (SELECT name FROM funcs WHERE func_addr >= addr AND func_addr < end_addr LIMIT 1) as caller
FROM disasm_calls WHERE callee_name LIKE '%malloc%';
-- Apply/replace a call-site prototype, then clear it
UPDATE disasm_calls
SET callee_type = 'int (__fastcall *)(const char *path)'
WHERE addr = 0x401234;
UPDATE disasm_calls SET callee_type = NULL WHERE addr = 0x401234;
直接呼び出しに callee_type を適用しても、実際の呼び出し先シンボルは保持されるため、その後に呼び出し元を再度デコンパイルしても安全です(microcode INTERR は発生しません)。間接呼び出しでは、その呼び出し箇所に型が適用されます。空値/NULL で上書きをクリアします。
blocks
関数内の基本ブロックです。パフォーマンスのため、func_addr 制約を使用してください。
| Column | Type | Description |
|---|---|---|
func_addr | INT | 所属する関数 |
start_addr | INT | ブロック開始位置 |
end_addr | INT | ブロック終了位置 |
size | INT | ブロックサイズ |
-- Blocks in a specific function (FAST - uses constraint pushdown)
SELECT * FROM blocks WHERE func_addr = 0x401000;
-- Functions with most basic blocks
SELECT (SELECT name FROM funcs WHERE func_addr >= addr AND func_addr < end_addr LIMIT 1) as name, COUNT(*) as blocks
FROM blocks GROUP BY func_addr ORDER BY blocks DESC LIMIT 10;
cfg_edges
基本ブロック間の制御フローグラフのエッジです。必ず WHERE func_addr = X を使用してください(filter_eq プッシュダウンにより、関数内のブロック数に対して O(blocks in function) で処理します)。
| Column | Type | Description |
|---|---|---|
func_addr | INT | 所属する関数 |
from_block | INT | ソースブロックのアドレス |
to_block | INT | ターゲットブロックのアドレス |
edge_type | TEXT | normal(単一後続ブロック、またはフォールバックラベル)、true/false(2方向分岐の汎用的な第1/第2分岐。ラベルは後続ブロックの順序に従い、分岐成立/フォールスルーの意味には従いません) |
-- Get CFG structure
SELECT * FROM cfg_edges WHERE func_addr = 0x401000;
-- Find branch points (conditional blocks)
SELECT from_block, COUNT(*) as succ_count
FROM cfg_edges WHERE func_addr = 0x401000
GROUP BY from_block HAVING succ_count > 1;
-- Find merge points (blocks with multiple predecessors)
SELECT to_block, COUNT(*) as pred_count
FROM cfg_edges WHERE func_addr = 0x401000
GROUP BY to_block HAVING pred_count > 1;
-- Function complexity ranking: combine CFG, loops, and call metrics
SELECT f.name, f.size,
(SELECT COUNT(*)
FROM (
SELECT ce.from_block
FROM cfg_edges ce
WHERE ce.func_addr = f.addr
GROUP BY ce.from_block
HAVING COUNT(*) > 1
) branch_blocks) as branch_sites,
(SELECT COUNT(*) FROM disasm_loops dl WHERE dl.func_addr = f.addr) as loops,
(SELECT COUNT(*) FROM disasm_calls dc WHERE dc.func_addr = f.addr) as calls_made
FROM funcs f
WHERE f.size > 32
ORDER BY branch_sites DESC
LIMIT 20;
function_chunks
関数チャンクごとに1行を格納するキャッシュ済みテーブルです。関数レベルの範囲または密度の指標が必要な場合は、func_addr で集計してください。
| Column | Type | Description |
|---|---|---|
func_addr | INT | 関数アドレス |
chunk_start | INT | チャンク開始アドレス |
chunk_end | INT | チャンク終了アドレス |
block_count | INT | チャンク内のブロック数 |
total_size | INT | チャンクの合計サイズ |
SELECT * FROM function_chunks WHERE func_addr = 0x401000;
SQL Functions -- Disassembly
| Function | Description |
|---|---|
disasm_at(addr) | 対応するヘッドの標準リスティング行(コード/データの両方で動作) |
disasm_at(addr, n) | 前後の n 個のヘッドを含む標準リスティング行 |
disasm(addr) | 指定アドレスの逆アセンブル行1行 |
disasm(addr, n) | 指定アドレスからの次の N 個の命令(件数ベース) |
disasm_range(start, end) | アドレス範囲 [start, end) 内のすべての逆アセンブル行 |
disasm_func(addr) | 指定アドレスを含む関数の逆アセンブル全体 |
make_code(addr) | 指定アドレスに命令を作成(1/0 を返します) |
make_code_range(start, end) | 範囲内に命令を作成し、作成数を返します |
逆アセンブルの例
-- Canonical single-EA disassembly (safe for code or data)
SELECT disasm_at(0x401000);
-- Canonical context window (+/- 2 heads)
SELECT disasm_at(0x401000, 2);
-- Full function disassembly (resolves boundaries via get_func)
SELECT disasm_func(addr) FROM funcs WHERE name = '_main';
-- Disassemble a specific address range
SELECT disasm_range(0x401000, 0x401100);
-- Sliding window: next 5 instructions from an address
SELECT disasm(0x401000, 5);
SQL 関数 -- 名前と関数
アドレスや、アドレスを含む関数のメタデータを取得するには、テーブル検索を使用します。これらのパターンを使用する前に、シンボル名を整数の 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;
SQL 関数 -- ナビゲーション
定義済みアイテムのナビゲーションには 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;
SQL 関数 -- アイテム分析
アイテムの分類、サイズ、生のフラグには heads を使用します。
SELECT addr, size, type, flags, disasm
FROM heads
WHERE addr = 0x401000;
SQL 関数 -- 命令の詳細
デコードされた命令の情報には instructions と instruction_operands を使用します。
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;
SQL 関数 -- ファイル生成
| 関数 | 説明 |
|---|---|
gen_listing(path) | データベース全体のリスティング出力(LST)を生成 |
SQL 関数 -- グラフ生成
| 関数 | 説明 |
|---|---|
gen_cfg_dot(addr) | CFG を DOT グラフ文字列として生成 |
gen_cfg_dot_file(addr, path) | CFG の DOT をファイルに書き込み |
gen_schema_dot() | データベーススキーマを DOT として生成 |
-- Get CFG for a function as DOT format
SELECT gen_cfg_dot(0x401000);
パフォーマンスに関するルール
| テーブル | アーキテクチャ | 主な制約 | 備考 |
|---|---|---|---|
funcs | インデックスベース | 不要 | getn_func(i) により行ごとに O(1) — 常に高速 |
instructions | イテレーター | func_addr | 関数アイテムのイテレーター(高速)とコードヘッド全体のスキャン(低速) |
blocks | イテレーター | func_addr | 制約のプッシュダウン:1 つの関数のブロックを反復 |
cfg_edges | イテレーター | func_addr | filter_eq のプッシュダウン:関数内のブロック数に対して O(blocks in function) |
disasm_calls | ジェネレーター | func_addr、書き込みには addr | 遅延ストリーミングで LIMIT を尊重。callee_type は書き込み可能 |
heads | ジェネレーター | addr =、アドレス範囲 | 次/前のナビゲーションには ORDER BY addr を利用。広範囲のスキャンは大きくなる場合があります |
instruction_operands | イテレーター | addr、func_addr | アドレス検索は 1 つの命令をデコードし、関数検索は 1 つの関数を反復 |
segments | インデックスベース | 不要 | 小さなテーブルで、常に高速 |
names | イテレーター | 不要 | IDA の名前リストを反復 |
主なルール:
funcsは常に高速です — 制約は不要です。func_addrを指定しないinstructionsは、すべてのコードヘッドをスキャンします — 関数単位のクエリではfunc_addrを使用してください。func_addrを指定しないblocksは、すべての関数のフローチャートを反復します — 必ず制約を指定してください。headsは大きくなることがよくあります。アイテム情報にはaddr = Xを使用し、ナビゲーションにはアドレス範囲とORDER BY addr [DESC] LIMIT 1を使用してください。
コストモデル:
funcs (full scan) -> O(number of functions), typically ~1000s, fast
instructions WHERE func_addr -> O(function_size / avg_insn_size)
instructions (no constraint) -> O(total_code_heads), potentially 100K+
blocks WHERE func_addr -> O(block_count_in_func), fast
cfg_edges WHERE func_addr -> O(block_count_in_func), fast
disasm_calls WHERE func_addr -> O(instructions_in_func), streaming
disasm_calls UPDATE callee_type WHERE addr -> O(1) call-site lookup
heads WHERE addr -> O(1) IDA head check
heads next/prev LIMIT 1 -> O(distance to next/previous defined head)
instruction_operands addr -> O(operands in one instruction)
instruction_operands func -> O(operands in one function)
追加リソース
- 高度な CTE パターンと命令のライフサイクルに関する手順については、references/disassembly-examples.md を参照してください。
- 追加のテーブルスキーマ(fchunks、heads、bytes、signatures、problems、fixups など)については、references/disassembly-tables.md を参照してください。
関連項目
decompiler— 同じ関数の疑似コードと ctree。逆アセンブルが煩雑すぎる場合に切り替えてください。xrefs— 関数または呼び出しサイトを中心とした呼び出しグラフとデータ参照。data— オペランドを対象としたバイト/文字列。バイト単位の読み取りにはbytesテーブルを使用し、WHERE start_addr = X AND n = Nとhex(blob_concat(value))を組み合わせることで、範囲を限定したデータを一括で 16 進数表示できます。