MASTG-KNOW-0113 逆アセンブラと逆コンパイラの使用 (Using Disassemblers and Decompilers)

逆アセンブラと逆コンパイラはアプリのバイナリコードやバイトコードを多かれ少なかれ理解できる形式に逆変換できます。ネイティブバイナリにこれらのツールを使用することで、アプリがコンパイルされたアーキテクチャに一致するアセンブラコードを取得できます。

逆アセンブラ (Disassemblers)

逆アセンブラはマシンコードをアセンブリコードに変換し、逆コンパイラはこのアセンブリコードを同等の高級言語コードを生成するために順に使用します。Android Java アプリは smali に逆アセンブルできます。smali は Android の Java VM である Dalvik で使用される DEX 形式のアセンブラ言語です。Smali アセンブリは逆コンパイルして同等の Java コードに戻すことも簡単です。

理論的には、アセンブリコードとマシンコード間のマッピングは一対一となるべきであるため、逆アセンブルは単純なタスクであるという印象を与える可能性があります。しかし実際には、以下のような複数の落とし穴があります。

  • コードとデータ間の確実な判別。

  • 可変命令サイズ。

  • 間接分岐命令。

  • 実行可能なコードセグメント内に明示的な CALL 命令がない関数。

  • 位置独立コード (PIC) シーケンス。

  • 手作りのアセンブリコード。

逆コンパイラ (Decompilers)

逆コンパイルは非常に複雑なプロセスであり、多くの決定論的および発見的アプローチに基づいています。結果として、逆コンパイルは一般的に実際には正確ではありませんが、それでも解析対象の関数をすばやく理解するのに非常に役立ちます。逆コンパイルの精度は逆コンパイルされるコードで利用可能な情報の量と逆コンパイラの洗練度に依存します。さらに、多くのコンパイルおよびポストコンパイルツールは理解や逆コンパイル自体の難しさを増すためにコンパイルされたコードをさらに複雑にします。そのようなコードは 難読化コード と呼ばれます (難読化 (Obfuscation) 参照)。

長年にわたり多くのツールが逆アセンブリと逆コンパイルのプロセスを完成させ、高い忠実度で出力を作成しています。なにかしらの利用可能なツールの高度な使用手順は多くの場合それ自体の本を簡単に埋めてしまいます。開始する最善の方法はニーズと予算にあったツールを選択して十分にレビューされたユーザーガイドを読むことです。

Last updated