安卓逆向學習---初始APK、Dalvik字節碼以及Smali
參考鏈接:https://www.52pojie.cn/thread-395689-1-1.html
res目錄下資源文件在編譯時會自動生成索引文件(R.java ),
asset目錄下的資源文件無需生成索引。
一般來說:使用C++遊戲引擎的資源文件放在asset下
java開發中除音頻和視頻資源(放在raw或asset下),均放在res下。
- Dalvik字節碼是什麽?
Dalvik是Google專門為Android設計的一個虛擬機。
Dalvik VM是基於寄存器的,而JVM是基於棧的,Dalvik有專屬的文件執行格式dex(Dalvik executable),jvm使用的是java字節碼。
Dalvik VM你jvm速度更快,占用空間更少。
- 什麽是Smali?
Smali,baksmali分貝時指安卓系統裏的java虛擬機(Dalvik)所使用的一種。dex格式文件的匯編器,反匯編器。
語法為一行寬松的Jasmin/dedeser語法,且實現了.dex格式的所用功能(註解,調試信息,線路信息等)。
對apk文件進行反匯編後,便會生成此類文件。其中在Dalvik字節碼中,寄存器都是32位的,能夠支持任何類型,64位類型(Long/Double)用2個寄存器表示。
- Dalvik字節碼有兩種類型:原始類型,引用類型。
原始類型:
B --- byte
C --- char
D --- double
F --- float
I --- int
J --- long
S --- short
V --- void
Z --- boolean
[XXX --- array //數組表示方式:基本類型前加上“[”,eg:int型數組表示為:[I
LXXX/yyy --- object //對象表示以L開頭,格式為LpackageName/objectName;(分號必須有)
//eg:String在Smali中為:LJava/lang.String; ,其中java/lang對應java.lang包,String就是定義在該包中的一個對象。
//內部類表示為:LpackName/objectName$subObjectName;。即在內部類前面加“$”符號。
方法定義:Func-Name(para-Type1para-Type2para-Type3...)Return-Type //參數之間沒有空格
eg:hello()v //void hello()
hello(III)Z //boolean hello(int,int,int)
hello(Z[I[ILjava/lang/String;J)Ljava/lang/String //String hello(boolean,int[],int[],String,long)
- Smali基本語法
.field private isFlag:z 定義變量
.method 方法
.parameter 方法參數
.prologue 方法開始
.line 123 此方法位於第123行
invoke-super 調用父函數
const/high16 vO, 0x7fo3 把0x7fo3賦值給v0
invoke-direct 調用函數
return-void 函數返回void
.end method 函數結束
new-instance 創建實例
iput-object 對象賦值
iget-object 調用對象
invoke-static 調用靜態函數
- 條件跳轉分支:
"if-eq vA, vB, :con_**" 如果vA等於vB則跳轉到:cond_ **
"if-ne vA, vB, :cond_**" 如果vA不等於vB則跳轉到:cond_ **
"if-It vA, vB, :cond_**" 如果vA小於vB則跳轉 到:cond_ **
"if-ge vA, vB, :cond_**" 如果vA大於等於vB則跳轉到:cond_ **
"if-gt vA, vB, :cond_**" 如果vA大於vB則跳轉到:cond_ **
"if-le vA, vB, :cond_ *" 如果vA小於等於vB則跳轉到:cond_ **
"if-eqz vA, :cond_**" 如果vA等於0則跳轉到:cond_ **
"if-nez vA, :cond_**" 如果vA不等於0則跳轉到:cond_ **
"if-Itz vA, :cond_**" 如果vA小於0則跳轉到:cond_**
"if-gez vA, :cond_**" 如果vA大於等 於0則跳轉到:cond_ **
"if-gtz vA, :cond_**" 如果vA大於0則跳轉到:cond_ **
"if-lez vA, :cond_**" 如果vA小於 等於0則跳轉到:cond **
安卓逆向學習---初始APK、Dalvik字節碼以及Smali