78
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-23

こちらは「体育会系エンジニア 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 さんです!

78
63
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?