apkファイルに含まれたAndroidManifest.xmlのデコード
androidのアプリケーションパッケージであるapkファイルを適当なアプリでSDカードにバックアップした後、そのzipされてる中にある AndroidManifest.xml を読むことになったのでメモしておきます。
文字列テーブル
後述するxmlデータ中の文字列がまとめて格納されています。
ヘッダ情報
- エントリ数 *(Int32)[data+0x10]
- 開始アドレス *(Int32)[data+0x1c] +8
この開始アドレスから、エントリ数だけ次の構造を読みます。
- Int16 長さ
- UTF-16 String 文字列データ
- UNT-16[1] null terminator
xmlデータ
文字列テーブルの後にXMLデータのヘッダがあるのですが、
構造がよくわからないのでFFFFFFFFまで読み飛ばします。
さらに12バイト読み飛ばすか12バイト戻すと、次のような構造があります。
0x100102 開始タグ
# 0x100102,0x38,0x54,-1,-1, タグ名
タグ名というか文字列は全て文字列テーブルのインデクスで表現されています。
3つ目はおそらくタグのインデックス
4つ目はおそらく名前空間です。
0x140014 属性
# 0x140014,0x1,0x0
2つ目が属性の数です。この並びの後に次のような属性データが複数並びます。
# ns,name,nazo1,nazo2,value
最後3つの部分は値の表現ですが、即値、リソースID、文字列テーブル参照などのパターンがあります。
0x100103 終了タグ
# 0x100103,0x18,0x55,-1,-1,manifest
開始タグと似た構造です。
0x100101 全体の終了
# 0x100101,0x18,0x55,-1,android,http://schemas.android.com/apk/res/android
3つめの数字は最後のタグのID
0x100100 全体の開始
# 0x100100,0x18,0x13,-1,android,http://schemas.android.com/apk/res/android
3つめの数字は最初のタグのID