1.反编译
可以查看批量修改安卓apk包名,这里不做介绍,这篇主要介绍如何阅读反编译后的java代码, 反编译出的java代码以smali的形式存在,这是一种类似于汇编的语言。android目前使用的是dalvik虚拟机,所以下面的叙述都是基于dalvik虚拟机字节码。
2. 正文
2.1 类型
dalvik字节码只有两种基本类型,即原始数据类型和引用类型。数组(Array)和对象(object)是引用类型,其余都是原始数据类型
2.1.1 原始数据类型可以用一个字符表示它们的类型,下面是它们的对应表
字母 | 类型 |
---|---|
V | void - can only be used for return types |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long (64 bits) |
F | float |
D | double (64 bits) |
2.1.2 对象类型
格式
Lpackage/name/ObjectName;
字段 | 意义 |
---|---|
L | object |
package/name/ | 表示包名 |
ObjectName | 类型名 |
; | 结束 |
举例说明(在java中的对应关系)
Ljava/lang/String; ---> java.lang.String
2.1.3 数组
格式
[I
字段 | 意义 |
---|---|
[I | int类型的一维数组 |
[[I | int类型的二维数组 |
以此类推,几个[表示几维数组
举例说明(在java中的对应关系)
[I ---> int []
2.2 方法
格式
.method [public] [static] methodName(param_list)return_type
.end method
注意:[]表是可以选,比如static可以没有,public可以是private
举例:
.method public CheckNetWorking()I
.end method
解析:以下是java代码
public int CheckNetWorking()
{
}
2.3 Fields表示类的成员变量
举例:
.field private static appid:Ljava/lang/String;
解析:以下是java代码
private static String appid;
2.4 寄存器(Registers)
寄存器包含本地变量和参数,本地变量从v0v4一共5个,参数从p0p2三个参数
Local | Param | |
---|---|---|
v0 | the first local register | |
v1 | the second local register | |
v2 | p0 | the first parameter register |
v3 | p1 | the second parameter register |
v4 | p2 | the third parameter register |
3.参考资料
https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
https://github.com/JesusFreke/smali/wiki/Registers
https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields