Android逆向基礎知識Smali


什么是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賦值給v0

invoke-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM