こんにちは。
リバースエンジニアリングについて紹介します
UnCrackable App for Android Level 1

リバエンしていきたいと思います。この.apkはCTF的なやつでroot detectedをbypassするのが最終目的になります。しかし今回の記事では.apkからJaveのコードをデコンパイルするまでの内容になります。
apkってなに?という方もいるかと思うので用語などについて説明します。
Introduction to .apk file
アンドロイドのアプリケーションは.apkという拡張子を持ちます。実はこれは.zipと同じでリネームして展開すると開ます。今回の.apkを例にとって開いてみましょう。

見ての通り.pngなどいろいろありますね。これはあくまで一例ですが、いくつか紹介します。
- AndroidManifest.xml
- permissionとかpackageとかapiとか
- META-INF
- MF アプリのハッシュ値
- RSA アプリの証明書
- SF: list of resources and the SHA-1 digest of the corresponding lines in the MANIFEST.MF file
- classes.dex
- コンパイルされたJava(Kotlin)のDalvik bytecode(プログラムの部分)
- res
- 画像とかのリソース
- assets
- マルウェア系が組み込まれやすいところ
- lib
- nativeライブラリ
- .smali
- .dexのアセンブリ
僕もまだよくわかってないところが多いですがとりあえず、.xmlとclasses.dexくらいだけまず気にかけておけばいいです。ちなみに.smaliはこんな感じ

From .apk To .dex
上では.apkを.zipにリネームしてから開く方法を紹介しましたが実はこれよくないです。なぜならば一部がバイナリ エンコードされています。そこで専用のツールを使って.apkをdecompileして.dexを取得する方法を紹介します。

apktoolというものを使います。これを使えば.apkを展開できます。結果的に上で紹介したAndroidManifest.xmlなどが見れます。

上のどちらかのコマンドで.apkを展開できます。
これで展開したので.smaliを直接書き換えてから.apkを新しくリビルドする作戦でもいいですが、初心者には少しきついのでとりあえずここではJavaのソースコードまでコンパイルする作戦でいきます。ソースコードが見れれば振る舞いが理解しやすいですしね。
そこで.dexをJavaに変換するツールが必要になります。
From .dex To Java (decompiled)
dex2jarというものをつかいます。
どちらも一応同じものですが
- d2j_invoke.sh
- d2j-dex2jar.sh
をchmod +xで実行可能にします。そしてdex2jar-2.0/d2j-dex2jar.shを実行するだけです。一連の流れをまとめますと

出力される.jarファイルはclasses-dex2jar.jarです。ちなみに.apkから.jarまで一気にやるパターンは試してません。
See Decompiled Java Code
あとはJD-GUIを使えばソースコードが見れます。

僕はmacなのでmac版をインストールして上で作ったclasses-dex2jar.jarを開けば

いい感じです。
Resign signature
デコンパイルした.apkをEmulatorでも実機でもどちらでもインストールしようとすると
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]
とエラーが出る場合が多いです。そんな時はsignature(certification)が潰れてるので再発行します。その前にリビルド

からの

これでインストールできます。adb系のコマンドはいろいろありますね。

とりあえず今回はここまでにします。リバエンかfridaかどっちが好きですか?
References
- https://qiita.com/k-yamada-github/items/16f8eda646db982daee9
- https://urandroid.hatenablog.com/entry/20110818/1313656536
- https://programmer.help/blogs/5c2d94bc79b12.html
- https://adbshell.com/commands/adb-root
- https://docs.oracle.com/javase/jp/13/docs/specs/man/jarsigner.html
- https://docs.oracle.com/javase/jp/1.5.0/tooldocs/windows/jarsigner.html