Smali语法学习摘要
一、Smali 简介
首先,提到smali就先说下逆向,逆向通常是安全工程师(逆向工程师),系统分析三方APP以及做破解等恶意分子因为某些利益在做(apk二次打包插入广告、破解收费应用、恶意代码植入、剽窃api等)的一种手段。
当然技术是一把双刃剑,在于使用技术的人而不再技术本身。
回归正题,Smali是一种宽松式的Jasmin/dedexer语法,是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。
Smali,Baksmali分别是冰岛语中编译器,反编译器的叫法。也许你会问为什么是冰岛语呢,因为Dalvik是一个冰岛渔村名字。
二、Smali 语法
1. 数据类型
Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示。
Dalvik字节码有两种类型:基本类型;引用类型(包括对象和数组)。
(1)基本类型
type | 解释 |
---|---|
V | void只能用于返回值类型 |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long(64位) |
F | float |
D | double(64位) |
(2)引用类型
type | 解释 |
---|---|
L | 对象类型(Lpackage/ObjectName; 相当于java中的package.ObjectName;) |
[I | 表示一个整形的一维数组,相当于java的int[]; |
[Ljava/lang/String | 表示一个String的对象数组 |
① 对象类型:
“L“:表示这是一个对象类型
”package/ObjectName“:该对象所在的包与类名,比如Ljava/lang/String =>java.lang.String
”;“:表示对象名称的结束
② 数组的表示形式:
” [I “ :表示一个整形的一维数组,相当于java的int[];
对于多维数组,只要增加”[“ 就行了,[[I => int[][]; 注:每一维最多255个;
③ 对象数组的表示形式:
[Ljava/lang/String 表示一个String的对象数组;
2. 基础语法
2.1 表达式
Java源代码:
public void smaliExpression(){
//加法运算
int a = 1;
double b = 2.5;
double c = a + b;
//减法运算
double d = b - a;
//乘法运算
double e = a * b;
//除法运算
double f = b / a;
//异或运算
int g = 3;
int h = a ^ g;
//三目运算
int i = a > b?a:g;
}
Smali代码:
.method public smaliExpression()V
.locals 15
.line 16
const/4 v0, 0x1 #1
.line 17
.local v0, "a":I
const-wide/high16 v1, 0x4004000000000000L # 2.5
.line 18
.local v1, "b":D
int-to-double v3, v0 //将int型的 1 强转为double的 1.0
add-double/2addr v3, v1 //两个double类型相加
.line 21
.local v3, "c":D
int-to-double v5, v0
sub-double v5, v1, v5 //减法 V5 = V1-V5
.line 24
.local v5, "d":D
int-to-double v7, v0
mul-double/2addr v7, v1 //乘法
.line 27
.local v7, "e":D
int-to-double v9, v0
div-double v9, v1, v9 //除法
.line 30
.local v9, "f":D
const/4 v11