逆コンパイル + 逆アセンブル のための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ファイルを解読しよう http://www.winapi-database.com/special/2001_10_11/page10.html
- DUMPBINのオプション http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg26_10_02.htm
- *.lib,*.dllファイルから関数のシンボル情報を得る方法 http://d.hatena.ne.jp/Seasons/20080928/1222587606
- DLLやLIBファイルを解析する場合は /EXPORTS (関数名一覧が出る), /SYMBOLS (セクション一覧が出る)オプションを使う。
逆コンパイラ
一般に,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を得る。
参照:
- microsoftの説明ページ http://msdn.microsoft.com/ja-jp/library/f7dy01k1.aspx
- EXE/DLL ファイルの内容は MSIL http://www2.nsknet.or.jp/~azuma/ms/0071.htm
- 解説 インサイド .NET Framework [改訂版] http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_index/index.html
しかし,ILはまだまだマシン語である(「オブジェクト指向の機械語」などと言われる)から,
これだけでは「逆アセンブル」だ。
高級言語への変換はしていない。
exeから,VB.NETやC#.NETのソースコードを取得するには,
Reflectorなるフリーソフトを使う。
このソフトをダウンロード+解凍したら,File→Openでexeを選択するだけ。
ソースコードが表示されて,
もとの変数名も関数名もルーチンの内容もわかってしまい,
逆コンパイル成功となる(ただし,MSILから推測して復元しているに過ぎない。)
- .NET Reflectorのダウンロード http://www.red-gate.com/products/reflector/
- .NET逆コンパイラとコードを難読化するDotfuscator http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html
(2)Java
HelloWorld.classというクラスファイルがあるとして,その解析方法。
逆アセンブラ
.class中のバイトコードを読み取る方法。
javapを使う。
javapはjdkに同梱されている。
ここでいうアセンブラとは,MSILの場合と同じく,
あくまで仮想マシンが読み取るアセンブリ(=VM用のバイトコードをニーモニック表示したもの)でしかない事に注意。
CPUに直接渡る命令ではない。
コマンドプロンプトから javap -c HelloWorld
参照:
逆コンパイラ
.classから.javaを(推測により)得る方法。
JADを使う。
Eclipse用にはjadclipseなるプラグインがあり,
これを使っていると余りにサクサクとソースコードが表示されるので,.classの存在を忘れてしまうほど。
コマンドプロンプトから jad -8 HelloWorld.class
- jadのダウンロードと使い方 http://adgjm.net/its/java/re.htm
まとめ
コマンドプロンプトから
- 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