当前位置: 首页 > 工具软件 > Dalvik > 使用案例 >

Dalvik

浦泳
2023-12-01

Dalvik字节码:

1.了解dalvik寄存器

dalvik中的寄存器都是32位

2.寄存器之v命名法与p命名法

参数寄存器 P0-Pn

局部变量寄存器 V0-Vn

3.dex文件反汇编工具

         smali.jar\ddx.jar

4.类型

smali==>Java

V void

Z boolean 

B byte

      C    char

S short

I int

J long

F float

D double

L java类

[ 数组

5.字段

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;

6.方法

Lpackage/name/ObjectName;->MethodName (III) Z

Dalvik指令:

        基础字节码-名称后缀/字节码后缀 目的寄存器  源寄存器

        名称后缀是wide,表示数据宽度为64位

        字节码后缀是from16,表示源寄存器为16位

空操作指令

        nop

数据操作指令

        move(-wide/-object/-result/-result-object/-result-wide/- exception)

        move(-wide/-object)/from16

        move(-object)/16

返回指令(重点)

        return-void(表示方法的放回值为空)

        return(表示方法的反回值为32位非对象类型的值)

        return-wide(表示方法的反回值为64位非对象类型的值)

        return-object(表示方法的反回值为对象类型的值)

数据定义指令(重点)

        const(-wide/-string/-class)

        const/4

        const(-wide)/16

        const(-wide)/32

        const(-wide)/high16

实例操作指令

        check-cast(类型转换)

        instance-of(检查)  

        new-instance(新建) 

数组操作指令

        array-length(获取数组长度)

        new-array(新建数组)

        filled-new-array(定义数组并初始化)

        filled-new-array/range(定义数组并初始化/指定取值范围)

        filled-array-data(数组元素取值与赋值)

异常指令(throw)

跳转指令(重点)

        goto 紧跟一个标签直接跳转到标签所在位置

        packed-switch(有规律)、sparse-switch(无规律)

        if-eq(等于)/if-ne(不等于)

        if-lt(小于)/if-le(小于等于)

        if-gt(大于)/if-ge(大于等于)

比较指令(cmp)

        大于(1)/等于(0)/小于(-1)=>cmpg、cmp

        大于(-1)/等于(0)/小于(1)=>cmpl

字段操作指令

        普通字段=>iget(读)/iput(写)

        静态字段=>sget(读)/sput(写)

方法调用指令(重点)

        invoke-virtual(调用实例的虚方法) Java当中的普通方法

        invoke-super(调用实例的父类/基类方法) 

        invoke-direct(调用实例的直接方法) 调用java当中的构造方法

        invoke-static(调用实例的静态方法)

        invoke-interface(调用实例的接口方法)

数据转换指令

        neg-数据类型=>求补

        not-数据类型=>求反

数据类型1-to-数据类型2=>将数据类型1转换为数据类型2

数据运算指令

        add/sub/mul/div/rem  加/减/乘/除/模

        and/or/xor  与/或/非

        sh1/shr/ushr 有符号左移/有符号右移/无符号右移

smali文件:

  无论是普通类、抽象类、接口类或者内部类,在反编译出的代码中,它 们都以单独的smali 文件来存放。每个 smali 文件都由若干条语句组成, 所有的语句都遵循着一套语法规范。

1.描述类的信息

.class < 访问权限> [ 修饰关键字] < 类名>

.super < 父类名>

.source <源文件名>

 2. 静态字段

# static fields

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

 3.实例字段

# instance fields

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

 4.直接方法

# direct methods

.method <访问权限> [ 修饰关键字] < 方法原型>

<.locals> “.locals ”指定了使用的局部变量的个数
[.param] “.param”指定了方法的参数

[.prologue] “.prologue ”指定了代码的开始处

[.line]          “.line ”指定了该处指令在源代码中的行号

<代码体>

 .end method

 5. 虚方法的声明与直接方法相同,只是起始处的注释为“virtual  methods”。

 6.接口

 # interfaces

   .implements < 接口名>“.implements ”是接口关键字,后面的接口

   名是 DexClassDef 结构中 interfacesOff 字段指定的内容。

 7.注解

  # annotations

    .annotation [ 注解属性] < 注解类名>

[ 注解字段 = 值]

  .end annotation

   注解的作用范围可以是类、方法或字段。如果注解的作用范围是类,   “.annotation ”指令会直接定义在 smali 文件中,如果是方法或字段,“.annotation ”指令则会包含在方法或字段定义中。

 类似资料: