逆アセンブラ(ぎゃくアセンブラ、英: disassembler; ディスアセンブラ)とは、逆コンパイラの一種であるが、実行ファイルないしオブジェクトファイルの機械語コード(とシンボルテーブルなどの付随情報)を基に、アセンブリ言語ソースコードを生成する、すなわちアセンブラの逆の作用をするものを特に指す。一般の(高水準言語コードを生成するような)逆コンパイラよりも比較的容易である。
概要
コンピュータが直接実行できるプログラムは数字の羅列である機械語であり、人間が直接理解することは困難である。この機械語は、人間にわかりやすいソースコードを、アセンブラやコンパイラ、リンカといったソフトウェアによって機械的に変換して得られたものに過ぎないので、プログラマはソースコードを理解してソフトウェアを開発すればよい。しかし、すでに機械語に変換されており、元のソースコードも手に入らない場合は、アセンブリとは逆の手順をたどる(逆アセンブリする)ことで擬似的にソースコードを復元することができる。
リバースエンジニアリングツールとしての逆アセンブラ
秘匿されている、紛失したなどの理由によりソースコードが入手できないプログラムの動作を知りたい場合、プログラムの機械語を人間が直接理解することは困難であるため、より人間に理解しやすいニーモニックに変換して解析の手助けとするために逆アセンブラを利用する。
人間に理解しやすいといっても、それはあくまでも機械語と比べて、という意味である。逆アセンブル結果からプログラムの内部動作を知り、元のソースコードを推定するまでの作業は一種の暗号解読のような困難な作業であり、非常に高度な技能を持つ技術者が膨大な手間と労力をかけて初めて達成されるものである。
ただし、プログラムの動作を解析されると様々な利害が絡むこともあるため、商用ソフトウェアのライセンスには逆アセンブルなどによるリバースエンジニアリングを禁止する文言があることが多く、また契約の場合にも同様である。
しかし、ソフトウェア特許の侵害を立証するために行われる逆アセンブルについては、これを禁止する契約の効力は及ばない。また、ライセンスや契約でリバースエンジニアリングを禁止する法理について日本では、平成20年の時点で文化庁でも検討中である[1]。
デバッガとしての逆アセンブラ
高級言語により作成されたソフトウェアのデバッグの手段として逆アセンブラを用いることがある。このためには独立した逆アセンブラを利用することもあるが、デバッガの機能の一部として提供される、ソースコードと機械語と逆アセンブル結果を混合して表示する「混合モード」(Mixモードとも言う)を利用することも多い。
高級言語は機械語にコンパイルすることによって実行形式を得るが、時としてプログラマが意図した高級言語のコーディングと、コンパイラが意図したコンパイル結果が一致しない事がある。また、コンパイラにはバグがあることもあり、時として間違ったコンパイルを行うことがある[注釈 1]。このような場合は、コンパイル前のソースコードをいくら眺めてもバグの原因を見極める事は困難であるため、実行コードである機械語を直接検証する必要がある。しかし前述の通り、機械語を人間が直接理解することは困難なので、機械語と一対一で対応するニーモニックに変換して表示する逆アセンブル機能をデバッガが提供している。
デバッグシンボル情報が実行形式に付加されている場合は、デバッガは逆アセンブル結果と一緒にソースコードも表示できるため[注釈 2]、プログラマがその意味を理解することは比較的易しい。開発中のソフトウェアのバイナリには通例デバッグシンボル情報が付加されるが、デバッグシンボル情報は巨大なファイルであり、またリバースエンジニアリングに役立つ情報も含まれているため、市場にリリースするソフトウェアのバイナリからは除去するのが普通である。除去したデバッグシンボル情報を保管しておく習慣のある開発組織は、ほとんどないため、エンドユーザー環境で発生したバグを逆アセンブルによって解析することは、時として他人が開発したソフトウェアを逆アセンブルによってリバースエンジニアリングするのと同様の困難を伴う。
サンプル
オンライン逆アセンブルサイト[2][3]を利用すると、個別CPUの命令とみなした逆アセンブルを試すことができる。
例えば、00
をZ80 CPUの機械語として逆アセンブルするとnop
、VAX CPUの機械語として逆アセンブルするとhalt
となり、i8086 CPUの機械語として逆アセンブルすると00
というデータ(命令とはみなされない)となる。00 00
をAVR CPUの機械語として逆アセンブルするとnop
、V850 CPUの機械語として逆アセンブルするとnop
となり、ARM CPUの機械語として逆アセンブルするとmovs r0, r0
、i8086 CPUの機械語として逆アセンブルするとadd %al,(%bx,%si)
、i386 CPUの機械語として逆アセンブルするとadd BYTE PTR [eax], al
、MIPS16(英語版) CPUの機械語として逆アセンブルするとaddiu s0,sp,0
となる。00 00 00 00
をMIPS CPUの機械語として逆アセンブルするとnop
、MC68000 CPUの機械語として逆アセンブルするとorib #0,%d0
となり、Alpha CPUの機械語として逆アセンブルするとhalt
となる。
脚注
注釈
- ^ 規模にもよるが、バグが一切ないソフトウェアはほとんどない。コンパイラもソフトウェアの一種であり、例外ではない。処理系自体の知名度を問わず、複雑な仕様の言語コンパイラや、テストが十分なされていないコンパイラにはバグが混入しやすい。
- ^ この機能を持つデバッガを特にシンボリックデバッガまたはソースレベルデバッガと呼ぶ。
出典
関連項目
- ツール群
外部リンク