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

こちらは[「体育会系エンジニア Advent Calendar 2017」](https://qiita.com/advent-calendar/2017/athlete)の24日目の記事です。23日目は @yuzu_afro さんの[「Raspberry Piを使って光って音が鳴るクリスマスツリーを作る」](https://qiita.com/yuzu_afro/items/bf473a2115c9d4d80614)でした。

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

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

世間はクリスマスな雰囲気にすっかり浮き足立っているというのに
悲惨な事態に孤立無援で立ち向かっております
どーも、長尾です
明日は**キリストの生誕祭**ですが
こちらは
**自分のアプリを自らリバースエンジニアリング**(以降リバエン)
**アプリの復活祭**なのでございます

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

#### [【１】Java(Kotlin)のソースコードを見たい](#１javakotlinのソースコードを見たい-1)
#### [【２】xmlのコードが見たい](#２３xmlのコードやアプリの中で使われている画像ファイルを見たい)
#### [【３】アプリの中で使われている画像ファイルを見たい](#２３xmlのコードやアプリの中で使われている画像ファイルを見たい)

まず、どれをやるにしても必要な準備
**リバエンしたいapkを用意する**
からいきます

## リバエンしたいアプリのapkファイルをスマホから抜いてゲットする
(リバエンしたいアプリをすでに.apkで持ってる場合はこのフローはいらないです)

コマンドでやる方法もありますが
GooglePlayに出てる**apk抽出系アプリ**を使っちゃうのが**手っ取り早い**っす

**例えばこういうアプリです**
https://play.google.com/store/apps/details?id=com.pandaz.apkextraction

スマホにインストールして起動すると
![1.png](https://qiita-image-store.s3.amazonaws.com/0/106533/8e650b89-b94f-dd61-9127-ddfddde3ec51.png)

あなたのスマホに入ってるアプリがズラっと並びます
お目当のアプリにチェックをいれて**apk Extraction**をタップ
あとはシェアボタンでGoogleドライブに上げたりすれば**apkを我がモノ**にできます





では、簡単なヤツからいきます
# 【２】【３】xmlのコードやアプリの中で使われている画像ファイルを見たい
ざっくり言うと
**apkをAndroidStudioにぶち込むことによってどっちも見れる**
です

まず
**さっきゲットしたapk**をあらかじめ**パソコン**のどこかに置いておきます
そして
AndroidStudioで **File → New → New Project** します
プロジェクト名を適当に決めて、Next→Next...でプロジェクトを作成します
で、作成したプロジェクトを開いた状態で
**Build→Analyze APK** とやると

![2.png](https://qiita-image-store.s3.amazonaws.com/0/106533/a0fad01d-217e-f9a6-aa29-6df2a4f27fa5.png)

ファイル選択ダイアログが出るので
あらかじめパソコンに置いておいたさっきのapkを選択します
するとこんな画面が開きます(今回は例でsample-appというアプリのapkを使っています)

![8.png](https://qiita-image-store.s3.amazonaws.com/0/106533/a13016d4-132b-faaf-a360-4df6dd9b91b7.png)



見るのは簡単で
**見たいxmlファイルをシングルクリック**
すると

![9.png](https://qiita-image-store.s3.amazonaws.com/0/106533/04040d15-8426-de6e-eed1-c7cd251f41ae.png)


下の部分にxmlの中身が表示されます
**画像のファイル**なんかはいつもの**drawable**とかに普通に入っていて
そちらも**シングルクリック**で見れます


**【２】【３】は以上です**



# 【１】Java(Kotlin)のソースコードを見たい
【２】【３】に比べるとだいぶやることいっぱいあります
## １.apkをzipにして展開する
**apk**を**zipにする**には単純に
apkの**ファイル名**を**XXX.apk**から**XXX.zip**に変えてあげればいいだけです

**通常はこれをダブルクリックするだけで展開される**のですが
**今回のzipをダブルクリック**すると
次から次へと**zipの親戚みたいなのが産まれて**展開される気配がない・・・
こんな**マトリョーシカzipな事態**に直面した時は

**The Unarchiver**
https://itunes.apple.com/jp/app/the-unarchiver/id425424353?mt=12
これを**Mac**にインストールして
さっきの**zipを右クリック**してこのアプリを選んだら展開してもらえます
(似たようなアプリでも**マトリョーシカ**になっちゃうのもあったのでうまくいったヤツを載せてます)

## ２.dex2jarを使ってclasses.dexファイルからjarファイルを生成する
次に展開されてできたフォルダの中にある
**classes.dex**
というファイルから**jarファイルを生成**します
やり方は

**dex2jar**
https://sourceforge.net/projects/dex2jar/
というもの(**dex2jar-2.0.zip**)をダウンロードして
**アプリを展開したフォルダが置いてあるのと同じフォルダに展開**します
(こっちのzipは**ダブルクリック**しても**マトリョーシカにならず普通に展開**されました)
今回長尾は**作業用にリバエンというフォルダを作って**
**リバエンフォルダ**の中に**アプリを展開したフォルダ**と**dex2jar-2.0フォルダ**を置きました
こういうことです

![11.png](https://qiita-image-store.s3.amazonaws.com/0/106533/e19f6ba5-86c7-21d5-aec3-feffcd0c09f9.png)

で
`$ cd リバエン`
した状態で(リバエンディレクトリに移動して)
以下のコマンドを叩きます

```
$ cd dex2jar-2.0/
$ chmod +x *
$ cd ..
$ dex2jar-2.0/d2j-dex2jar.sh sample-app/classes.dex
```
↑ナニをやったかというと
１行目　dex2jar-2.0フォルダの中に移動
２行目　dex2jar-2.0フォルダの中にある実行ファイルに実行権限を与える
３行目　リバエンフォルダに戻る
４行目　d2j-dex2jar.shというシェルを使ってclasses.dexからjarファイルを生成する
です
ここまでやるとリバエンフォルダに

![12.png](https://qiita-image-store.s3.amazonaws.com/0/106533/98e73e8f-be78-581b-4407-4c13b71926a6.png)



**classes-dex2jar.jar**
という**jarファイル**が作られます！

## ３.JD_GUIを使ってjarファイルの中身(Javaのコード)を見る
さあ！
ここまできたら後は

**JD-GUI**
http://jd.benow.ca/
というアプリを**Macにインストール**して
**さっきできたjarファイル**を右クリックしてこのアプリで開けば
ようやく**Javaのソースコード**を見ることができるはずです！

## ４.【訃報】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
```
↑ナニをやったかというと
１行目　JD-GUIのソースコードをgithubからclone
２行目　cloneしたjd-guiの中に移動
３行目　gradleでアプリをビルド
です
これをやると
**リバエン → jd-gui → → build → install → jd-gui-osx**
の中に
![7.png](https://qiita-image-store.s3.amazonaws.com/0/106533/535f1078-6c3a-afdb-9330-655ae3282590.png)
**JD-GUI.app**ができました・・・！
cloneしてビルドするまで1分かからないくらいでした

さて！
これでようやくずっとさっき作ったjarファイルを右クリックでこいつで開くと
![10.png](https://qiita-image-store.s3.amazonaws.com/0/106533/b2a009cc-c18c-fd73-d40f-db434dee68c2.png)

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

【１】は以上です
**おつかれさまでした！！**

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

**明日はついにChristmas！[「体育会系エンジニア Advent Calendar 2017」](https://qiita.com/advent-calendar/2017/athlete)のラストを飾ってくれるのは @Nkzn さんです！**