安卓逆向这档事-第三节.初识smali,vip终结者
一、基础知识介绍
1.什么是JVM、Dalvik、ART
JVM是JAVA虚拟机,运行JAVA字节码程序
Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)
Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异
2.smali及其语法
smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。
关键字
名称 | 注释 |
---|---|
.class | 类名 |
.super | 父类名,继承的上级类名名称 |
.source | 源名 |
.field | 变量 |
.method | 方法名 |
.register | 寄存器 |
.end method | 方法名的结束 |
public | 公有 |
protected | 半公开,只有同一家人才能用 |
private | 私有,只能自己使用 |
.parameter | 方法参数 |
.prologue | 方法开始 |
.line xxx | 位于第xxx行 |
数据类型对应
smali类型 | java类型 | 注释 |
---|---|---|
V | void | 无返回值 |
Z | boolean | 布尔值类型,返回0或1 |
B | byte | 字节类型,返回字节 |
S | short | 短整数类型,返回数字 |
C | char | 字符类型,返回字符 |
I | int | 整数类型,返回数字 |
J | long (64位 需要2个寄存器存储) | 长整数类型,返回数字 |
F | float | 单浮点类型,返回数字 |
D | double (64位 需要2个寄存器存储) | 双浮点类型,返回数字 |
string | String | 文本类型,返回字符串 |
Lxxx/xxx/xxx | object | 对象类型,返回对象 |
常用指令
关键字 | 注释 |
---|---|
const | 重写整数属性,真假属性内容,只能是数字类型 |
const-string | 重写字符串内容 |
const-wide | 重写长整数类型,多用于修改到期时间。 |
return | 返回指令 |
if-eq | 全称equal(a=b),比较寄存器ab内容,相同则跳 |
if-ne | 全称not equal(a!=b),ab内容不相同则跳 |
if-eqz | 全称equal zero(a=0),z即是0的标记,a等于0则跳 |
if-nez | 全称not equal zero(a!=0),a不等于0则跳 |
if-ge | 全称greater equal(a>=b),a大于或等于则跳 |
if-le | 全称little equal(a<=b),a小于或等于则跳 |
goto | 强制跳到指定位置 |
switch | 分支跳转,一般会有多个分支线,并根据指令跳转到适当位置 |
iget | 获取寄存器数据 |
其余指令可用语法工具查询
二、快速定位、修改判断、强制跳转、修改寄存器的值
定位方法功能:搜索弹窗关键字、抓取按钮id
修改方法:修改判断、强制跳转、修改寄存器的值
1、快速定位
查看关键值
1.1、搜索弹窗关键字
1.1.1、使用jadx-gui逆向分析搜索快速定位
1.1.2、使用MT管理器逆向分析搜索快速定位
1.2、抓取按钮id
使用开发者助手工具,进入到此关卡界面,进行界面资源分析
复制
往上翻一翻
2、修改判断、强制跳转、修改寄存器的值
使用jadx-gui逆向Java代码中的分析
但是MT管理器或者其他一些可反编译dex的工具都转换成了smali代码
一下是对jadx-gui工具反编译dex之后的注注释
1 |
|
2.1、修改判断
这里的
1 |
|
意思是v0的值为10
p0大于等于v0(10)则跳转(p0是硬币数量)
改成 if-le
p0小于于等于v0(10)则跳转(p0是硬币数量)
注释掉判断是否为大会员(默认为false),不让它判断跳转,直接执行后面是大会员的代码
最终效果
2.2、强制跳转
goto 强制跳转到制定位置
在判断硬币数量之前插入强制跳转,跳转到判断是否是大会员之后,直接执行成为大会员之后的代码
最终效果
2.3、修改寄存器的值
这里是判断硬币的数量,和被比较的值,v0值为10,修改成0,0x0
判断是否是大会员的方法,默认为0就是false,改成1让它为true
最终效果
三、课后小作业
丑小鸭师傅的demo
链接:https://pan.baidu.com/s/1cUInoi 密码:07p9
定位关键词:登录失败
使用jadx-gui逆向分析可以直接看到账密(hfdcxy/1234)
smali代码分析
判断输入的用户名是是否和v0的值相等,如果相等就进入密码的判断,如果密码判断成功就进入登录成功的代码里
如果有一个不相等就跳入cond_1b登录失败
直接在第一次判断之前加入跳转,跳转到if-eqz v0, :cond_1b判断账密是否正确之后的代码里
最终效果