安卓文件分析-androidmanifest.xml&resources.arsc&META-INF目录

androidmanifest.xml

AXML文件格式:
(apk的配置信息)
:xml->AXML
ResFileheader
ResStringpool
ResIDs
ResXMLTree
在这里插入图片描述

struct ResChunk_header{
   uint16_t type;
   uint16_t headersize;//当前ResChunk_header的大小 
   uint32_t size;//该chunk结构体数据的长度,它包涵当前Reschunk_header前两个字段的8字节
}

type是个枚举取的值 对xml文件来说是0x003 RES_XML_TYPE
struct ResStringPool_header{
    struct ResChunk_header header;//这里type 是0x1 RES_STRING_POOL_TYPE
    uint32_t stringCount;//字符串的数目
    uint32_t styleCount;//样式的数目
     enum {
        SORTED_FLAG = 1 <<0,
        UTF8_FLAG = 1 <<8
          };
     uint32_t flags;
     uint32_t stringsStart;//字符串列表在文件中的偏移
     uint32_t stylesStart;//样式列表在文件中的偏移
};
struct ResStringPool_string
{
    uint32_t index;//字符串在文件的具体偏移量    
}; 

ids资源
typedef struct {
    ResChunk_header header; //type为0x180 PES_XML_RESOURCE_MAP_TYPE
    int count;//资源id的个数
    uint ids[count];//一个个资源id
}
xml文件的具体内容 每个xml节点由基本结构体ResXMLTree_node和扩展结构体组成
struct ResXMLTree_node{
     struct ResChunk_header header;//第一个type 为RES_XML_START_NAMESPACE_TYPE 最后为RES_XML_END_NAMESPACE_TYPE
     unit32_t lineNumber;在xml第几行
     struct ResStringPool_ref comment;//节点数据关联的注释内容->ResStringPool_ref
};
struct ResStringPool_ref{
  uint32_t index;//stringpool的索引
  
};
(start end的)扩展结构体
struct ResXMLTree_namespaceExt
{
   struct ResStringPool_ref prefix;//namespace的前缀
   struct ResStringpool_ref uri;//namespace的url
}
在RES_XML_START_NAMESPACE_TYPE与RES_XML_END_NAMESPACE_TYPE类型的节点数据中间是一系列以RES_XML_START_ELEMENT_TYPE开头 以RES_XML_END_ELEMENT_TYPE结束的成对的ResXMLTree_node节点数据,
(中间节点的扩展结构体)
struct ResXMLTree_attrExt
{
  struct ResStringPool_ref ns;
  struct ResStringPOOl_ref name;
  uint16_t attributeStart;//属性的初始地址 文件的偏移
  uint16_t attributeSize;//属性的大小
  uint16_t attributeCount;//属性个数
  uint16_t idIndex;//id属性
  uint16_t classIndex;//class属性
  uint16_t styleIndex;//style的属性
}
ns name节点数据所在的namesoace和节点的名字
start指向 ResXMLTree_attribute
struct ResXMLTree_attribute
{
    struct ResStringpool_ref ns;
    struct ResStringPool_ref name;
    struct ResStringPool_ref rawValue;
    struct Res_value typedValue;
}
struct Res_value
{
   uint16_t size;
   uint8_t res0=0;
   uint8_t datatype;//枚举
   typedef uint32_t data_type;
   data_type_data
 }
stuctt ResXMLTree_endElementExt
{
     struct ResStringPool_ref ns;
     struct ResStringPool_ref name;
 }

resources.arsc

包涵res下所有资源的类型,名称,id等信息
arsc文件格式
在这里插入图片描述

ResTableHeader用ResTable_header表示
struct ResTable_header
{
    struct ResChunk_header header;//type RES_TABLE_TYPE
    uin32_t packageCount//ResTable_package的个数 1
 }
 ResStringPool和axml一样
 struct ResTable_package
 {
    struct ResChunk_header header;//type RES_TABLE_PACKAGE_TYPE
    uint32_t id;//0x7f
    uint16_t name[128];//package的名称
    uint32_t typeStrings;//typestrings的偏移 资源类型字符串
    uint32_t lastPublicType;//public字符串在字符串中的索引 资源类名称字符串
    uint32_t keyStrings;//keystrings对于ResTable_package的偏移量?
    uint32_t lastPublickey;//索引?
    uint32_t typeIdOffset;//类型id的偏移量
 };
 struct ResTable_typeSpec
 {
    struct ResChunk_header header;//tyoe是RES_TABLE_TYPE_SPEC_TYPE
    uint8_t id;//type id
    uint8_t res0;//0
    uint8_t res1;//0
    uint32_t entryCount;
 };
 struct ResTable_type
 {
    struct ResChunk_header header;// type RES_TABLE_TYPE_TYPE
    uint8_t id;//指定资源类型
    uint8_t res0;//0
    uint16_t res1;//0
    uint32_t entryCount;//资源条目数目
    uint32_t entriesStart;//资源条目偏移
    ResTable_config config;//分辨率 感觉没啥用 资源的父资源啥的。。之后再说把
 }

META-INF目录

储存了一些和apk签名相关的信息
CERT.RSA存放apk的开发者证书与签名信息
判断apk是否被修改
MANIFEST.MF是签名的清单文件
CERT.SF是签名信息文件

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页