標籤:描述符 [] padding tab 返回 對象引用 from roi 資料操作
參考此微博,更多詳細內容可以到這裡查看
http://blog.csdn.net/dd864140130/article/details/52076515
Dalvik位元組碼
1、寄存器位32位,64位元據(double)用兩個相鄰的32寄存器表示。
2、兩種類型:基本類型和參考型別(對象和數組)
全限定名是什麼?
以String為例,其完整名稱是Java.lang.String,那麼其全限定名就是java/lang/String;,即java.lang.String的”.”用”/”代替,並在末尾添加分號”;”做結束符.
Dalvik位元組碼類型描述元
V void 只能用於傳回值類型
Z boolean 邏輯值,返回真(true)假(false)
B byte 位元組型
S short 短整型
C char 字元型
I int 整數型
J long(64位)長整型
F float 浮點型
D double 雙精確度浮點
L 物件類型,java類
java->package.name.ObjectName;
Davik->Lpackage/name/ObjectName
[ 數群組類型
java->int[] int[][] 三維數組
Davik->[I; [[I; [[[I;
欄位的描述
Davik中對欄位的描述分為兩種,對基本類型欄位的描述和對參考型別的描述,但兩者的描述格式一樣:
物件類型描述符->欄位名:類型描述元;
比如com.sbbic.Test類中存在String類型的name欄位及int類型的age欄位,那麼其描述為:
Lcom/sbbic/Test;->name:Ljava/lang/String;
Lcom/sbbic/test;->age:I
Dalvik指令集
資料定義指令 const
const-賦值方法 寄存器名 附加內容
|
指令 |
描述 |
|
const/4 vA,#+B |
將數值符號擴充為32後賦值給寄存器vA |
|
const-wide/16 vAA,#+BBBB |
將數值符號擴充為64位後賦值個寄存器對vAA |
|
const-string vAA,[email protected] |
通過字串索引高走字串賦值給寄存器vAA |
|
const-class vAA,[email protected] |
通過類型索引擷取一個類的引用賦值給寄存器vAA |
資料操作指令 move
|
指令 |
描述 |
|
move vA,vB |
將vB寄存器的值賦值給vA寄存器,vA和vB寄存器都是4位 |
|
move/from16 vAA,VBBBB |
將vBBBB寄存器(16位)的值賦值給vAA寄存器(7位),from16表示源寄存器vBBBB是16位的 |
|
move/16 vAAAA,vBBBB |
將寄存器vBBBB的值賦值給vAAAA寄存器,16表示源寄存器vBBBB和目標寄存器vAAAA都是16位 |
|
move-object vA,vB |
將vB寄存器中的對象引用賦值給vA寄存器,vA寄存器和vB寄存器都是4位 |
|
move-result vAA |
將上一個invoke指令(方法調用)操作的單字(32位)非對象結果賦值給vAA寄存器 |
|
move-result-wide vAA |
將上一個invoke指令操作的雙字(64位)非對象結果賦值給vAA寄存器 |
|
mvoe-result-object vAA |
將上一個invoke指令操作的對象結果賦值給vAA寄存器 |
|
move-exception vAA |
儲存上一個運行時發生的異常到vAA寄存器 |
3.跳轉指令
|
if-eq |
等於則跳轉 |
== |
|
if-ne |
不等於則跳轉 |
!= |
|
if-lt |
小於則跳轉 |
< |
|
if-ge |
大於或等於則跳轉 |
>= |
|
if-gt |
大於則跳轉 |
> |
|
if-le |
小於或等於則跳轉 |
<= |
|
goto |
無條件跳轉 |
|
|
switch |
分支跳轉 |
|
返回0 實現跳轉
Android逆向基礎----Dalvik位元組碼