mcpField
S
storage

storage

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

storage について

IDASQL ユーザー向けに、IDA の netnode_kv 永続キー・バリューストアを説明するスキルです。IDB 内に分析状態やメタデータを保存し、完全一致キーでの検索やセッションをまたぐ進捗管理に使えます。

主な機能

  1. 01IDB 内へのキー・バリュー保存
  2. 02値の作成、読み取り、更新、削除
  3. 03完全一致キーによる検索
  4. 04JSON 形式の分析状態保存
  5. 05名前空間によるキー整理

活用シーン

  1. 01セッション間で分析進捗を引き継ぐ
  2. 02分析者やデータベースのメタデータ記録
  3. 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) のキー検索に対応しています。

列型書き込み可能説明
keyTEXT—一意のキー(識別子、読み取り専用)
valueTEXTはい任意の長さの値(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_kvO(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 を使用してください。

コメント