こちらは「体育会系エンジニア 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
あなたのスマホに入ってるアプリがズラっと並びます
お目当のアプリにチェックをいれてapk Extractionをタップ
あとはシェアボタンでGoogleドライブに上げたりすればapkを我がモノにできます
では、簡単なヤツからいきます
【2】【3】xmlのコードやアプリの中で使われている画像ファイルを見たい
ざっくり言うと
apkをAndroidStudioにぶち込むことによってどっちも見れる
です
まず
さっきゲットしたapkをあらかじめパソコンのどこかに置いておきます
そして
AndroidStudioで File → New → New Project します
プロジェクト名を適当に決めて、Next→Next...でプロジェクトを作成します
で、作成したプロジェクトを開いた状態で
Build→Analyze APK とやると
ファイル選択ダイアログが出るので
あらかじめパソコンに置いておいたさっきのapkを選択します
するとこんな画面が開きます(今回は例でsample-appというアプリのapkを使っています)
見るのは簡単で
見たいxmlファイルをシングルクリック
すると
下の部分にxmlの中身が表示されます
画像のファイルなんかはいつものdrawableとかに普通に入っていて
そちらもシングルクリックで見れます
【2】【3】は以上です
【1】Java(Kotlin)のソースコードを見たい
【2】【3】に比べるとだいぶやることいっぱいあります
1.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を右クリックしてこのアプリを選んだら展開してもらえます
(似たようなアプリでもマトリョーシカになっちゃうのもあったのでうまくいったヤツを載せてます)
2.dex2jarを使ってclasses.dexファイルからjarファイルを生成する
次に展開されてできたフォルダの中にある
classes.dex
というファイルからjarファイルを生成します
やり方は
dex2jar
https://sourceforge.net/projects/dex2jar/
というもの(dex2jar-2.0.zip)をダウンロードして
アプリを展開したフォルダが置いてあるのと同じフォルダに展開します
(こっちのzipはダブルクリックしてもマトリョーシカにならず普通に展開されました)
今回長尾は作業用にリバエンというフォルダを作って
リバエンフォルダの中にアプリを展開したフォルダとdex2jar-2.0フォルダを置きました
こういうことです
で
$ 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ファイルを生成する
です
ここまでやるとリバエンフォルダに
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
の中に
JD-GUI.appができました・・・!
cloneしてビルドするまで1分かからないくらいでした
さて!
これでようやくずっとさっき作ったjarファイルを右クリックでこいつで開くと
見れました!
(ちなみにこちら元はKotlinで書かれたソースコードです)
【1】は以上です
おつかれさまでした!!
結論
アプリのソースコードはなくさないように大切に保管しましょう
明日はついにChristmas!「体育会系エンジニア Advent Calendar 2017」のラストを飾ってくれるのは @Nkzn さんです!