本文通过python解析编译过的AndroidManifext.xml文件格式,还原其可阅读的格式。
# -*- coding:utf-8 -*-
__author__ = "教科书般的男人"
import os
xmldr = { }
stringContentList = []
xmlsb =[ ]
uri2prefix = {}
prefix2uri = {}
def filterStringNull(data):
if data == None or len(data)==0:
return data
temp = []
for i in data:
if i != "00":
temp.append(i)
str = [chr(int(i, 16)) for i in temp]
return "".join(str)
def parse_xml(filename):
f = open(filename, "rb")
print
# 解析xml文件的头部,获取Magic Nubmber和File Size
xmlident = f.read()
xml_content = [i for i in xmlident]
xml_content_16 = [hex(ord(i))[2:].zfill(2) for i in xml_content]
header = [hex(ord(i))[2:].zfill(2) for i in xmlident[0:8]]
magic_number = header[:4][::-1]
xml_size = header[4:8][::-1]
xmldr['magic_number'] = magic_number
xmldr['xml_size'] = xml_size
print "Parse XML Header-----------"
print "magic number:" + str(magic_number[0]) + " " + str(magic_number[1]) + " " + str(magic_number[2]) + " " + str(magic_number[3])
print "xml size:" + str(xml_size[0]) + " " + str(xml_size[1]) + " " + str(xml_size[2]) + " " + str(xml_size[3])
xmlsb.append("<?xml version=\'1.0\'encoding=\'utf-8\'?> ")
xmlsb.append("\n")
# 解析StringChunk信息
print "--------Parse String Chunk-----------"
ChunkType = xml_content_16[8:12][::-1]
print "string chunktag:" + str(ChunkType[0]) + " " + str(ChunkType[1]) + " " + str(ChunkType[2]) + " " + str(ChunkType[3])
Chunk_size_str = xml_content_16[12:16][::-1]
Chunk_size = "".join(Chunk_size_str)
print "Chunk_size:" + str(int(Chunk_size, 16))
String_Count_str = xml_content_16[16:20][::-1]
String_Count = "".join(String_Count_str)
print "Count:" + str(int(String_Count, 16))
Style_Offset_str = xml_content_16[28:32][::-1]
Style_Offset = "".join(Style_Offset_str)
print "Start:" + str(int(Style_Offset, 16) + 8)
chunkStringContentByte = xml_content[212:2056]
firstStringSizeByte_str = xml_content_16[212:214][::-1]
# 一个字符对应两个字节
firstStringSize = int("".join(firstStringSizeByte_str), 16) * 2
print "size:" + str(firstStringSize)
firstStringContent = filterStringNull(xml_content_16[214:238])
print "first string:" + firstStringContent
stringContentList.a