こんにちは。

リバースエンジニアリングについて紹介します

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