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、方法的表现形式:
类型(包名+类名)+方法名(+参数类型)+返回值类型