dex檔案解析---1、dex檔案頭解析
dex檔案解析---2、dex檔案checksum(校驗和)解析
dex檔案解析--3、dex檔案字串解析
2、關於類的型別數量,沒什麼好說的,只需要注意它是以小端序儲存的,讀取的時候注意即可。對於類的型別偏移位址,找到偏移位址後,它是以四個位元組為一組,對應了在解析出來的字串陣列中的索引值,例如下圖中的第一組,它的資料是be 04 00 00
,我們讀取出來就是0x04be
(同樣採用的小端序儲存),對應的類的型別就是字串陣列[0x04be]
。
ps:我電腦上指令碼執行環境python3.6
執行效果:
**如下:
import binascii
import os
import sys
def getstringscount(f):
f.seek(0x38)
stringsid = f.read(4)
a = bytearray(stringsid)
a.reverse()
stringsid = bytes(a)
stringsid = str(binascii.b2a_hex(stringsid),encoding='utf-8')
count = int(stringsid,16)
return count
def getstringbytearr(f,addr):
bytearr = bytearray()
f.seek(addr + 1)
b = f.read(1)
b = str(binascii.b2a_hex(b),encoding='utf-8')
b = int(b,16)
index = 2
while b != 0:
f.seek(addr + index)
b = f.read(1)
b = str(binascii.b2a_hex(b),encoding='utf-8')
b = int(b,16)
index = index + 1
return bytearr
def bytestostring(bytearr):
try:
bs = bytes(bytearr)
stringitem = str(bs,encoding='utf-8')
return stringitem
except:
pass
def getaddress(addr):
address = bytearray(addr)
address.reverse()
address = bytes(address)
address = str(binascii.b2a_hex(address),encoding='utf-8')
address = int(address,16)
return address
def getstrings(f,stringamount):
stringslist =
f.seek(0x3c)
stringoff = f.read(4)
off = getaddress(stringoff)
f.seek(off)
for i in range(stringamount):
addr = f.read(4)
address = getaddress(addr)
bytearr = getstringbytearr(f,address)
stringitem = bytestostring(bytearr)
off = off + 4
f.seek(off)
return stringslist
def gettypeamount(f):
f.seek(0x40)
stringsid = f.read(4)
a = bytearray(stringsid)
a.reverse()
stringsid = bytes(a)
stringsid = str(binascii.b2a_hex(stringsid),encoding='utf-8')
count = int(stringsid,16)
return count
def gettypeitem(f,count,strlists):
f.seek(0x44)
type_ids_off = f.read(4)
a = bytearray(type_ids_off)
a.reverse()
type_ids_off = bytes(a)
type_ids_off = binascii.b2a_hex(type_ids_off)
type_ids_off = str(type_ids_off,encoding='utf-8')
type_off = int(type_ids_off,16)
f.seek(type_off)
print('[+] type count ==> ',end='')
print(count)
for i in range(count):
typeindex = f.read(4)
b = bytearray(typeindex)
b.reverse()
typeindex = bytes(b)
typeindex = binascii.b2a_hex(typeindex)
typeindex = int(str(typeindex,encoding='utf-8'),16)
print('[*] typeitem ==> ',end='')
print(strlists[typeindex])
type_off = type_off + 0x04
f.seek(type_off)
if __name__ == '__main__':
filename = str(os.path.join(sys.path[0])) + '\\1.dex'
f = open(filename,'rb',true)
stringscount = getstringscount(f)
strlist = getstrings(f,stringscount)
typecount = gettypeamount(f)
gettypeitem(f,typecount,strlist)
f.close()
Dex檔案的記憶體對映
前面我們了解過dex檔案的檔案格式,資料型別等知識,這裡我們來簡單分析一下,dex檔案在記憶體中的對映關係。dexfile的結構體原始碼如下 struct dexfile 在dexheader結構中,有乙個mapoff欄位,它指明了dexmaplist結構在dex檔案中的偏移,它的宣告如下 stru...
Dex檔案的完整性校驗
classes.dex 在 android 系統上基本負責完成所有的邏輯業務,因此很多針對android 應用程式的篡改都是針對 classes.dex 檔案的。在 apk 的自我保護上,也可以考慮對 classes.dex檔案進行完整性校驗,簡單的可以通過 crc 校驗完成,也可以檢查 hash ...
Dex格式解析及在Tinker中的應用
part 2 怎麼載入新的apk tinker 全量替換,無須插樁 傳統的熱修復需要插樁實現,插樁的原因和操作 原因 1.通過將補丁dex檔案插入到類載入器的dexelement列表最前面,完成熱修復 2.呼叫bug類的時候就會先搜尋到補丁dex裡的類,從而fix bug 3.bug類和它引用的類都...