DEX檔案解析 4 dex類的型別解析

2022-02-09 08:34:00 字數 3455 閱讀 8374

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類和它引用的類都...