利用者:Humhummogmog/sandbox/X86 Disassembly/Introduction
本書の目的
[編集]本書の目的は、x86機械語を人間が読めるアセンブリ言語に逆アセンブルすること、そしてx86アセンブリ言語を人間が読めるCもしくはC++のソースコードに逆コンパイルすることだ。本書で扱う話題の中には、x86互換マシンだけでなく、全てのコンピュータアーキテクチャで共通するものもある。
本書の範囲
[編集]本書の範囲は、x86機械語を逆アセンブルし、x86アセンブリ言語を逆コンパイルする方法を詳細に調べることだ。アセンブラとコンパイラがプログラムをどのように作成するのかを調べ、CもしくはC++のソースコードから機械語がどのように生成されるかを分析する。分析することで得られた知識を使って、コンパイルとアセンブリの過程を逆転することに挑戦する。データ構造や制御構造といった一般的な仕組みを分析することで、素早くプログラムを逆アセンブルし、逆コンパイルすることができるパターンが見付かる。
本書の対象読者
[編集]本書の対象読者は、x86アセンブリ言語とC (もしくはC++) の両方において、学部生程度の知識と経験を持つ者だ。本書はアセンブリ言語、CもしくはC++、コンパイラやアセンブラ理論等を教えるためのものではない。
本書の必須条件
[編集]X86アセンブラ、C言語、そしてできればC++も完全に理解していること。本書の狙いは、x86機械語、x86アセンブリ言語、C言語のそれぞれがどのように関連するかをより深く理解することにある。上記の項目で不安に感じるものがあれば、先に上記の本を再読されたい。
逆アセンブルとは
[編集]コンピュータプログラムは、まずアセンブリ言語や高級言語等の人間に読める形式で書く。それから機械語と言うバイナリ形式にコンパイルする。このバイナリ形式は、人間が直接読んだり理解したりすることはできない。プログラムはソースコードが手に入らないことが多い (マルウェア、商用プログラム、昔から使い続けているプログラム等)。
プログラムは、何度も繰り返し行う必要があるタスクや、他のプログラムと連携する必要があるタスクを頻繁に実行する。ソースコードと充分なドキュメントがなければ、こうしたタスクを完遂するのは難しい。本書で、実行可能ファイルの生の機械語を、アセンブリ言語と、C (とC++) といった高級言語に変換するために必要なツールとテクニックを概説する。あるタスクを実行するための高級言語があれば、以下の様なことが可能になる。
- プログラムを別のプラットフォームに移植するには、ソースコードを移植先の環境でコンパイルするだけでよくなる。
- プログラムが使用しているアルゴリズムが確定できる。これによって、他のプログラムで同じアルゴリズムを利用することができたり、プログラムの新バージョンを書き直す際に古いソースコードを追う必要がなくなったりする。
- セキュリティホールと脆弱性は、オリジナルのソースコードがなくても、ユーザが特定してパッチすることができるようになる。
- 古いプログラムに新しいインターフェースを実装することができるようになる。新しいコンポーネントを古いコンポーネントの上に作ることで、開発速度を上げ、コードをやたらに書き直さなくても済むようになる。
- マルウェアの動作を部分的に解明することができるようになる。悪影響を阻止するための方法が見つかればと思うが、残念なことに、自己書き換えのテクニック (多態的カモフラージュ、XOR暗号化、スクランブル) を駆使するマルウェア作家もいる。[1]こうなると、逆アセンブルはおろか、マルウェアを検出することすら困難になるようだ。
逆アセンブルには実用的な使用方法が多くある。副次的効果の良い一例は、機械語、アセンブリ言語、高級言語のつながりが深く理解できるようになることだ。こうした事柄をよく知れば、より効率的で安全なコードを書くことができるようになるだろう。