「逆アセンブラ」の版間の差分

削除された内容 追加された内容
3行目:
 
==概要==
一部の例外を除いて、コンピュータが直接実行形式のできるプログラムは数字の羅列である機械語であり、人間にはが直接理解することは困である。この機械語であは、人間にわか、プログラムを記述したやすい[[ソースコード]]を[[リンケージエディタ|リンカ]]を含めた[[アセンブラ]]や[[コンパイラ]]、[[ケージエディ|ンカ]]を介といったソフトウェアによって機械的に変換して得られ産物ものに過ぎないので、プログラマはソースコードを理解してソフトウェアを開発すればよい。にもかかわらず、以下のような場合には、プログラマはソースコードではなく機械語を理解する必要に迫られる
しかし、場合によっては、この機械語が何を意味しているのか知りたい事があり、それは大抵、以下に述べる理由から来るものである。
 
===[[リバースエンジニアリング]]としての逆アセンブラ===
秘匿されている、紛失したなどの理由によりソースコードが入手できないプログラムの動作を知りたい場合、プログラムの機械語は数値の羅列に過ぎないので、人間が直接理解することは困難である。そのため、機械語に比べてより人間に理解しやすいニーモニックに変換して解析の手助けとするために逆アセンブラを利用する。
 
人間に理解しやすいといっても、それはあくまでも機械語と比べたらわかりやすいという意味である。逆アセンブル結果からプログラムの内部動作を知り元のソースコードを推定するまでの作業は一種の暗号解読のような困難な作業であり、非常に高度なスキルを持つ技術者が膨大な手間と労力をかけて初めて達成されるものである。
但し、プログラムの動作を解析されるとノウハウの流出となるほか様々な利害が絡むこともあるため、商用アプリケーションでは使用契約によって逆アセンブルを禁止していることが普通である。一方で、ソフトウェア[[特許]]の侵害を立証するためには逆アセンブルが不可欠であるから、このような場合には逆アセンブルの禁止規定を無視して行われる。
 
但し、プログラムの動作を解析されるとノウハウの流出となるほか様々な利害が絡むこともあるため、商用ソフトウェプリケーションでは使用契約によって逆アセンブルを禁止していることが普通である。一方で、ソフトウェア[[特許]]の侵害を立証するためには逆アセンブルが不可欠であるから、このような場合には逆アセンブルの禁止規定を無視して行われる。
===[[デバッガ]]としての逆アセンブラ===
 
高級言語の[[デバッグ]]に逆アセンブラを用いる事がある。
===[[デバッガ]]としての逆アセンブラ===
この機能の提供手段は、独立したプログラムとしても存在するが、デバッガの機能である混合モード(Mixモードとも言う)として付随する事も多々ある。
高級言語により作成されたソフトウェアの[[デバッグ]]の手段として逆アセンブラを用いることがある。
高級言語は機械語に[[コンパイル]]してから利用するが、時として、[[プログラマ]]が意図した高級言語のコーディングと、コンパイラが意図したコンパイル結果が一致しない事がある。
このためには独立した逆アセンブラを利用することもあるが、[[デバッガ]]の機能の一部として提供される、ソースコードと機械語と逆アセンブル結果を混合して表示する「混合モード」(Mixモードとも言う)を利用することも多い。
また、あまり市場に出回っていない(一般的でない)コンパイラには[[バグ]]も多く含まれている為、時に間違った翻訳を行う。
 
この様な場合、翻訳前の状態であるソースコードを幾ら眺めても動作を見極める事は不可能である為、実行コードである機械語を直接検証する必要がある。
高級言語は機械語に[[コンパイル]]することによって実行形式を得るが、時として、[[プログラマ]]が意図した高級言語のコーディングと、コンパイラが意図したコンパイル結果が一致しない事がある。また、あまり市場に出回っていないマイナーなコンパイラには[[バグ]]も多いため、時として間違ったコンパイルを行うことがある。このような場合は、コンパイル前のソースコードをいくら眺めてもバグの原因を見極める事は困難であるため、実行コードである機械語を直接検証する必要がある。しかし前述の通り、機械語を人間が直接理解することは困難なので、機械語と一対一で対応するニーモニックに変換して表示する逆アセンブル機能をデバッガが提供している。
ただ、前述の通り、機械語を直接解釈するには労力を要する事から、逆アセンブラを利用してニーモニックを検証の対象する。
 
デバッグシンボル情報が実行形式に付加されている場合は、デバッガは逆アセンブル結果と一緒にソースコードも表示できるため、プログラマがその意味を理解することは比較的易しい。開発中のソフトウェアにはデバッグシンボル情報が付加されているが、デバッグシンボル情報は巨大なファイルであるため、市場にリリースするソフトウェアからは除去するのが普通である。残念ながら除去したデバッグシンボル情報を保管しておく習慣のある開発組織はほとんどない(ソフトウェア開発環境の[[ブラックボックス]]化が進んだため、そもそもデバッグシンボル情報が何かを理解している開発者が少ない)ため、市場で発生したバグを逆アセンブルによって解析することは、時として他人が開発したソフトウェアを逆アセンブルによってリバースエンジニアリングするときと同様の困難さが伴うこともある。
 
==関連項目==