日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android逆向:二进制xml文件解析 之 Start Tag Chunk

發布時間:2024/4/15 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android逆向:二进制xml文件解析 之 Start Tag Chunk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、xml結構

2、Start Tag Chunk Header

3、Start Tag Chunk Body

4、Atrributes

5、總結


在Android中,xml文件經過編譯后都是不可讀的二進制文件。今天我們來解析一下這個二進制文件的內容,看看如何與我們的源碼進行對應。

1、xml結構

在Android中,xml文件經過編譯后都是不可讀的二進制文件。它的結構如圖:

簡單說一下大概的結構:

  • Header Chunk:8個byte,type+headersize+fileszie
  • String Chunk:字符串池
  • ResourceId Chunk:?系統的資源id,即0x01xxxxxx這種
  • XMLContent Chunk:xml內容的結構

其中XMLContent Chunk是主要部分,是一個集合,從圖中可以看到它包含多種類型的數據結構,其中Start Namespace Chunk、End Namespace Chunk和Text Chunk這三種類型數據有可能不存在。而Start Tag Chunk和End Tag Chunk一定存在。

Start Tag Chunk和End Tag Chunk就是一個xml tag,如<View />或<View ></>,所以它們是成對出現的。

但是要注意不是一個Start Tag Chunk后面一定跟著一個End Tag Chunk,比如嵌套<Layout ><View /></Layout>,這種情況則是[Start Tag Chunk +?Start Tag Chunk +?End Tag Chunk +?End Tag Chunk]。

所以End Tag Chunk中基本沒有什么信息,大部分信息都在Start Tag Chunk中,這也是我們這篇文章討論的重點。

2、Start Tag Chunk Header

下面是Start Tag Chunk的一個實例:

02011000 74000000 00000000 FFFFFFFF FFFFFFFF 09000000 14001400 04000100?

00000000 0D000000 03000000 FFFFFFFF 08000001 3800077F 0D000000 05000000?

FFFFFFFF 08000010 FEFFFFFF 0D000000 06000000 FFFFFFFF 08000010 FEFFFFFF?

0D000000 07000000 FFFFFFFF 08000001 5300067F

下面我們一步步解析它。

從上面的圖中可以清楚的看到Start Tag Chunk的結構。不過沒展示的是Start Tag Chunk包含header和body結構。

Header的結構如下:

struct ResXMLTree_node{struct ResChunk_header header; uint32_t lineNumber;struct ResStringPool_ref comment; };

這里type(2byte)+ headersize(2byte,header大小固定是16byte)+ chunksize(4byte)+ lineNum(4byte)+ comment(4byte)

結合示例來看,其中橙色部分02011000 74000000 00000000 FFFFFFFF便是header。其中:

0201是type;1000是headersize,考慮字節就是16;74000000是chunksize,是116byte,除去header的16byte,body的大小應該是100byte,后面會驗證;00000000是lineNum;FFFFFFFF是沒有comment的默認值。

3、Start Tag Chunk Body

header后面就是body,body主要分兩部分,第一部分是有關tag的基本信息,第二部分則是Atrributes。

第一部分結構如下:

struct ResXMLTree_attrExt{struct ResStringPool_ref ns; struct ResStringPool_ref name; uint16_t attributeStart; uint16_t attributeSize; uint16_t attributeCount; uint16_t idIndex;uint16_t classIndex;uint16_t styleIndex; };

其中

  • ns: 命名空間,在字符串池中的索引。如果沒有就是 0xFFFFFFFF 。(4byte)
  • name:?元素名稱,在字符串池中的索引?。(4byte)
  • AttributeStart:?屬性段的相對body的偏移,由于這部分大小固定,所以這個偏移也是固定的20byte?。(2byte)
  • AttributeSize: 每個屬性的大小,固定是20byte?。(2byte)
  • AttributeCount: 屬性的總數?。(2byte)
  • idIndex:?第幾個屬性表示id?。(2byte)
  • classIndex:?第幾個屬性表示class?。(2byte)
  • styleIndex:?第幾個屬性表示style?。(2byte)

結合上面的例子來看,其中綠色部分FFFFFFFF 09000000 14001400 04000100?00000000便是這一部分,其中:

FFFFFFFF表示沒有命名空間;09000000表示元素名是字符串池第10個;第一個1400是偏移量,即20byte;第二個1400表示每個屬性大小是20byte;0400表示一共有4個屬性;0100表示第一個屬性是id;00000000表示沒有class和style。

這個tag實際是下面的代碼:

<ImageViewandroid:id="@+id/image1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/fio" />

可以看到它一共有四個屬性,而第一個屬性是id。如果我們去字符串池中找,會發現第10字符串是ImageView。

注意:我們可以驗證上面的body大小,這部分大小固定是20byte,而每個屬性大小是20byte,一共四個,所以body的大小正好是上面說過的100byte。

4、Atrributes

接下就是Atrributes,Atrributes是一系列Entry結構的集合,每個Entry的結構如下:

struct ResXMLTree_attribute{struct ResStringPool_ref ns;struct ResStringPool_ref name;struct ResStringPool_ref rawValue; struct Res_value typedValue;};

其中

  • Ns:?屬性的命名空間,在字符串池中的索引,比如“xmlns:android="http://schemas.android.com/apk/res/android"這種。(4byte)
  • Name:? 屬性的名稱,在字符串池中的索引。(4byte)
  • rawValue: 屬性的值的原始?XML?文字中字符串在?string indices?中的索引。(4byte)
  • TypeValue: 是一個表示屬性值的結構體。(8byte)

TypeValue的結構如下

struct Res_value {uint16_t size;uint8_t res0;uint8_t dataType;uint32_t data; }

其中

  • Size:表示?Res_value?的大小。可以看到這里固定是8byte大小,所以size固定是0x80。(2byte)
  • Res0:?始終為?0 (1byte)
  • dataType:?值的類型。(1byte)
  • data:屬性值。(4byte)

其中dataType類型如下:

public static final int TYPE_NULL = 0x00; public static final int TYPE_REFERENCE = 0x01; public static final int TYPE_ATTRIBUTE = 0x02; public static final int TYPE_STRING = 0x03; public static final int TYPE_FLOAT = 0x04; public static final int TYPE_DIMENSION = 0x05; public static final int TYPE_FRACTION = 0x06; public static final int TYPE_DYNAMIC_REFERENCE = 0x07;public static final int TYPE_FIRSTINT = 0x10; // Beginning of integer flavors...public static final int TYPE_INT_DEC = 0x10; // n..n. public static final int TYPE_INT_HEX = 0x11; // 0xn..n. public static final int TYPE_INT_BOOLEAN = 0x12; // 0 or 1, "false" or "true"public static final int TYPE_FIRST_COLOR_INT = 0x1c; // Beginning of color integer flavors... public static final int TYPE_INT_COLOR_ARGB8 = 0x1c; // #aarrggbb. public static final int TYPE_INT_COLOR_RGB8 = 0x1d; // #rrggbb. public static final int TYPE_INT_COLOR_ARGB4 = 0x1e; // #argb. public static final int TYPE_INT_COLOR_RGB4 = 0x1f; // ##rgb. public static final int TYPE_LAST_COLOR_INT = 0x1f; // ..end of integer flavors.public static final int TYPE_LAST_INT = 0x1f; // ...end of integer flavors.

結合上面的例子來看,藍色部分便是Atrributes,我們取其中一個來看,比如:

0D000000 03000000 FFFFFFFF 08000001 3800077F?

其中:

5、總結

總結

以上是生活随笔為你收集整理的Android逆向:二进制xml文件解析 之 Start Tag Chunk的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。