Smali
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(调用实例的虚方法) |
对象的创建
指令组合
new-instance 寄存器,类名
invoke-direct{寄存器,参数寄存器},类名->< init >签名
return-object 寄存器
修改应用Smali代码实现破解功能
反汇编成smali
使用jadx-gui-1.4.4查看源代码,在AndroidManifest.xml中查看包名
找到注册按钮
找到调用checkSN的函数
成功的语句块
失败的语句块
修改checkSN,在放回之前强制将v7改为true
将修改完后的smali进行回编
回编后的文件路径
要先删除原先安装的,再使用APK上上签进行签名,完成