標籤:als 產生 引用 div IV false and 代碼 開始
什麼是Smali:
我們用工具反編譯一些APP的時候,會看到一個smali檔案夾,裡面其實就是每個Java類所對應的smali檔案。Android虛擬機器Dalvik並不是執行java虛擬機器JVM編譯後產生的class檔案,而是執行再重新整合打包後產生的dex檔案,dex檔案反編譯之後就是smali代碼,可以說,smali語言是Dalvik的反組譯碼語言
JAVA和Smali資料類型對比:
JAVA Smali
V void Z boolean B byte S short C char I int J long F float D double 參考型別 L 對象 [ 數組
文法:
.field 定義變數.method 方法.parameter 方法參數.prologue 方法開始.line 12 此方法位於第12行invoke-super 調用父函數const/high16 v0, 0x7fo3 把0x7fo3賦值給v0invoke-direct 調用函數return-void 函數返回void.end method 函數結束new-instance 建立執行個體iput-object 對象賦值iget-object 調用對象invoke-static 調用靜態函數
smali跳躍陳述式“if-eq vA, vB, :cond_**” 如果vA等於vB則跳轉到:cond_**“if-ne vA, vB, :cond_**” 如果vA不等於vB則跳轉到:cond_**“if-lt 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-ltz 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_**
DEMO:
java代碼 private boolean show(){ boolean tempFlag = ((3-2)==1)? true : false; if (tempFlag) { return true; }else{ return false; } }轉換smali代碼.method private show()Z .locals 2 .prologue //方法開始 .line 22 const/4 v0, 0x1 // v0賦值為1 .line 24 .local v0, tempFlag:Z if-eqz v0, :cond_0 // 判斷v0是否等於0, 不符合條件向下走, 符合條件執行cond_0分支 .line 25 const/4 v1, 0x1 // 符合條件分支 .line 27 :goto_0 return v1 :cond_0 const/4 v1, 0x0 // cond_0分支 goto :goto_0.end method
參考:
http://blog.csdn.net/lostinai/article/details/48975661
http://blog.csdn.net/sjim_/article/details/50443860
Android逆向基礎知識Smali