安卓逆向——java层逆向分析·Dalvik字节码

1. java层逆向分析·Dalvik字节码


Dalvik中的寄存器都是32位大小,支持所有类型。对于小于或等于32位类型,使用一个寄存器就可以了,对64位(long和double)类型,需要使用两个相邻的寄存器来存储。

2. 寄存器的命名法


寄存器就相当于一个个容器,在里面储存各类型值,为了很好地知道存储位置,就需要对寄存器进行命名,就像我们每个人都有一个属于自己的名字一样。

寄存器的命名法有两种:V命名法和P命名法:
        v命名法:局部变量寄存器V0-Vn,参数寄存器是Vn-Vn+m。
        p命名法:参数寄存器P0-Pn,变量寄存器V0-Vn。

通过两个例子来解释这两种命名法:
如例一:首先看到 getHelloWorld方法有两个参数,第一个参数String类型,第二个参数是int类型。下面可以看到 registers 展示的是该方法使用到的寄存器,如例一所示,在这里看到它采用的是v命名法,由于该方法有两个参数,所以v0-v2表示的是局部变量寄存器,v3-v4表示的参数寄存器。在例一中第一个方框里可以看到v2是局部寄存器,v3是参数寄存器。在图中第二个方框里可以看到v0是局部寄存器,v4是参数寄存器。

例二:getHelloWorld方法中有两个参数。通过阅读smali代码可以看到有p开头的寄存器,所以这里采用的是p命名法。图中第一个方框里可以看到v1是局部寄存器,p0是参数寄存器。在图中第二个方框里可以看到v0是局部寄存器,p1是参数寄存器。


3. dex文件反汇编工具


研究:smali文件是怎么得到的呢?简单来讲,就是将.java文件编译成.class再编译.dex最后反编译得到smali文件 。

在上面的过程中会使用到三种工具,分别是dx.jar工具、baksmali.jar工具、smali.jar工具,我们详细介绍一下这三种工具的作用:

3.1 dx.jar工具

使用dx.jar工具将.class文件打包成.dex文件,命令如下:

命令中的参数“--dex”:表示将指定的.class文件打包成.dex文件,这里指的是com/yijin/demo/Decrypt.class文件。

命令中的参数“--output=”:指定dex文件的输出目录。

dx--dex--output=Decrypt.dexcom/yijinda/demo/Decrypt.class

2.baksmali.jar工具

使用baksmali.jar工具将.dex文件反编译成.smali文件,命令如下:

java -jar baksmali.jar -o smali_out/ classes.dex

命令中的参数“-jar”:表示的是运行指定的jar包。

命令中的参数“-o”:指定反编译后的.smali文件存放目录。

3.smali.jar工具

使用smali.jar工具将.smali文件打包成.dex文件,命令如下:

java -jar smali.jar smali_out/ -o classes.dex

命令中的参数“-jar”:表示的是运行指定的jar包。

命令中的参数“smali_out/”:表示smali文件所在的目录。

命令中的参数“-o”:指定dex文件的输出目录。

4. Dalvik字节码类型

接下来学习Dalvik字节码的类型,在学习Java的时候,同学们已经掌握了Java的基本数据类型,它们之间是存在对应关系的:Java中的基本数据类型与Dalvik字节码类型的对应关系如下表所示:

注意:“boolean”用大写的“Z”表示,“long”用大“J”表示,“java类类型”用大写“L”表示,“数组类型”用“[ ” 表示。其余的直接用Java基本类型首字母大写表示Dalvik字节码类型。

5. Dalvik字段

Dalvik表示字段的格式:

字段格式:类型(包名+类名)+字段名称+字段类型
例如:

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

“Lpackage/name/ObjectName;”是当前这个字段所在的类,

其中,“L”是“java类类型”,“package/name/”是包名,“ObjectName”是类名。

“FieldName”是字段名称,“Ljava/lang/String;”是字段类型。字段名称和字段类型之间要用“:”隔开。

例1: Landroid/content/pm/ActivityInfo;->theme:I

例2: Lorg/cocos2dx/lua/AppActivity;->handler:Landroid/os/Handler;

6.  Dalvik方法

6.1 .Dalvik方法的表现形式:

 类型(包名+类名)+方法名(+参数类型)+返回值类型
例如:

Lpackage/name/ObjectName;->MethodName

“Lpackage/name/ObjectName;”是当前这个方法所在的类,其中,

“L”是“java类型”,“package/name/”是包名,“ObjectName”是类名。“MethodName”是方法名

总结:

1、dalvik寄存器 :32位 

2、寄存器命名法:v命名法和p命名法

3、dex文件反汇编工具: 

            ★dx.jar → .class → .dex

            ★baksmali.jar → .dex → .smali

            ★smali.jar → .smali → .dex

4、dalvik字节码类型:Java基本类型首字母大写 

四个特殊:   Z → boolean     J → long          L → java类类型     [ → 数组类型

  

5、字段格式:类型(包名+类名)+字段名称+字段类型  

6、方法的表现形式:

类型(包名+类名)+方法名(+参数类型)+返回值类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.含笑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值