Android反编译后代码阅读

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

posted @ 2017-03-22 17:55  zyh_think  阅读(1371)  评论(0编辑  收藏  举报