スマートフォン

逆コンパイル(デコンパイル)できるかな

アプリの開発をしていると、他人のコードが気になる事があります。
純粋な興味でなくても、他人のアプリを解析して通信内容をコピってしまう困った人もいます。
こんな時に登場するのが、デコンパイルという技術です。

そもそも、アプリというのはコンパイル言語というプログラム言語でできています。
これは難解なマシン語を書かなくても、人間にわかりやすいように命令を書けるようにするのがプログラム言語です。
これには上から順に順次実行するインタプリタ言語と、実行ファイルに変換(コンパイル)して、まとめて実行するコンパイル言語があります。
スマホアプリは基本的にコンパイル言語です。

プログラマー的には、この実行ファイルに変換する作業をコンパイルと呼んでいます。
さらに、アプリの場合はコンパイルした後にiOSやAndroidの必要なライブラリに関連づけるビルドという作業を行います。

このコンパイルするためのソフトウェアをコンパイラと言います。

C系やJavaといった高級言語をで開発し、コンパイルしてオブジェクトコードが作成されるわけですが、
このコンパイルに対し、逆コンパイルとはその名の通り、オブジェクトコードを解析し、ソースコードを作成する事です、それを行うプログラムを逆コンパイラと言います。

逆コンパイルと言いますが、完全にもとのソースコードに戻すのは簡単ではなく、変数名はコンパイル時に失われているため、だいたいの言語では元通りになりません。
しかし、Androidアプリ開発に使われるJavaの実行ファイルは、読んでわかるくらいの再現度でソースコードが再現される可能性が比較的高いです。

ちなみに、だいたいの開発元ではソースコードの解析を禁じていますので、基本的にやってはいけません。

逆コンパイラを行うためのソフトウェアには、
Reflector for .NET
REC – Reverse Engineering Compiler
Boomerang

など、いくつかあります。

アプリで言うと、apkファイルからdexファイルを取り出し、
dexファイルをjarファイルに変換し、さらにそこからclassファイルを取り出し、javaファイルを復元します。

Androidアプリは、このデコンパイルを行うと簡単にソースコードを盗用したり、接続元の通信に入れたり、アプリの脆弱性を突く攻撃の糸口にされたりしてしまう可能性があります。
こういった攻撃の対策のため、ProGuardなどを使うと、ある程度アプリのソースコードを難読化することができます。
さらにapkのサイズを小さくする事にもなるとか何とか。

こんな事まで気を使うのだから、技術者は大変ですね!

梅木千世でした。

Share on FacebookTweet about this on TwitterShare on Google+