今回はセキュアなapkの作り方について少しまとめます。apkってなんだ?という方は以下の記事をどうぞ。
そもそもこの記事を書こうと思ったのはJavaが原因なんですよね。
Recap
とりあえず3つの手法があるようです。Isolate Java Program
重要なClassをサーバー側に置いておくことです。クライアントとは通信によってそのファイルへアクセスさせます。こうすることでデコンパイル自体を不可能することができます。重要なデータについてもサーバー側に置いておくことでデクリプションの可能性もなくなります。Convert to Native Codes
アンドロイドアプリケーションはJava(Kotlin)が一般的です。しかしJavaはデコンパイルされやすいです。(理由は後述します。)そこでデコンパイルが難しいネイティブを組み込む方法です。ネイティブはデコンパイルしたところでアセンブリになります。画像をもって説明します。
一方でデメリットもあります。一つはファイルが大きくなることです。アンドロイドはさまざまなアーキテクチャ上で動くことができるため、その分互換性のあるファイルを多く持つ必要があります。デコンパイルしたapkのlib内を確認してみます。

Code Obfuscation
ProGuardなどのツールを用いてコードを難読化する方法です。クラス名やメソッド名が乱数になったりします。以下をしてくれます。- Shrinking – detects and removes unused classes, fields, methods, and attributes.
- Optimization – analyzes and optimizes the bytecode of the methods.
- Obfuscation – renames the remaining classes, fields, and methods using short meaningless names.

Why is Java easily cracked?
先ほど対策方法でネイティブを埋め込む理由としてJavaはデコンパイルされやすいと言いました。それについて少し深入りします。そもそもJavaのコンパイル、デコンパイルの流れを確認しましょう。


Just-In-Time Compiler
JITはJavaのコンパイラです。ネイティブのコンパイルとの違いはタイミングです。これはdexをnative codeに変換します。公式からワークフローを拾ってきました。 よくわからないのでコピペで引用します。JIT コンパイラは、ART の現行の事前(AOT)コンパイラを補完し、ランタイムのパフォーマンスの改善、ストレージ容量の節約、アプリとシステムのアップデートの高速化を実現します。また、アプリの自動アップデート中のシステム シャットダウンや無線(OTA)アップデート中のアプリの再コンパイルを回避することで、AOT コンパイラのパフォーマンスも改善します。ここはまだ理解できる気がしないので今後の課題にしておきます。
ちなみに、dexじゃなくて機械語にコンパイルすればいいじゃんということにもなります。GCJというコンパイラが一応ありますが詳しくはわかっておりません。
Reverse Engineering Native Code
Javaが単純なのでNativeで書こう、ということになりました。ではNative Codeは本当に安全なのでしょうか?少しだけ深入りします。
ネイティブメソッドが走るには.so内のSystem.loadLibraryかSystem.loadが呼ばれる必要があるようです。そしてその時に先ほど紹介したJNIのJNI_OnLoad()とかが使われるらしいです。じゃあ具体的にNativeってJavaの中でどう書かれているの?と思うのでみてみます。

感想
やはりネイティブ最高、リバエン最高ですねReferences
- https://stackoverflow.com/questions/6235290/how-to-make-apk-secure-protecting-from-decompile
- https://stackoverflow.com/questions/12450510/why-is-it-so-easy-to-decompile-java-code
- https://limbenjamin.com/articles/analysing-smali-code.html
- https://www.spigotmc.org/threads/why-is-c-c-significantly-harder-to-decompile-than-java.343897/
- https://stackoverflow.com/questions/13509961/which-method-eventually-calls-jni-onload
- https://www.virusbulletin.com/uploads/pdf/magazine/2018/VB2018-Stone.pdf
- https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html