idapython について
idapythonは、最新の`ida_*`モジュールでIDAのリバースエンジニアリング作業をスクリプト化するSkillです。データベース分析、逆コンパイル、型や名前の操作、命令、クロスリファレンスのAPI例をまとめています。
主な機能
- 01作業に応じた`ida_*`モジュールの選択
- 02関数と命令の反復処理
- 03バイト列の読み取りとパッチ
- 04名前、型、構造体の操作
- 05関数の逆コンパイルとctree走査
- 06クロスリファレンスと文字列の確認
活用シーン
- 01IDAデータベース分析スクリプトの作成
- 02関数、命令、クロスリファレンスの列挙
- 03関数を逆コンパイルして変数や呼び出しを確認
- 04アドレスへの型適用やバイト列のパッチ
MCP 対応
READMEでは基数変換に`int_convert` MCPツールを使うよう記載されていますが、MCPサーバーへの接続や管理方法は説明されていません。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mrexodia/ ida-pro-mcp --skill idapythonインストール後、Claude Code で/idapythonを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/ida_auto.mdida_auto.rstida_bitrange.mdida_bitrange.rstida_bytes.mdida_bytes.rstida_dbg.mdida_dbg.rstida_dirtree.mdida_dirtree.rstida_diskio.mdida_diskio.rstida_entry.mdida_entry.rstida_expr.mdida_expr.rstida_fixup.mdida_fixup.rstida_fpro.mdida_fpro.rstida_frame.mdida_frame.rstida_funcs.mdida_funcs.rstida_gdl.mdida_gdl.rstida_graph.mdida_graph.rstida_hexrays.mdida_hexrays.rst詳細
IDAPython
最新の ida_* モジュールを使用してください。従来の idc モジュールは避けてください。
モジュール一覧
| タスク | モジュール | 主な項目 |
|---|---|---|
| バイト/メモリ | ida_bytes | get_bytes、patch_bytes、get_flags、create_* |
| 関数 | ida_funcs | func_t、get_func、add_func、get_func_name |
| 名前 | ida_name | set_name、get_name、demangle_name |
| 型 | ida_typeinf | tinfo_t、apply_tinfo、parse_decl |
| デコンパイラー | ida_hexrays | decompile、cfunc_t、lvar_t、ctree ビジター |
| セグメント | ida_segment | segment_t、getseg、add_segm |
| クロスリファレンス | ida_xref | xrefblk_t、add_cref、add_dref |
| 命令 | ida_ua | insn_t、op_t、decode_insn |
| スタックフレーム | ida_frame | get_frame、define_stkvar |
| 反復処理 | idautils | Functions()、Heads()、XrefsTo()、Strings() |
| UI/ダイアログ | ida_kernwin | msg、ask_*、jumpto、Choose |
| データベース情報 | ida_ida | inf_get_*、inf_is_64bit() |
| 解析 | ida_auto | auto_wait、plan_and_wait |
| フローグラフ | ida_gdl | FlowChart、BasicBlock |
| レジスター追跡 | ida_regfinder | find_reg_value、reg_value_info_t |
基本パターン
関数を反復処理する
for ea in idautils.Functions():
name = ida_funcs.get_func_name(ea)
func = ida_funcs.get_func(ea)
関数内の命令を反復処理する
for head in idautils.FuncItems(func_ea):
insn = ida_ua.insn_t()
if ida_ua.decode_insn(insn, head):
print(f"{head:#x}: {insn.itype}")
クロスリファレンス
for xref in idautils.XrefsTo(ea):
print(f"{xref.frm:#x} -> {xref.to:#x} type={xref.type}")
バイトを読み書きする
data = ida_bytes.get_bytes(ea, size)
ida_bytes.patch_bytes(ea, b"\x90\x90")
名前
name = ida_name.get_name(ea)
ida_name.set_name(ea, "new_name", ida_name.SN_NOCHECK)
関数をデコンパイルする
cfunc = ida_hexrays.decompile(ea)
if cfunc:
print(cfunc) # pseudocode
for lvar in cfunc.lvars:
print(f"{lvar.name}: {lvar.type()}")
ctree(デコンパイルされた AST)を走査する
class MyVisitor(ida_hexrays.ctree_visitor_t):
def visit_expr(self, e):
if e.op == ida_hexrays.cot_call:
print(f"Call at {e.ea:#x}")
return 0
cfunc = ida_hexrays.decompile(ea)
MyVisitor().apply_to(cfunc.body, None)
型を適用する
tif = ida_typeinf.tinfo_t()
if ida_typeinf.parse_decl(tif, None, "int (*)(char *, int)", 0):
ida_typeinf.apply_tinfo(ea, tif, ida_typeinf.TINFO_DEFINITE)
構造体を作成する
udt = ida_typeinf.udt_type_data_t()
m = ida_typeinf.udm_t()
m.name = "field1"
m.type = ida_typeinf.tinfo_t(ida_typeinf.BTF_INT32)
m.offset = 0
m.size = 4
udt.push_back(m)
tif = ida_typeinf.tinfo_t()
tif.create_udt(udt, ida_typeinf.BTF_STRUCT)
tif.set_named_type(ida_typeinf.get_idati(), "MyStruct")
文字列の一覧
for s in idautils.Strings():
print(f"{s.ea:#x}: {str(s)}")
解析の完了を待つ
ida_auto.auto_wait() # Block until autoanalysis completes
主な定数
| 定数 | 値/用途 |
|---|---|
BADADDR | 無効なアドレスを示す値 |
ida_name.SN_NOCHECK | 名前の検証をスキップ |
ida_typeinf.TINFO_DEFINITE | 型の適用を強制 |
o_reg、o_mem、o_imm、o_displ、o_near | オペランドの型 |
dt_byte、dt_word、dt_dword、dt_qword | データ型 |
fl_CF、fl_CN、fl_JF、fl_JN、fl_F | コードのクロスリファレンス型 |
dr_R、dr_W、dr_O | データのクロスリファレンス型 |
重要なルール
- 16 進数/10 進数を手動で変換しないでください —
int_convertMCP ツールを使用してください - 解析を待つ:結果を読み取る前に
ida_auto.auto_wait()を呼び出してください - スレッドセーフティ:IDA SDK の呼び出しはメインスレッドで実行する必要があります(
@idasyncを使用してください) - 64 ビットアドレス:
ea_tは常に 64 ビットになり得るものとして扱ってください
避けるべきパターン
| 避けること | 代わりに行うこと |
|---|---|
idc.* 関数 | ida_* モジュールを使用する |
| アドレスのハードコード | 名前、パターン、またはクロスリファレンスを使用する |
| 16 進数の手動変換 | int_convert ツールを使用する |
| メインスレッドをブロックする | 長時間の処理には execute_sync() を使用する |
| 型を推測する | 逆アセンブル/デコンパイルから導き出す |
詳細な API リファレンス
各モジュールの包括的なドキュメントについては、docs/<module>.md を参照してください:
- 使用頻度:高:
ida_bytes、ida_funcs、ida_hexrays、ida_typeinf、ida_name、idautils - 使用頻度:中:
ida_segment、ida_xref、ida_ua、ida_frame、ida_kernwin - 特化用途:
ida_dbg(デバッガー)、ida_nalt(netnode ストレージ)、ida_regfinder(レジスター追跡)
hex-rays.com の完全な RST ソースは docs/<module>.rst で入手できます。
コメント
Markdown 対応