美文网首页
smali 介绍

smali 介绍

作者: android小奉先 | 来源:发表于2022-06-10 22:13 被阅读0次

    本篇介绍

    smali 可以看成是虚拟机的汇编语言,在逆向时可以看懂smali可以提升不少效率.

    Smali 语法

    数据类型

    Java 和 Smali 的类型对应关系和jni类似,如下所示:
    基本数据类型

    Smali数据类型 Java数据类型
    V void
    Z boolean
    B byte
    S short
    C char
    I int
    J long
    F float
    D double

    对象类型

    Smali数据类型 Java数据类型
    Lpackage/name/ObjectName; ObjectName
    [I int[]

    Smali 格式

    打开smali 文件,头三行格式如下:

    .class <访问权限> [关键修饰字] <类名>;
    .super <父类名>;
    .source <源文件名>
    

    类的成员变量形式是:

    .filed <访问权限> [关键修饰字]  <字段名>:<字段类型>
    

    函数的声明格式如下:

    .method <访问权限> [关键修饰字]  <方法原型>
    <.locals> <.registers> // 函数中非参数的变量的多少
    [.param] // 方法参数
    [.line]
    <代码>
    .end method
    

    Smali 指令

    Smali 指令有常量操作指令,方法调用指令,移位指令,分支判断指令。
    常量操作指令主要是const相关指令,格式如下:

    const-<类型> 寄存器, 操作数
    
    const-string v1, "test" // 定义字符串“test”并存到 v1 寄存器中
    
    const/16 v1, 0x1e // 定义了16位的数据常量"0x1e",并存到v1寄存器中
    

    方法调用指令 是以invoke开头的相关指令,格式如下:

    invoke-kind {vA,vB,vC},mehtod@DDDD
    //  mehtod@DDDD 表 示 函 数 的 引用;vA,vB,vC则表示函数的参数
    // 其定义顺序与调用函数的参数一 一对应;kind则代表被调用的类型
    // 主要有static、virtual、 super(被调用的函数是静态函数、正常的函数和父类函数等)
    
    invoke-super {p0, p1}, Landroidx/Appcompat/App/AppCompatActivity;->onCreate (Landroid/os/Bundle;)V
    // 调用AppCompatActivity的onCreate方法,p0是this,p1是bundle类型参数
    

    移位指令是move相关指令,格式如下:

    move v1,p1 // 将 p1 赋值给 v1
    

    分支判断指令是if 相关指令, 格式如下:

    if-[test] v1,v2, [condition] // 如果v1, v2 满足test,则跳转到condition 执行
    
    if-ge p1, v0, :cond_0 // 如果 p1 >= v0, 则跳转到 cond_0
    

    目前介绍了下Smali的基础,看起来也是比较好懂的

    相关文章

      网友评论

          本文标题:smali 介绍

          本文链接:https://www.haomeiwen.com/subject/kkywmrtx.html