スポンサーリンク

逆コンパイル + 逆アセンブル のための5つの無料ツール (.exeと.classをリバースエンジニアリングするための,フリーソフトの使い方)

逆コンパイル, および逆アセンブルのための各ツールと,実行手順を列挙する。

.exeと.classが対象。


※リバースエンジニアリングにあたっては,ソフトウェアの使用契約にくれぐれも留意すること。


※↑ もくじジェネレータ で自動生成

Windowsのexeファイルと, Javaのclassファイルについて,それぞれ逆アセンブル+逆コンパイルの方法を考える。



(1).exeファイル

逆アセンブラ

exeからasm(形式の表示)を生成する方法。


機械語をニーモニック表示し,データセクションもダンプする。
プログラムが利用している文字列定数などは丸見えになる。

( exeモデル図解の「セクション部」の部分を参照:http://www.geocities.jp/winapi_database2/special/2001_10_11/page1.html )


Visual Studioに付属するdumpbin.exeを使う。使い方:

  コマンドプロンプトから

   dumpbin /DISASM /rawdata a.exe > b.asm

参照:

逆コンパイラ

一般に,exeからソースコードを復元する事は難しい。


しかし.NET Frameworkで構築されたアプリケーションならば,

exeの中身はネイティブコードではなくMSIL(中間言語)であり,

素の機械語よりも遥かに容易にデコンパイルできる。(難読化されている場合を除く)


まず,exeから中間言語を得る方法。

.NET framework付属のildasm.exeを使う。

設置パスは,例えば

  • C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe

などにある。

  コマンドプロンプトから

   ildasm /output=b.txt a.exe

これでMSILを得る。

参照:


しかし,ILはまだまだマシン語である(「オブジェクト指向の機械語」などと言われる)から,

これだけでは「逆アセンブル」だ。

高級言語への変換はしていない。


exeから,VB.NETやC#.NETのソースコードを取得するには,

Reflectorなるフリーソフトを使う。

このソフトをダウンロード+解凍したら,File→Openでexeを選択するだけ。


ソースコードが表示されて,

もとの変数名も関数名もルーチンの内容もわかってしまい,

逆コンパイル成功となる(ただし,MSILから推測して復元しているに過ぎない。)

(2)Java

HelloWorld.classというクラスファイルがあるとして,その解析方法。


逆アセンブラ

.class中のバイトコードを読み取る方法。


javapを使う。

javapはjdkに同梱されている。


ここでいうアセンブラとは,MSILの場合と同じく,

あくまで仮想マシンが読み取るアセンブリ(=VM用のバイトコードをニーモニック表示したもの)でしかない事に注意。

CPUに直接渡る命令ではない。

  コマンドプロンプトから

   javap -c HelloWorld

参照:

逆コンパイラ

.classから.javaを(推測により)得る方法。

JADを使う。


Eclipse用にはjadclipseなるプラグインがあり,

これを使っていると余りにサクサクとソースコードが表示されるので,.classの存在を忘れてしまうほど。

  コマンドプロンプトから

   jad -8 HelloWorld.class

(3)その他

Flash(swfファイル)の逆コンパイルができる,と謳っているツールもある。

こちらは変換というより「抽出」に近いだろう。



まとめ

コマンドプロンプトから

  • dumpbin /DISASM /rawdata a.exe > b.asm
  • ildasm /output=b.txt a.exe
  • javap -c HelloWorld
  • jad -8 HelloWorld.class

GUIで

  • .NET Reflector



関連する記事:

メモリの中身を読んでみよう (プロセスをダンプ+解析する方法)
http://language-and-engineering.hatenablog.jp/entry/20081019/1224341559


ウィンドウをきっかけに Windows の内部の仕組みを探る (前半の補足)アセンブラでウィンドウを生成する方法
http://language-and-engineering.hatenablog.jp/entry/20081109/1226258057


ウィンドウをきっかけに Windows の内部の仕組みを探る (後半)システムコールからカーネルデバイスドライバまで
http://language-and-engineering.hatenablog.jp/entry/20081111/1226413103