逆コンパイル【decompile】デコンパイル
逆コンパイルとは?

一般的なソフトウェア開発では、人間が理解しやすい高水準言語でソースコードを記述し、これを「コンパイラ」(compiler)と呼ばれるソフトウェアによってコンピュータが解釈しやすいオブジェクトコード(機械語コードや中間コード)に変換して配布する。逆コンパイルはこの過程を反転させ、オブジェクトコードを解析して元のソースコードへの復元を試みる処理である。専用の「逆コンパイラ」(decompiler)というソフトウェアによって実施する。
逆コンパイルは、開発元からソースコードの提供を受けられず実行形式のコードしか入手できない状況で、プログラムの挙動を詳細に調べる必要がある場合などに行われる。製品のソースコードが紛失した際の復旧作業、他社製品の動作原理を調べる「リバースエンジニアリング」(reverse engineering)、脆弱性やマルウェアの不正な挙動を解明するセキュリティ解析など、様々な場面で利用されている。
多くの場合、逆コンパイルによって得られるソースコードは、元のソースコードと完全に一致するわけではない。オブジェクトコード中には、変数名や関数名といった識別子、コメントなど実行時に不要な情報が破棄されていることが多く、失われた内容を復元することはできない。逆コンパイルは、機械的に生成した名称を変数名や関数名に割り当てることで、便宜的に読み取り可能な形に仕上げている。
また、コンパイラによる最適化処理により、ソースコードの実質的な処理内容を維持したまま、命令の並び替えや不要コードの削除などを経て別の構造に置き換えられている場合もある。この場合、逆コンパイルを行っても最適化後のコードが復元されるに留まり、元の記述とは異なる結果になる。一方、Javaのバイトコードや.NETの共通中間言語(CIL)のように、特定の仮想マシン向けに生成された中間コードを対象とする場合は、比較的高い精度で元の構造に近いコードを復元できる場合もある。
逆コンパイルは解析目的で広く利用される一方、市販のソフトウェアを改造してライセンス認証を無効化したり、独自のアルゴリズムを盗用したりする目的で悪用される懸念もある。そのため、多くの商業ソフトウェアでは利用規約によって逆コンパイルを禁止しており、コードの解析を妨げる難読化ツールなどの対策が導入される場合もある。