smali是Dalvik的寄存器语言,smali代码是安卓apk反编译而来的,两者文件是一一对应的,获取smali需要ApkTool工具。
smali语言比较简单,如果你会java和Android相关知识,就可以通过修改smali语言来改变java的代码,进而可以修改apk文件。
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;])V
smali类型 | java类型 |
---|---|
V | void |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long (64位 需要2个寄存器存储) |
F | float |
D | double (64位 需要2个寄存器存储) |
smali对象 | java对象 |
---|---|
Lpackage/name/ObjectName; | package.name.ObjectName |
Ljava/lang/String; | java.lang.String |
注:L 表示对象类型
package/name 表示包名
; 表示结束
smali数组 | java数组 |
---|---|
[I | int[] 一维数组 |
[[I | int[][] 二维数组 |
[Ljava/lang/String | String[] 对象数组 |
注:每一维最多255个
Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
smali字段 | java字段 |
---|---|
public f1:Z | public boolean f1; |
public f2:I | public int f2; |
public f3:L | java/lang/String; public String f3; |
smali方法 | java方法 |
---|---|
myMethod([I)Ljava/lang/String; | String myMethod(int[]) |
//Java代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
#samli代码
.method protected onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
.line 8
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 9
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/fusijie/helloworld/MainActivity;->setContentView(I)V
.line 10
return-void
.end method
if-eq p1, v0, :c1
:c1
invoke-direct {p0}, Lcom/paul/test/a;->d()V
解读:如果p1和v0相等,则执行c1流程
if-ne p1, v0, :c2
:c2
invoke-direct {p0}, Lcom/paul/test/a;->c()V
解读:表示不相等,则执行c2流程
if-gt 大于
if-ge 大于等于
if-lt 小于
if-le 小于等于
"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
"if-gtz vA, :cond_**" 如果vA大于0则跳转到:cond_**
"if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_**
地址:https://plugins.jetbrains.com/plugin/7385-java2smali
smali比java复杂很多,但是不难,相当于把java语言中更多的信息给还原出来,同时显式地指定了很多细节。
Android4.4系统是个分水岭,ART模式很多机制是和Dalvik。
Dalvik是心脏,
寄存器,内存,