业无高卑志当坚,男儿有求安得闲?这篇文章主要讲述Android逆向基础----Dalvik字节码相关的知识,希望能为你提供帮助。
参考此微博,更多详细内容可以到这里查看
http://blog.csdn.net/dd864140130/article/details/52076515
Dalvik字节码
1、寄存器位32位,64位数据(double)用两个相邻的32寄存器表示。
2、两种类型:基本类型和引用类型(对象和数组)
全限定名是什么?
以String为例,其完整名称是Java.lang.String,那么其全限定名就是java/lang/String;
,即java.lang.String的”.”用”/”代替,并在末尾添加分号”;
”做结束符.
Dalvik字节码类型描述符
V
void
只能用于返回值类型
Z
boolean
逻辑值,返回真(true)假(false)
B
byte
字节型
S
short
短整型
C
char
字符型
I
int
整数型
J
long(64位)长整型
F
float
浮点型
D
double
双精度浮点
L
对象类型,java类
java->
package.name.ObjectName;
Davik->
Lpackage/name/ObjectName
[
数组类型
java->
int[]
int[][]
三维数组
Davik->
[I;
[[I;
[[[I;
字段的描述
Davik中对字段的描述分为两种,对基本类型字段的描述和对引用类型的描述,但两者的描述格式一样:
对象类型描述符->
字段名:类型描述符;
比如com.sbbic.Test类中存在String类型的name字段及int类型的age字段,那么其描述为:
Lcom/sbbic/Test;
->
name:Ljava/lang/String;
Lcom/sbbic/test;
->
age:I
Dalvik指令集
数据定义指令
const
const-赋值方法 寄存器名 附加内容
指令 |
描述 |
const/4 vA,#+B |
将数值符号扩展为32后赋值给寄存器vA |
const-wide/16 vAA,#+BBBB |
将数值符号扩展为64位后赋值个寄存器对vAA |
const-string vAA,[email
protected] |
通过字符串索引高走字符串赋值给寄存器vAA |
const-class vAA,[email
protected] |
通过类型索引获取一个类的引用赋值给寄存器vAA |
指令 |
描述 |
move vA,vB |
将vB寄存器的值赋值给vA寄存器,vA和vB寄存器都是4位 |
move/from16 vAA,VBBBB |
将vBBBB寄存器(16位)的值赋值给vAA寄存器(7位),from16表示源寄存器vBBBB是16位的 |
move/16 vAAAA,vBBBB |
将寄存器vBBBB的值赋值给vAAAA寄存器,16表示源寄存器vBBBB和目标寄存器vAAAA都是16位 |
move-object vA,vB |
将vB寄存器中的对象引用赋值给vA寄存器,vA寄存器和vB寄存器都是4位 |
move-result vAA |
将上一个invoke指令(方法调用)操作的单字(32位)非对象结果赋值给vAA寄存器 |
move-result-wide vAA |
将上一个invoke指令操作的双字(64位)非对象结果赋值给vAA寄存器 |
mvoe-result-object vAA |
将上一个invoke指令操作的对象结果赋值给vAA寄存器 |
move-exception vAA |
保存上一个运行时发生的异常到vAA寄存器 |
3.跳转指令
if-eq |
等于则跳转 |
== |
if-ne |
不等于则跳转 |
!= |
if-lt |
小于则跳转 |
<
|
if-ge |
大于或等于则跳转 |
>
= |
if-gt |
大于则跳转 |
>
|
if-le |
小于或等于则跳转 |
<
= |
goto |
无条件跳转 |
|
switch |
分支跳转 |
|
返回0 实现跳转
推荐阅读
- Android逆向基础----APK文件结构
- [android] 百度地图开发 .申请AK显示地图及解决显示空白网格问题
- Android BlueDroid(BlueDroid蓝牙开启过程init)
- Spring+Mybatis的applicationContext.xml配置文件
- 什么是量化()
- 每英寸的像素、点和线
- 数字图像直方图介绍
- JavaScript设计模式综合用法示例和指南
- 啥是网线交叉线接法?有啥好处?