smali语言是Davlik的寄存器语言,语法上和汇编语言类似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的全部操做都必须通过寄存器来进行。html
静态分析Android程序——smali文件解析java
blog.csdn.net/hp910315/ar…android
Smali基本语法(一)数组
blog.csdn.net/l_o_s/artic…bash
Android smali语法app
www.cnblogs.com/goodhacker/…工具
smali类型 | java类型 |
---|---|
V | void (用于返回类型) |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long (64 bits) |
F | float |
D | double (64 bits) |
Kotlin代码post
class MainActivity : AppCompatActivity() {
...
}
复制代码
Smaliui
.class public final Lapp/santaone/customer/voip/MainActivity;
.super Landroidx/appcompat/app/AppCompatActivity;
.source "MainActivity.kt"
...
复制代码
总结:
Kotlin代码
private var incomingSip: String? = null
private var isOutgoing = false
复制代码
Smali
# instance fields
.field private incomingSip:Ljava/lang/String;
.field private isOutgoing:Z
复制代码
总结:
Kotlin代码
override fun onStart() {
super.onStart()
}
复制代码
Smali
.method protected onStart()V
.locals 0
.line 248
invoke-super {p0}, Landroidx/appcompat/app/AppCompatActivity;->onStart()V
return-void
.end method
复制代码
总结:
Kotlin代码
private fun print(string: String) {
Log.d(TAG, string)
}
复制代码
Smali
.method private print(Ljava/lang/String;)V
.registers 3
.param p1, "string" # Ljava/lang/String;
.prologue
.line 29
const-string v0, "MainActivity"
invoke-static {v0, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 30
return-void
.end method
复制代码
总结:
smali | 描述 |
---|---|
add-int v0, p1, p2 | v0 = p1 + p2 |
sub-int v0, p1, p2 | v0 = p1 - p2 |
mul-int v0, p1, p2 | v0 = p1 * p2 |
div-int v0, p1, p2 | v0 = p1 / p2 |
rem-int v0, p1, p2 | v0 = p1 % p2 |
and-int v0, p1, p2 | v0 = p1 & p2 |
or-int v0, p1, p2 | v0 = p1 │ p2 |
xor-int v0, p1, p2 | v0 = p1 ^ p2 |
shl-int v0, p1, p2 | v0 = p1 << p2 |
... | ... |
smali | 描述 |
---|---|
return-void | 直接返回 |
return v0 | 返回v0 |
return-object v0 | 返回v0(对象) |
return-wide v0 | 给v0(双寄存器的值) |
invoke-virtual | 调用通常方法 |
invoke-super | 调用父类方法 |
invoke-direct | 调用private/构造方法 |
invoke-static | 调用静态方法 |
invoke-interface | 调用interface方法 |
const(/4, /16, ,/high16) vx, num | 把nun赋给vx寄存器, num为(4bit, 16bit, 32bit(int), 16bit(float)) |
const-wide(/16, ,/high16) vx, num | 把num赋给vx和vx+, num为(?, 64bit(long), 64bit(double)) |
const-string( , -jumbo) vx, string | "Unicode"字符串赋给vx (通常, 过长) |
const-class vx, class | 将Class赋值给vx |
if-eq v0, v1 | if (v0 == v1) |
if-ne v0, v1 | f (v0 != v1) |
if-gt v0, v1 | if (v0 > v1) |
if-ge v0 | if (v0 >= v1) |
if-lt v0 | if (v0 < v1) |
if-le v0 | if (v0 <= v1) |
if-eqz v0 | if (v0 == 0) |
if-nez v0 | if (v0 != 0) |
if-gtz v0 | if (v0 > 0) |
if-gez v0 | if (v0 >= 0) |
if-ltz v0 | if (v0 < 0) |
if-lez v0 | if (v0 <= 0) |
iget0 | 取值(int) |
iget-wide0 | 取值(双寄存器值) |
iget-object0 | 取值(对象指针) |
iget-boolean0 | 取值(bool) |
iget-byte0 | 取值(字节) |
iget-char0 | 取值(字符) |
iget-short0 | 取值(short) |
iput0 | 赋值(int) |
iput-wide0 | 赋值(双寄存器值) |
iput-object 0 | 赋值(对象指针) |
iput-boolean0 | 赋值(bool) |
iput-byte0 | 赋值(字节) |
iput-char0 | 赋值(字符) |
iput-short0 | 赋值(short) |
smali插桩,插桩的原理就是静态的修改apk的samli文件,而后从新打包。