日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dex2jar源码解析之总体介绍(一)

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dex2jar源码解析之总体介绍(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dex2jar這個源碼包,聽名字是用來將dex文件轉換為java文件,在githup上面的地址是https://github.com/pxb1988/dex2jar

本地使用源碼:http://download.csdn.net/detail/new_abc/9718937

但我們分析這個源碼可以看到,里面的功能不只是將dex轉換為jar包,也可以轉換dex為smail文件等,這個后面在分析

dex2jar就是將dex文件轉換為class文件,然后class文件打成jar包

dex轉換為class文件過程中會先轉換為一種IR的中間指令格式


大概的轉換流程是上面這樣子的


中間主要 調用的函數接口如下


上面的是相應的Visitor訪問者,具體的處理都是調用里面的visitor相關的函數進行處理

然后看看主要的類圖


DexFileReader開始從dex文件中讀取內容,并調用里面的相應的函數處理讀取到的數據,如acceptClass會解析一個類等


這里的話主要是一個Visitor相關的類關系圖


Dalvik指令格式
一段Dalvik匯編代碼由一系列Dalvik指令組成,指令語法由指令的位描述與指令格式標識來決定。位描述約定如下
Dalvik指令對語法做了一些說明,它約定如下:
● 每條指令從操作碼開始,后面緊跟參數,參數個數不定,每個參數之間采用逗號分開。
● 每條指令的參數從指令第一部分開始,op位于低8位,高8位可以是一個8位的參數,也可以是兩個4位的參數,還可以為空,如果指令超過16位,則后面部分一次作為參數
● 如果參數采用 “vX” 的方式表示,表示它是一個寄存器,如v0、v1等。這里采用v而不用r是為了避免與基于該虛擬機架構本身的寄存器名字產生沖突,如ARM架構寄存器命名采用r開頭。
● 如果參數采用 “#+X” 的方式表示,表明它是一個常量數字。
● 如果參數采用 “+X” 的方式表示,表明它是一個相對指令的地址偏移。
● 如果參數采用 “kind@X” 的方式表示,表明它是一個常量池的索引值。其中kind表示常量池類型,它可以是 “string” 字符串常量池索引)、“type”(類型常量池索引)、“field”(字段常量池索引)或者 “meth”(方法常量池索引)?!?每16位的字采用空格分隔開來。
● 每個字母表示4位,每個字母按順序從高字節開始,排列到低字節。每4位之間可能使用豎線 “|” 來表示不同的內容。
● 順序采用 A ~ Z 的單個大寫字幕作為一個4位的操作碼,op表示一個8位的操作碼。
● “Φ” 來表示這字段所有位為0值。
以指令格式 “A|G|op BBBB F|E|D|C” 為例
指令中間有兩個空格,每個分開的部分大小為16位,所以這條指令由三個16位的字組成。
第一個16位是 “A|G|op”,高8位由A與G組成,低字節由操作碼op組成。
第二個16位由 BBBB 組成,它表示一個16位的偏移值。
第三個16位分別由F、E、D、C 共4個4字節組成,在這里他們表示寄存器參數。


單獨使用位表示還無法確定一條指令,必須通過指令格式標識來指定格式的格式編碼。它的約定如下:
● 指令格式標識大多由三個字符組成,前兩個是數字,最后一個是字母。
● 第一個數字是表示指令有多少個16位的字組成。
● 第二個數字是表示指令最多使用寄存器的個數。特殊標記 “r” 標識使用一定范圍內的寄存器。
● 第三個字母為類型碼,表示指令用到的額外數據的類型。取值見如下表。
助記符 位大小 說 明
b 8 8位有符號立即數
c 16,32 常量池索引
f 16 接口常量(僅對靜態鏈接格式有效)
h 16 有符號立即數(32位或64位數的高值位,低值位為0)
i 32 立即數,有符號整數或32位浮點數
l 64 立即數,有符號整數或64位雙精度浮點數
m 16 方法常量(僅對靜態鏈接格式有效)
n 4 4位的立即數
s 16 短整型立即數
t 8, 16, 32 跳轉,分支
x 0 無額外數據
以指令格式標識22x 為例:
第一個數字2表示有2個16位字組成,第二個數字2表示指令使用到2個寄存器,第三個字母x表示沒有使用到額外的數據。


這里是dex轉ir用到的相關的一個類


這是轉換的指令,解析dex文件中的相應指令 轉換為這里的一個中間指令


這里是中間指令 轉為jvm中的指令,里面都有accept方法


這里用來把解析的dex轉換,用到Asm


這里是dex文件解析之后轉換為中間指令IR文件用到的visitor,前面的visitor是訪問dex文件的。

大概的類就上面這么多,畫這個圖主要是了解各個類之間的關系,要不然后面會有點糊涂。

作者:new_abc 來源:CSDN 原文:https://blog.csdn.net/new_abc/article/details/53736240

總結

以上是生活随笔為你收集整理的dex2jar源码解析之总体介绍(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。