BNIL 命令ツリーとメタプログラム Python 命令マッチャーをグラフ化するための BinaryNinja プラグイン。
インストールは 2 つの方法でサポートされており、1 つ目は新しいプラグイン マネージャーを使用し、2 つ目は手動インストールです。
新しいプラグイン マネージャーを使用するには、[編集] メニューから [プラグインの管理] を選択します。プラグインリストで「BNIL 命令グラフ」を検索し、それを右クリックして「インストール」をクリックし、もう一度右クリックして「有効にする」を選択します。
$ git clone https://github.com/withzombies/bnil-graph.git
$ cd ~/Library/Application Support/Binary Ninja/plugins
$ ln -s ~/git/bnil-graph .
bnil-graph を使用するには、命令を右クリックして「BNIL 命令グラフ」を選択します。これにより、そのアドレスに関連付けられた BNIL 命令がグラフ化され、HTML フォームとして表示されます。
Binary Ninja はオペランド アクセサーを動的に追加します。このため、便利なアクセサーはdir()
呼び出しや API ドキュメントには表示されません。 bnil-graph は、適切なアクセサー名 (ソース レジスタまたはメモリのinsn.src
など) を含む IL 命令の構造を示します。
グラフの例:
グラフ プラグインに加えて、bnil-graph は、選択された命令に正確に一致するマッチャー関数も生成します。この機能により、新しいプラグイン開発者は指示を迅速に一致させることができます。使用目的は、一致させる命令に類似した命令を検索し、マッチャー関数を生成し、生成された関数を変更してニーズをより適切にサポートすることです。
例としては、3 つのパラメータを取るすべての MediumLevelILSSA MLIL_CALL_SSA 命令を検索しようとします。パラメーターが 0 の無関係な関数に対してマッチャーを生成しました。
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . output . dest_memory != 0x1 :
return False
if len ( insn . output . dest ) != 0 :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if insn . dest . constant != 0x14000d49c :
return False
if len ( insn . params ) != 0 :
return False
if insn . src_memory != 0x0 :
return False
return True
これを変更して、いくつかの特定の制約を削除できます。
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 0 :
return False
return True
呼び出し先とメモリのバージョン管理の制約を削除しました。次に、params チェックを更新して 3 つのパラメータをチェックします。
def match_3_param_MLIL_CALL_SSA ( insn ):
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 3 :
return False
return True
これで、3 つのパラメータを持つ MLIL_CALL_SSA 命令を識別するマッチャーが完成しました。次に、MLIL SSA 命令を反復処理し、マッチャーを呼び出して完了です。
if __name__ == '__main__' :
bv = binaryninja . BinaryViewType . get_view_of_file ( sys . argv [ 1 ])
bv . update_analysis_and_wait ()
for func in bv . functions :
mlil = func . medium_level_il
for block in mlil . ssa_form :
for insn in block :
if match_3_param_MLIL_CALL_SSA ( insn ):
print "Match: {}" . format ( insn )
マッチャーの例:
このプロジェクトの著作権は Ryan Stortz (@withzombies) にあり、Apache 2.0 ライセンスに基づいて利用できます。