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是签名信息文件