4ensiX

4ensiX

Forensics専門でなければ、CTFはDFIRの勉強にほとんど役立たないことをを知ったこの頃

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の話をすすめていく。

ja.wikipedia.org

apicodes.hatenablog.com

touch-slide.jp

 

 

apktool

apkファイルの中身を見たいときに、単にzipファイルとして解凍してもいいがapktoolを使えばunzipしてもよくわからないファイルも読めるようになる。

ibotpeaches.github.io

 

 

 

基本的なオプション:

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

file.apkの中身を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 Developers

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

APK の情報を表示する | まくまくAndroidノート

AAPT2  |  Android Developers

覚え書き: aapt の使い方

-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分野のようである。

dev.classmethod.jp

www.slideshare.net

github.com

 

参考

www.youtube.com

github.com

techbooster.org

 

wp.developapp.net

 

hipopocroco.hatenablog.com

qiita.com

 

では、今回はこんな感じで。