前どこかの記事で書いたかもしれませんが、僕はリバエンが大好きです。好きすぎてやばいです。めちゃめちゃ楽しいので皆さんにも紹介します。
UnCrackable App for Android Level 1

apkってなに?という方もいるかと思うので用語などについて説明します。
Introduction to .apk file
アンドロイドのアプリケーションは.apkという拡張子を持ちます。実はこれは.zipと同じでリネームして展開すると開ます。今回の.apkを例にとって開いてみましょう。
- 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のアセンブリ

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

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

See Decompiled Java Code
あとはJD-GUIを使えばソースコードが見れます。

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



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