Smali汇编

了解安卓虚拟机

Dalvik虚拟机

JIT(Just-In-Time Compile 即时编译),高频率使用代码空闲时间编译好并存储到内存

Art虚拟机

AOT(Ahead-Of-Time 预先编译) 一次编译好,oat文件

头文件定义与接口实现

(“<>”表示可选)

.class

作用:定义类,包括包名和类名

格式:.class <访问权限> [关键修饰字] <完整类名> (“<>”表示可选)

.super

作用:定义所属父类

格式:.super <父类完整类名>

.source

作用:指定该smail代码所属java源文件

格式:.source <java源代码名称>

.implements

作用: 声明实现接口类名称

格式:.implements <接口类名>

静态变量

作用:相当于全局变量,跟类实例没关系,属于类

格式:.field <访问权限> static [修饰词] <字段名> : <变量类型>

​ .field <访问权限> static final <变量名> : <常量类型> = 常量值

普通变量

作用:相当于局部变量,跟类实例有关系,不属于类,没有static修饰

格式:.field <访问权限修饰符> [非权限修饰符] <变量名> : <变量类型>

方法定义

标签:.method .end 之间

格式:.method <访问权限修饰符> [非访问权限修饰符] <方法名> 签名

​ <.locals>

​ [.parameter]

​ [.prologue]

​ [.line]

​ <代码逻辑>

​ .end method

其他语法知识点

clinit函数:静态代码static修饰的

direct methods:不能被子类继承、覆盖、修改

virtual methods:能被子类继承、覆盖、修改

方法调用

指令

invoke-virtual(调用实例的虚方法)
invoke-super(调用实例的父类/基类方法)
invoke-direct(调用实例的直接方法)
invoke-static(调用实例的静态方法)
invoke-static(调用实例的接口方法)

对象的创建

指令组合

new-instance 寄存器,类名

invoke-direct{寄存器,参数寄存器},类名->< init >签名

return-object 寄存器

修改应用Smali代码实现破解功能

反汇编成smali

使用jadx-gui-1.4.4查看源代码,在AndroidManifest.xml中查看包名

找到注册按钮

找到调用checkSN的函数

成功的语句块

失败的语句块

修改checkSN,在放回之前强制将v7改为true

将修改完后的smali进行回编

回编后的文件路径

要先删除原先安装的,再使用APK上上签进行签名,完成