備忘録

開発の日々の備忘録

ProGuardでAndroidアプリ(apk)を難読化してみる


Androidアプリリリース後、apkをダウンロードして逆コンパイルされるとソース丸見え…。
対策としてリリース前にはProGuardを使って、ソースコードを難読化しておく。

環境


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

srcディレクトリにjavaファイル一式が出来てるはず 。

実際に難読化前のプロジェクトと難読化後のプロジェクトを逆コンパイルしてそれぞれ比べてみると、難読化後のプロジェクトは「a.java、b.java…」といったjavaファイルが余計に作られていた。

備考


  • リリース用ビルドが通らない場合、「build.gradle(app)」と同じ階層にある「proguard-rules.pro」ファイルを調べながら弄ると良い
  • 難読化あり・なし両方とも逆コンパイルして比較してみると面白い
  • リリース用ビルドが通っても実機で正しく動かないこともあるらしい、実機検証かならず!