web-dev-qa-db-ja.com

マシンコードのLLVMIRへの変換(X86_64の逆アセンブリ/再アセンブリ。X86。ARM LLVMビットコードへ)

X86_64、x86、ARM実行可能ファイルをLLVMIR(逆アセンブリ)に変換したいと思います。

どのような解決策を提案しますか?

27

mcsemaは、プロダクション品質のバイナリリフターです。 x86とx86-64を使用し、静的にLLVMIRに「リフト」します。それは積極的に維持され、BSDライセンスを取得しており、広範なテストとドキュメントがあります。

https://github.com/trailofbits/mcsema

13
Dan

RevGen ツールを使用することを検討してください S2Eプロジェクト 。 x86バイナリをLLVMIRに変換できます。ソースコードは、URL https://dslabgit.epfl.ch/git/s2e/s2e.gitで入手可能なGITリポジトリのRevgenブランチからチェックアウトできます。

11
bsa2000

@ bsa2000で言及されているRevGenツールに関して、この最新の論文 "コンパイラレベルの中間表現ベースのバイナリ分析および書き換えシステム" = S2EとRevincのいくつかの制限を指摘しています。

ここで引き出します。

  1. 動的翻訳の欠点:

    S2E [16]とRevnic [14]は、QEMUを使用してx86をLLVMに動的に変換する方法を示しています。私たちのアプローチとは異なり、これらのメソッドはコードのブロックをオンザフライでLLVMに変換するため、LLVM分析の適用は一度に1つのブロックのみに制限されます。

  2. IRが不完全:

    Revnic [14]とRevGen [15]は、変換されたブロックをマージすることによってIRを回復しますが、回復されたIRは不完全であり、現在の実行に対してのみ有効です。その結果、さまざまなプログラム全体の分析では、不完全な情報が提供されます。

  3. 抽象スタックや宣伝情報はありません

    さらに、変換されたコードは、スタックレイアウトに関する元のバイナリのすべての仮定を保持します。これらは、いくつかのソースレベルの分析のアプリケーションに不可欠な、抽象スタックを取得したり、メモリ位置をシンボルに昇格させたりするための方法を提供していません。

10
HackNone

普遍的な解決策(間接分岐などを考えてください)があるとは思えません。LLVMIRはどのアセンブラーよりもはるかに「高レベル」です。 BBごとに翻訳することは可能ですが。とりわけ、llvm-qemuおよびlibcpuプロジェクトを確認することをお勧めします。

2

いくつかの初期段階にある新しいプロジェクトがあります。libbeautyhttps://github.com/jcdutton/libbeauty

プロジェクトに関する記事:Libbeauty:別のリバースエンジニアリングツール、2013年12月24日、Michael Larabel http://www.phoronix.com /scan.php?page=news_item&px=MTU1MT

現在、入力としてx86_64のサブセットのみをサポートしています。プロジェクトの目標の1つは、生成されたLLVM IRをコンパイルしてアセンブリに戻し、同じ機能を持つバイナリを取得できるようにすることです。

1
osgx

ARMバイナリをLLVMIRに変換する方法についていくつかの参考資料を投稿してください。

disarm-llvmir逆アセンブラへのarmバイナリ

https://code.google.com/p/disarm/

しかし、私はそれを試したことがないので、その品質と安定性についてはよくわかりません。他の誰かがこのプロジェクトに関する追加情報を投稿できますか?

0
HackNone