Reverse Engineering

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

逆コンパイルとは

もとの意味では完成済みのソフトウェアのコードを解析して情報を取り出す事です。リバースエンジニアリングとも呼ばれます。

システムの保守や改修には設計図書が必要ですが、何らかの都合で無い場合にこの方法を取ります。

ちなみに対義語は「フォワードエンジニアリング」。仕組みや仕様を理解したうえでコードを作成する事です。ただこの言葉をあえて使う事は少ないでしょう。

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

そもそもコンパイルとは

スマホアプリというのは、インストールするスマホ側ではコンパイル言語というプログラム言語でできています。
これは難解なマシン語を書かなくても、人間にわかりやすいように命令を書けるようにするための言語です。
クラウド側は自由度が高いので、いろんな言語が使われます。

このプログラム言語には、主に2種類あります。上から順に実行するインタプリタ言語と、実行ファイルに変換(コンパイル)して、まとめて実行するコンパイル言語があります。

プログラマー的には、この実行ファイルに変換する作業をコンパイルと呼んでいます。
さらに、アプリの場合はコンパイルした後にiOSやAndroidの必要なライブラリに関連づけるビルドという作業を行います。
このコンパイルするためのソフトウェアをコンパイラと言います。
C系やJavaといった高級言語をで開発し、コンパイルしてオブジェクトコードが作成されるわけですが、
このコンパイルに対し、逆コンパイルとはその名の通り、オブジェクトコードを解析し、ソースコードを作成する事です、それを行うプログラムを逆コンパイラと言います。

逆コンパイルはけっこう難しい

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

ちなみに、だいたいの開発元ではソースコードの解析を禁じていますので、基本的にやってはいけません。
リバースエンジニアリングを行ってソースコードを解析し、改めて自分の仕様でフォワードエンジニアリングを行うことをリエンジニアニングと呼びます。世の中の海賊版ソフトなどはこれに該当するものがあります。

知っているところでは、とあるラジオアプリで逆コンパイルを行って、本来できない録音機能のあるアプリをリリースしている海賊版アプリがありました。一般ユーザーは姉妹アプリだと思ってしまったようです。こういうのは後述の難読化で対処できます。

逆コンパイルが法律に触れる可能性

プログラムも著作物ですし、特許を取っているアプリも多いので、著作権法や特許法に抵触する可能性があります。
もちろん逆コンパイル自体は違法ではないですし、例えば対策のため自分のアプリを逆コンパイルするのは大丈夫です。また公開、販売せず研究のためにソースコードを開く事も問題ないと思われます。

逆コンパイルをやってみよう

逆コンパイラを行うためのソフトウェアには、

  • Reflector for .NET
  • REC – Reverse Engineering Compiler
  • Boomerang
  • .NET Reflector
  • ILSpy(.NET開発ツールの1コンポーネントだそうです)

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

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

逆コンパイルに難読化で対応しよう

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

またDNPハイパーテック社が展開するクラックプルーフなど、専用のサービスも出ています。
こんな事まで気を使うのだから、技術者は大変ですね!

梅木千世でした。