日記帳

CTFのWriteupや雑記など

idc.create_insn 関数の仕様について

IDAPythonの idc.create_insn 関数の仕様について知らず *1 、少し詰まったので備忘録も兼ねて記録を残しておきます。

idc.create_insn 関数がやること

  • 引数で渡したアドレスをコードとして定義 / 変換する
    • そのアドレス以降をコードとして定義 / 変換するのは、スクリプトの実行が完了した後にIDAのコードアナライザがやっていること参考
    • GUI上ではコードとして定義 / 変換可能でも、idc.create_insn 関数経由だと失敗する場合がある(対処法があるか要検証)
      • 追記: 既にコードとして定義されている箇所と矛盾するため失敗する。ida_bytes.del_items 関数で予め未定義状態にしておけば、問題なくコードとして定義 / 変換が可能

IDAPythonスクリプトからコードアナライザを実行する方法

コードアナライザ単体を実行する方法は見つからなかった。指定した範囲のFull Analysisを実行する idc.plan_and_wait 関数を用いることで対応できる。ただし範囲が広ければ広いほど(また実行回数が多ければ多いほど)処理に時間がかかるため、何らかの工夫が必要。

*1:idcモジュールの公式ドキュメントになぜか項目が存在しない。