objdump -dを呼び出して返されるアセンブリ結果のコントロールフローグラフを作成しようとしています。現時点で最善の方法は、結果の各行をリンクリストに入れ、各行のメモリアドレス、オペコード、オペランドを区切ることです。私はobjdumpの結果の規則的な性質に依存してそれらを分けています(メモリアドレスは各行を表す文字列の文字2から文字7までです)。Objdumpの結果を使用してコントロールフローグラフを作成する
これが完了したら、私は実際のCFG命令を開始します。 CFGの各ノードは、開始および終了メモリアドレス、前の基本ブロックへのポインタ、および任意の子基本ブロックへのポインタを保持する。次に、objdumpの結果を調べて、オペコードとx86_64のすべての制御フローオペコードの配列を比較します。オペコードが制御フローの場合、アドレスを基本ブロックの最後に記録し、オペコードに応じて2つの子ポインタ(条件付きオペコード)または1つ(コールまたはリターン)を追加します。
私はこれをC言語で実装する段階にありますが、うまくいくと思われますが、非常に薄いと感じます。誰にも何か提案や、私が考慮していないことはありますか?
お読みいただきありがとうございます!
編集:
アイデアは、ターゲットバイナリのために予想されるCFGに対してDynamoRIOによって生成されたシステムコールのスタックトレースを比較するためにそれを使用することで、私はこのようにそれを構築することが容易になることを願っています。私は利用可能なものを再利用していない。なぜなら、A)私はそれについて実際には思っていなかったし、B)グラフを使用可能なデータ構造にしてパス比較を行う必要があるからだ。私はあなたが並んでいるページのいくつかのユーティリティを見ていきます。私に正しい方向を教えてくれてありがとう。あなたのコメントをありがとう、私は本当にそれを感謝します!
考えられる全体的なアプローチのように聞こえます。あなたは、間接的な呼び出しを見たときに何をすべきか考えてみたいかもしれません。また、返信指示には、複数の発信者を持つ機能のために、それが正確には1つの後継者があると言います。コールやリターンはCFG(LLVM IRなど)には含まれないことがよくあります。 「正しい」答えは、CFGを作成した後にCFGで何をする予定かによって異なります。 –
興味深いアプローチ。ソースコードからCFGを作成するためのツールがいくつかあります(http://en.wikipedia.org/wiki/Call_graphを参照)。利用可能なものを再利用するのではなく、このアプローチを採用する理由は何ですか? – Sudhanshu
どのように関数ポインタを解決していますか?同様の種類のプログラムを書いていますが、私はどのように関数ポインタを解決するのだろうと思っていますか? – prap19