ProGuardでAndroidアプリ(apk)を難読化してみる
Androidアプリリリース後、apkをダウンロードして逆コンパイルされるとソース丸見え…。
対策としてリリース前にはProGuardを使って、ソースコードを難読化しておく。
環境
- Android Studio 2.1.2
- OS X El Capitan
ProGuardを有効化する
Android Studioでプロジェクトを開いて「Gradle Scripts」にある「build.gradle(app)」を編集
リリースビルド時にProGuardによる難読化をするように設定
(省略) buildTypes { release { minifyEnabled true ←trueに変更 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } (省略)
編集したら、[Build]→[Generate Signed APK]でリリース用apkを作成
確認
出来上がったリリース用apkを逆コンパイルしてソースが難読化されているか確認してみる。
ここから先はターミナルで作業します。
dex2jar(https://sourceforge.net/projects/dex2jar/)をセットアップ
$ mkdir ~/tools $ cd ~/tools $ curl -Lk https://sourceforge.net/projects/dex2jar/files/latest/download -o dex2jar.zip $ unzip dex2jar.zip $ chmod +x dex2jar-2.0/*
jad(http://varaneckas.com/jad/)をセットアップ
$ cd ~/tools ダウンロードするjadは環境に合わせて変更(今回はMacで作業してるのでMac用取ってくる) $ curl -L http://varaneckas.com/jad/jad158g.mac.intel.zip -o jad158g.mac.intel.zip $ unzip jad158g.mac.intel.zip -d jad
リリース用apk(app-release.apk)を作業用ディレクトリに移して作業かいし。
$ cd (app-release.apkを移動したディレクトリ) $ unzip app-release.apk $ ls AndroidManifest.xml app-release.apk res META-INF classes.dex resources.arsc
展開先のclasses.dexをdex2jarを使ってjarファイルに変換する
$ sh ~/tools/dex2jar-2.0/d2j-dex2jar.sh classes.dex dex2jar classes.dex -> ./classes-dex2jar.jar $ unzip classes-dex2jar.jar -d classes
jadをつかってclassesディレクトリ内のclassファイル一式を逆コンパイルする
$ ~/tools/jad/jad -o -r -sjava -dsrc classes/**/*.class
実際に難読化前のプロジェクトと難読化後のプロジェクトを逆コンパイルしてそれぞれ比べてみると、難読化後のプロジェクトは「a.java、b.java…」といったjavaファイルが余計に作られていた。
備考
- リリース用ビルドが通らない場合、「build.gradle(app)」と同じ階層にある「proguard-rules.pro」ファイルを調べながら弄ると良い
- 難読化あり・なし両方とも逆コンパイルして比較してみると面白い
- リリース用ビルドが通っても実機で正しく動かないこともあるらしい、実機検証かならず!