Dalvik指令集(部分)————Android逆向基础(初学者学习笔记)
一、数据类型
其中对象类型由L<包名>/<类名>;(完全限定名称)表示,要注意末尾有个分号,比如String表示为Ljava/lang/String;。
数组类型是[加上元素类型,比如int[]表示为[I。左方括号的个数也就是数组的维数,比如int[][]表示为*[[I*。
二、类的定义
sma里文件里存放的一个类,文件开头保存着各种信息。
.class <权限修饰符> <非权限修饰符> <完全限定名称>
.super <超类的完全限定名称>
.source <源文件名>
例如一个主活动的文件MainActivity:
.class public Lnet/flygon/myapplication/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
该类是public,完整名称是net.flygon.myapplication.MainActivity,继承了android.app.Activity,在源码中是MainActivity.java。如果类是abstract或者final的,会在public/private/protected后面表示。 类可以实现接口,如果类实现了接口,那么这三条语句下面会出现.implements <接口的完全限定名称>。比如通常用于回调的匿名类中会出现.implements Landroid/view/View$OnClickListener;。
三、 字段定义
.field <权限修饰符> <非权限修饰符> <名称>:<类型>
其中非权限修饰符可以为final或者abstract。
四、方法定义
.method <权限修饰符> <非权限修饰符> <名称>(<参数类型>)<返回值类型>
...
.end method
五、数据定义
变量赋值对应的反编译代码 举例:
boolean z = true;
z = false;
byte b = 1;
short s = 2;
int i = 3;
long l = 4;
float f = 0.1f;
double d = 0.2;
String str = "test";
Class c = Object.class;
反编译后:
const/4 v10, 0x1
const/4 v10, 0x0
const/4 v0, 0x1
const/4 v8, 0x2
const/4 v5, 0x3
const-wide/16 v6, 0x4
const v4, 0x3dcccccd # 0.1f
const-wide v2, 0x3fc999999999999aL # 0.2
const-string v9, "test"
const-class v1, Ljava/lang/Object;
六、数据运算
二元运算指令格式为<运算类型>-<数据类型> vx,vy,vz。其中算术运算的type可以为int、long、float、double四种(short、byte按int处理),位运算的只支持int、long。
指令 | 运算类型 | 含义 |
---|
位运算 | | | and- vx,vy,vz | 与 | vx = vy & vz | or- vx,vy,vz | 异 | vx = vy l vz | xor- vx,vy,vz | 异或 | vx = vy ^ vz | shl- vx,vy,vz | 左移 | vx = vy << vz | shr- vx,vy,vz | 算术右移 | vx = vy >> vz | ushr- vx,vy,vz | 逻辑左移 | vx = vy >>> vz |
例:
int a = 5,
b = 2,
c = a + b,
d = a - b,
e = a * b,
f = a / b,
g = a % b,
h = a & b,
i = a | b,
j = a ^ b,
k = a << b,
l = a >> b,
m = a >>> b;
编译:
const/4 v0, 0x5
const/4 v1, 0x2
add-int v2, v0, v1
sub-int v3, v0, v1
mul-int v4, v0, v1
div-int v5, v0, v1
rem-int v6, v0, v1
and-int v7, v0, v1
or-int v8, v0, v1
xor-int v9, v0, v1
shl-int v10, v0, v1
shr-int v11, v0, v1
ushr-int v12, v0, v1
七、条件跳转
|