從一個函數(shù)抽取殼了解到瓷马,對一個dex文件的函數(shù)抽取實現(xiàn)原理:在dex文件結(jié)構(gòu)中函數(shù)之間的的數(shù)據(jù)是通過不同的字段,類型等id連接到一起的膝宁,如果我們將這個索引id置為空鸦难,那么他的dex顯示時根吁,會只有這個方法名,而里面的函數(shù)為空合蔽,需要注意的是修改了dex文件之后击敌,需要重新計算簽名和效驗值。
dex文件格式總體分為
????頭文件 拴事,索引區(qū)沃斤,data區(qū)
Header結(jié)構(gòu)
struct header_item
{
? ? ? ubyte[8] magic;//文件魔數(shù)
? ? ? unit checksum;//校驗
? ? ? ubyte[20] siganature;//簽名
? ? ? uint file_size;//文件大小
? ? ? uint header_size;//頭文件大小
? ? ? unit endian_tag;//一般為固定值0x12345678
? ? ? uint link_size;//鏈接數(shù)據(jù)大小
? ? ? uint link_off;//鏈接數(shù)據(jù)偏移
? ? ? uint map_off;//data區(qū)的數(shù)據(jù)集合
? ? ? uint string_ids_size;//字符串數(shù)量
? ? ? uint string_ids_off;//字符串偏移
? ? ? uint type_ids_size;//所有類型數(shù)量
? ? ? uint type_ids_off;//類型偏移
? ? ? uint proto_ids_size;//方法參數(shù)信息數(shù)量
? ? ? uint proto_ids_off;//偏移
? ? ? uint method_ids_size;//方法信息數(shù)量
? ? ? uint method_ids_off;//偏移
? ? ? uint class_defs_size;//類信息個數(shù)
? ? ? uint class_defs_off;//偏移
? ? ? uint data_size;//數(shù)據(jù)大小
? ? ? uint data_off;//偏移
}
magic?
魔數(shù) dex文件魔數(shù)為0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00
checksum
文件校驗碼 ,使用alder32 算法校驗文件除去 maigc 刃宵,checksum 外余下的所有文件區(qū)域 衡瓶,用于檢
查文件錯誤 。
signature?
?使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件區(qū)域 牲证,
用于唯一識別本文件 哮针。
具體的數(shù)據(jù)結(jié)構(gòu)可以參考四哥的Android逆向之旅—解析編譯之后的Dex文件格式 | 尼古拉斯.趙四
總結(jié)
? ? dex的文件格式,其實是將代碼結(jié)構(gòu)零件化从隆,string_id 主要是所以的字符串信息诚撵,type_id 是類型信息, 比如class類键闺,返回類型,基本類型等等澈驼,比如 Landroid/app/Activity;?Landroid/os/Bundle;最終是數(shù)據(jù)通過類型接的索引id相互串聯(lián)起來辛燥,構(gòu)造出完整的代碼視圖