storage について
IDASQL ユーザー向けに、IDA の netnode_kv 永続キー・バリューストアを説明するスキルです。IDB 内に分析状態やメタデータを保存し、完全一致キーでの検索やセッションをまたぐ進捗管理に使えます。
主な機能
- 01IDB 内へのキー・バリュー保存
- 02値の作成、読み取り、更新、削除
- 03完全一致キーによる検索
- 04JSON 形式の分析状態保存
- 05名前空間によるキー整理
活用シーン
- 01セッション間で分析進捗を引き継ぐ
- 02分析者やデータベースのメタデータ記録
- 03関数ごとの注釈状況の追跡
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ allthingsida/ idasql-skills --skill storageインストール後、Claude Code で/storageを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
netnode_kv
IDA の netnode を基盤とする永続的なキー・バリューストアです。データは IDB 内に自動的に保存されます。完全な CRUD と、WHERE key = '...' による O(1) のキー検索に対応しています。
| 列 | 型 | 書き込み可能 | 説明 |
|---|---|---|---|
key | TEXT | — | 一意のキー(識別子、読み取り専用) |
value | TEXT | はい | 任意の長さの値(Blob ストレージ) |
-- Store a value
INSERT OR REPLACE INTO netnode_kv(key, value) VALUES('author', 'alice');
-- Read by key (O(1) lookup)
SELECT value FROM netnode_kv WHERE key = 'author';
-- List all entries
SELECT * FROM netnode_kv;
-- Update a value
UPDATE netnode_kv SET value = '2.0' WHERE key = 'version';
-- Delete an entry
DELETE FROM netnode_kv WHERE key = 'author';
ユースケース
- セッション状態:セッションをまたいで解析の進捗を追跡します(例:注釈を付けた関数の記録)
- メタデータ:アナリスト名、解析日、メモなどのカスタムメタデータを保存します
- 記録管理:再ソース化、注釈付け、レビューを行った関数を追跡します
- 設定:データベースごとの解析設定を保存します
-- Track analysis progress
INSERT OR REPLACE INTO netnode_kv(key, value) VALUES('annotated_funcs', '["main","init_config"]');
-- Update progress
UPDATE netnode_kv SET value = '["main","init_config","process_input"]'
WHERE key = 'annotated_funcs';
-- Read progress in a new session
SELECT value FROM netnode_kv WHERE key = 'annotated_funcs';
パフォーマンスに関するルール
| 操作 | 計算量 | 備考 |
|---|---|---|
WHERE key = '...' | O(1) | IDA の netnode hashval_long() — 必ず完全一致のキー検索を使用します |
WHERE key LIKE 'prefix%' | O(n) | すべてのエントリーを走査します。小規模なデータセットであれば問題ありません |
SELECT * FROM netnode_kv | O(n) | netnode 全体を走査します。通常の用途(数十から数百件)であれば問題ありません |
主なルール:
- 完全一致のキー検索(
WHERE key = '...')は O(1) です。これを優先的なアクセスパターンとして使用してください。 - プレフィックス検索(
LIKE 'prefix%')はすべてのエントリーを反復しますが、通常の netnode サイズであれば高速です。 - netnode_kv は IDB ファイル内に保存されます。
save_database()を実行すると自動的に永続化されます。
高度なストレージパターン
JSON による進捗管理
より柔軟にクエリできるよう、構造化された解析状態を JSON として保存します。
-- Store progress with structured metadata
INSERT OR REPLACE INTO netnode_kv(key, value)
VALUES('progress:overview', json_object(
'total_funcs', (SELECT COUNT(*) FROM funcs),
'named_funcs', (SELECT COUNT(*) FROM funcs WHERE name NOT LIKE 'sub_%'),
'timestamp', datetime('now')
));
-- Read and parse progress
SELECT json_extract(value, '$.total_funcs') AS total,
json_extract(value, '$.named_funcs') AS named,
json_extract(value, '$.timestamp') AS ts
FROM netnode_kv WHERE key = 'progress:overview';
関数ごとの注釈ステータス管理
注釈を付けた関数と、その作業内容を追跡します。
-- Mark a function as annotated
INSERT OR REPLACE INTO netnode_kv(key, value)
VALUES('re_source:' || printf('0x%X', 0x401000),
json_object('status', 'done', 'summary', 'DriverEntry init',
'analyst', 'alice', 'date', date('now')));
-- Find unannotated functions by joining with funcs
SELECT f.name, printf('0x%X', f.addr) AS addr
FROM funcs f
WHERE f.name NOT LIKE 'sub_%'
AND NOT EXISTS (
SELECT 1 FROM netnode_kv
WHERE key = 're_source:' || printf('0x%X', f.addr)
)
ORDER BY f.size DESC
LIMIT 20;
キーの命名規則
整理しやすいよう、namespace:entity:id 形式を使用します。
re_source:0x401000 → per-function annotation status
config:string_minlen → analysis configuration
snapshot:2024-01-15 → point-in-time analysis snapshot
tag:crypto:0x401000 → function tags/categories
-- List all keys in a namespace
SELECT key, value FROM netnode_kv WHERE key LIKE 'tag:crypto:%';
-- Count entries per namespace
SELECT SUBSTR(key, 1, INSTR(key, ':') - 1) AS namespace,
COUNT(*) AS entries
FROM netnode_kv
WHERE key LIKE '%:%'
GROUP BY namespace
ORDER BY entries DESC;
関連項目
annotations— アドレス空間内に保持するアナリストの記録(コメント、ブックマーク)にはこちらを使用します。アドレスをまたぐセッション状態にはnetnode_kvを使用してください。
コメント
Markdown 対応