Kali Linux Forensics tools(2) [apktool] androidのアプリ用の.apkファイルを解析
Kali Linux Forensics tools の紹介、第二回はapktool についてまとめる。実際はまとめるといっても公式のドキュメントの一部を日本語訳してみただけであるが。個人的にはツールの勉強と英語の勉強が一石二鳥でできるような気分なので良い。前回は触れなかったが、このシリーズの記事ではKali Linuxのメタパッケージ kali-linux-forensicに含まれるツールについて調べてことをまとめたものなので、インストール方法などは言及しないことをご了承ください。何かctfで使えそうなやつもちょいちょいリンクする。
apkファイル
apktool は簡単に説明するとapkファイルをいじるツールだが、まずapkファイルとは何か。あまり深くは触れないが、一言でいうとAndroidアプリをインストールするためのファイルでインストーラーのようなもの。Android用にコンパイルされたプログラムの他に、デジタル証明書、マニフェストファイルなどが含まれている。ZIPファイルとして解凍することができるが、この方法で解凍した場合中身を読むのが困難なファイルがある。dex2jar使えばいいじゃんという方もいるだろうが今回はapktoolの話をすすめていく。
apktool
apkファイルの中身を見たいときに、単にzipファイルとして解凍してもいいがapktoolを使えばunzipしてもよくわからないファイルも読めるようになる。
基本的なオプション:
dオプション(デコード)
apkファイルをデコードして中身が見られるように解体するオプション。ただし、デコードするapkファイルによってはフレームワークのリソースを入手する必要がある。フレームワークの操作は上手くまとめられなかったので公式documentationを参照願う。また、ProGuardで難読化が施されているapkファイルはファイル構成が異なるので上手くいかないことがあるらしい。
$apktool d file.jar
file.jarをfoo.jar.out ディレクトリに展開する。dの代わりにdecodeと打ち込んでもよい。
$apktool d file.apk
file.apkの中身をfile ディレクトリに展開する。dの代わりにdecodeと打ち込んでもよい。
$apktool d file.apk -o hoge
bオプション(ビルド)
デコードしたものを再び実行できる形にするビルドオプション。ただ、このオプションでビルドしたものは元のものより小さくなり、META-INFなどが無くなるなど完全なものにはできない。
$apktool b file.jar.out
file.jar.out ディレクトリの中身を file.jar.out/dist/file.jarとしてビルド。bの代わりにbuildを指定してもよい。
$apktool b dir
dir ディレクトリの中身をdir/dist/dir.apkとしてビルド。
$apktool b .
カレントディレクトリの中身を./distにビルド。
$apktool b dir -o new_file.apk
dir ディレクトリの中身をnew_file.apkとしてビルド。
その他のオプション
Utility:
いつでも実行できるオプション群。
-version, --version
現在のバージョンを出力。
-v, --verbose
詳細な出力を行う。パラメータとして始めに指定する必要がある。
-q, --quiet
簡易的な出力。パラメータとして始めに指定する必要がある。
-advance, --advanced
高度な出力。
Empty Framework Dir:
-f, --force
強制的に指定したディレクトリを削除する。
-p, --frame-path <DIR>
フレームワークファイルをロードする場所を指定する。
Decode:
apkファイルのデコードオプション。
-api , -api-level <API>
生成するsmaliファイルのAPIレベル(デフォルトは targetSdkVersion)を設定する?(APIレベルをどうするかはっきりと記述されていない)。
smaliファイルについて:
apkファイルのプログラム部分smaliファイルを見てみる - がじぇったほりっく
APIレベルについて:
AndroidのアプリにAPI レベルを指定する方法 – FeeeeeLog
2018年に要求されるtargetSdkVersion(対象APIレベル)を解説します – FeeeeeLog
-b , --no-debug-info
backsmaliがデバッグ情報(.local, .param, .lineなど)を書き込まないようにする。行番号などのデバッグ情報は同じAPKでもバージョンごとに違うと思われる。異なるバージョンの同じAPKからsmalliを比較している場合に使うと良い。(デコードの仕様にはbacksmaliが含まれているということなのだろうか)
backsmali関連:
GitHub - JesusFreke/smali: smali/baksmali
baksmali - is01rebuild @wiki - アットウィキ
smali/baksmaliでAndroidのコードを編集してみる - Qiita
androidにプリインストールされたアプリのodexをbaksmaliでdeodexしてapkに収める方法 #androidjp | 名古屋@WEBデザイナーの憂鬱
-f , --force
もうすでにある出力先のディレクトリにデコードするときにそのディレクトリを強制削除する。
--force-manifest
リソースのフラグに関係なく強制的にAndroidManifestをデコードする。
--keep-broken-res
"Invalid Config Flags Detected. Dropping Resources.."というようなエラーが出たとき、指定したapkファイルがapktoolで扱える形式ではないことを表す。このとき原因としては、新しいAndroidのバージョンか規格に合わない変わったAPKであることが考えられる。このオプションにより、無理やり実行できるがその後-ERRを付けてフォルダを修正する必要がある(-ERRが調べても分からなかった)。
-m , --match-original
できるだけ元のファイルに近い形にデコードするが、リビルドはできない。(意訳気味)
--no-assets
未知のasset filesのデコード/コピーを防ぐ。
asset file関連:
Androidでassetsフォルダからデータを読み込む - Ararami Studio
assetsフォルダのファイルを扱う方法 AssetManager - [サンプルコード/Androidアプリ] ぺんたん info
assets内のファイル名を取得 « こものAndroidメモ
リソースへのアクセス | Android Developers
WebView でアセットに登録した HTML ファイルをロードする方法 - Android 開発入門
【Android】assetsフォルダのファイルをローカルストレージにコピーする - Qiita
-o , --output <DIR>
apkが出力されるフォルダの名前を指定(意訳)。
-p , --frame-path <DIR>
読み込むフレームワークファイルの在るパスを指定(意訳)。
-r , --no-res
リソースがデコンパイルされるのを防ぐ。resources.arscをそのままデコードしない。Java(smali)だけを編集している場合は、早いデコンパイルとリビルドのために有効なオプションである。
-s , --no-rsc
dexファイルの逆アセンブルを防ぐ。これはapkのdexファイルをそのままにし、ビルド中にそれを移動させるだけである。一人でリソースを編集しているならば、早い逆アセンブルとアセンブルのために有効なオプションである。
-t , --frame-tag <TAG>
<TAG>でタグ付けされたフレームワークファイルを利用する。
Rebuild:
apkファイルをビルドするときのオプション群。
-a , --aapt <FILE>
pathの代わりに、指定されたファイルの場所からaaptをロードする。$PATH ファイルが見つからない場合はパスの読み込みに戻る。$PATH がビルド済みのカスタムaaptを参照しない限り、これは上手くいかないと思われる。
aapt(Android Asset Packaging Tool)関連:
aapt(Android Asset Packaging Tool)でapkファイルが対応しているネイティブコードのCPUアーキテクチャを確認する - Qiita
-api , --api-level <API>
ビルドする対象のsmaliファイルのAPIレベル(デフォルトは targetSdkVersion)を設定する?(APIレベルをどうするかはっきりと記述されていない2)。
-c , --copy-original
オリジナルのAndriodManifest.xmlとMETA-INFフォルダをビルドするapkファイルにコピーする。このオプションは廃止予定。
-d , --debug
AndriodManifestファイルにdebuggable="true"を追加する。
-f , --force-all
ビルドの間に既存のファイルに上書きし、resources.arsc ファイルと dex ファイルを再構成する。
-nc , --no-crunch
ビルド中のリソースのクランチ(バラバラになる?)を無効にする。
-o , --output <FILE>
出力するファイルの名前と場所を指定する。
-p , --frame-path <DIR>
読み込むフレームワークファイルの場所を指定する。
--use-aapt2
aapt の代わりに aapt2 binary を利用する。
以上apktoolのオプションと主な機能であった。
今後もこのシリーズは、ほとんど英語訳の自己満足的な記事になってしまうかもしれないが、きっと拙い日本語訳でもどんなツールでどんなことができるかをなんとなくでも見たことがあれば、いつか役に立つことを願っている。
今回も何か英語訳が変なところがあれば公式のドキュメントの確認を勧める。
余談だが、CTFではapkファイルの解析はBinary分野のようである。
参考
では、今回はこんな感じで。