apkファイルに含まれたAndroidManifest.xmlのデコード

androidのアプリケーションパッケージであるapkファイルを適当なアプリでSDカードにバックアップした後、そのzipされてる中にある AndroidManifest.xml を読むことになったのでメモしておきます。

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