Android逆向反编译之smali基础

在上一篇中,介绍了一些反编译工具,当我们用工具反编译一些APP的时候,会看到一个smali文件夹,里面其实就是每个java类所对应的smali文件。Android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言。

  • java中的数据类型在smali中这样表示

        原始类型
        V                      void
        Z                      boolean
        B                      byte
        S                      short
        C                      char
        I                      int
        J                      long
        F                      float
        D                      double
    
        引用类型
        L                      对象
        [                      数组
    
        Android是基于寄存器存储的,一个寄存器占32位,java中long和double占8个字节,每一字节占8位,所以要用2个寄存器存储。
    
  • smali的语法

    .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_**

  • 下面看一个例子

    • 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

你可能感兴趣的:(Android逆向反编译)