Edited at

【2018保存版】MacでAndroidアプリ(.apk)をリバースエンジニアリング

More than 1 year has passed since last update.

こちらは「体育会系エンジニア Advent Calendar 2017」の24日目の記事です。23日目は @yuzu_afro さんの「Raspberry Piを使って光って音が鳴るクリスマスツリーを作る」でした。


人様のアプリの中を覗き見たいだなんてハレンチだとお思いですか?

このたび

GooglePlayに公開しているアプリのソースコードをなくしました

世間はクリスマスな雰囲気にすっかり浮き足立っているというのに

悲惨な事態に孤立無援で立ち向かっております

どーも、長尾です

明日はキリストの生誕祭ですが

こちらは

自分のアプリを自らリバースエンジニアリング(以降リバエン)

アプリの復活祭なのでございます


やりたいことって大体以下3つですよね


【1】Java(Kotlin)のソースコードを見たい


【2】xmlのコードが見たい


【3】アプリの中で使われている画像ファイルを見たい

まず、どれをやるにしても必要な準備

リバエンしたいapkを用意する

からいきます


リバエンしたいアプリのapkファイルをスマホから抜いてゲットする

(リバエンしたいアプリをすでに.apkで持ってる場合はこのフローはいらないです)

コマンドでやる方法もありますが

GooglePlayに出てるapk抽出系アプリを使っちゃうのが手っ取り早いっす

例えばこういうアプリです

https://play.google.com/store/apps/details?id=com.pandaz.apkextraction

スマホにインストールして起動すると

1.png

あなたのスマホに入ってるアプリがズラっと並びます

お目当のアプリにチェックをいれてapk Extractionをタップ

あとはシェアボタンでGoogleドライブに上げたりすればapkを我がモノにできます

では、簡単なヤツからいきます


【2】【3】xmlのコードやアプリの中で使われている画像ファイルを見たい

ざっくり言うと

apkをAndroidStudioにぶち込むことによってどっちも見れる

です

まず

さっきゲットしたapkをあらかじめパソコンのどこかに置いておきます

そして

AndroidStudioで File → New → New Project します

プロジェクト名を適当に決めて、Next→Next...でプロジェクトを作成します

で、作成したプロジェクトを開いた状態で

Build→Analyze APK とやると

2.png

ファイル選択ダイアログが出るので

あらかじめパソコンに置いておいたさっきのapkを選択します

するとこんな画面が開きます(今回は例でsample-appというアプリのapkを使っています)

8.png

見るのは簡単で

見たいxmlファイルをシングルクリック

すると

9.png

下の部分にxmlの中身が表示されます

画像のファイルなんかはいつものdrawableとかに普通に入っていて

そちらもシングルクリックで見れます

【2】【3】は以上です


【1】Java(Kotlin)のソースコードを見たい

【2】【3】に比べるとだいぶやることいっぱいあります


1.apkをzipにして展開する

apkzipにするには単純に

apkのファイル名XXX.apkからXXX.zipに変えてあげればいいだけです

通常はこれをダブルクリックするだけで展開されるのですが

今回のzipをダブルクリックすると

次から次へとzipの親戚みたいなのが産まれて展開される気配がない・・・

こんなマトリョーシカzipな事態に直面した時は

The Unarchiver

https://itunes.apple.com/jp/app/the-unarchiver/id425424353?mt=12

これをMacにインストールして

さっきのzipを右クリックしてこのアプリを選んだら展開してもらえます

(似たようなアプリでもマトリョーシカになっちゃうのもあったのでうまくいったヤツを載せてます)


2.dex2jarを使ってclasses.dexファイルからjarファイルを生成する

次に展開されてできたフォルダの中にある

classes.dex

というファイルからjarファイルを生成します

やり方は

dex2jar

https://sourceforge.net/projects/dex2jar/

というもの(dex2jar-2.0.zip)をダウンロードして

アプリを展開したフォルダが置いてあるのと同じフォルダに展開します

(こっちのzipはダブルクリックしてもマトリョーシカにならず普通に展開されました)

今回長尾は作業用にリバエンというフォルダを作って

リバエンフォルダの中にアプリを展開したフォルダdex2jar-2.0フォルダを置きました

こういうことです

11.png



$ cd リバエン

した状態で(リバエンディレクトリに移動して)

以下のコマンドを叩きます

$ cd dex2jar-2.0/

$ chmod +x *
$ cd ..
$ dex2jar-2.0/d2j-dex2jar.sh sample-app/classes.dex

↑ナニをやったかというと

1行目 dex2jar-2.0フォルダの中に移動

2行目 dex2jar-2.0フォルダの中にある実行ファイルに実行権限を与える

3行目 リバエンフォルダに戻る

4行目 d2j-dex2jar.shというシェルを使ってclasses.dexからjarファイルを生成する

です

ここまでやるとリバエンフォルダに

12.png

classes-dex2jar.jar

というjarファイルが作られます!


3.JD_GUIを使ってjarファイルの中身(Javaのコード)を見る

さあ!

ここまできたら後は

JD-GUI

http://jd.benow.ca/

というアプリをMacにインストールして

さっきできたjarファイルを右クリックしてこのアプリで開けば

ようやくJavaのソースコードを見ることができるはずです!


4.【訃報】JD-GUIでjarを開くとクラッシュする可能性がございます

(2018/7/17 今だにHighSierraでクラッシュしました)

さっきので無事見れた方はおしまいでイイのですが

このクラッシュがSierra & HighSierra で起こったりするみたいです

正直ここで試合終了かと思いました

classファイルのデコンパイラアプリって

JD-GUIの他に見当たらないのです(T_T)

しかし今回

そもそもなんで長尾はリバエンなんかしてるのかというと

GooglePlayに公開しているアプリの大事な大事なソースコードをなくしたから

なので

終了するワケいかないんす

どーしてもなんとかするしかないんす

解決方法を探してたどり着いたページには

githubにあるJD-GUIを自分でビルドすればイケるよ!

というものでした

やってみましょう

どこのディレクトリでやってもいいのですが

ひとまずわかりやすいところで

$ cd リバエン

した状態(リバエンディレクトリに移動)で

JD-GUIを自分でビルドするコマンド

$ git clone https://github.com/java-decompiler/jd-gui.git

$ cd jd-gui
$ ./gradlew installOsxDist

↑ナニをやったかというと

1行目 JD-GUIのソースコードをgithubからclone

2行目 cloneしたjd-guiの中に移動

3行目 gradleでアプリをビルド

です

これをやると

リバエン → jd-gui → → build → install → jd-gui-osx

の中に

7.png

JD-GUI.appができました・・・!

cloneしてビルドするまで1分かからないくらいでした

さて!

これでようやくずっとさっき作ったjarファイルを右クリックでこいつで開くと

10.png

見れました!

(ちなみにこちら元はKotlinで書かれたソースコードです)

【1】は以上です

おつかれさまでした!!


結論

アプリのソースコードはなくさないように大切に保管しましょう

明日はついにChristmas!「体育会系エンジニア Advent Calendar 2017」のラストを飾ってくれるのは @Nkzn さんです!