作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:1573
阅读时间: 15min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
前置技术
-
实战
-
总结
0x01 前言
前段时间只是给大家讲了smali语法却没有实战中用到,因此出了这个专题
0x02 前置知识
1.虚拟机
在java中,java文件会被编译成.class字节码文件交由jvm运行翻译成机器码,再交由具体硬件进行实现
那在安卓中,对应的是java文件会被编译转换成dex字节码文件,最后打包成apk交由ART或者Dalvik进行运行,将dex文件转换成机器码交由具体硬件运行
安卓5.0之前使用的是一代虚拟机Dalvik,其采用的是jit方式即时编译,并且只支持32位cpu
之后使用的是ART,其采用的是预先编译(AOT),在虚拟环境直接运行机器码,运行速度快得多,且同时支持64位cpu
2.smail及其语法
smail是寄存器语言,由dex语言反编译而成
相关语法,这里就把之前的内容带给大家继续复习一下(当然也可以直接看实战)
基本数据类型
Smali数据类型 | Java数据类型 |
---|---|
V | void |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
对象类型
Smali数据类型 | Java数据类型 |
---|---|
Lpackage/name/ObjectName; | ObjectName |
[I | int[] |
语法关键字
关键词 | 说明 |
---|---|
.class | 定义java类名 |
.super | 定义父类名 |
.source | 定义Java源文件名 |
.filed | 定义字段 |
.method | 定义方法开始 |
.end method | 定义方法结束 |
.annotation | 定义注解开始 |
.end annotation | 定义注解结束 |
.implements | 定义接口指令 |
.local | 指定了方法内局部变量的个数 |
.registers | 指定方法内使用寄存器的总数 |
.prologue | 表示方法中代码的开始处 |
.line | 表示java源文件中指定行 |
.paramter | 指定了方法的参数 |
.param | 和.paramter含义一致,但是表达格式不同 |
一般来说,打开smali文件,头三行的格式如下
.class <访问权限> [关键修饰字] <类名>;
.super <父类名>;
.source <源文件名>
类的成员变量,类似于private,public
.filed <访问权限> [关键修饰字] <字段名>:<字段类型>
函数的声明格式
.method <访问权限> [关键修饰字] <方法原型>
<.locals> <.registers> // 函数中非参数的变量的多少
[.param] // 方法参数
[.line]
<代码>
.end method
3.逆向关键点
如果要想改变程序逻辑结构,在smali代码中,有三种方法
1.修改判断
2.跳转逻辑
3.修改寄存器的值
4.寄存器
在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)
0x03 实战
打开我们的test demo
这里显示请先充值大会员,那我们根据关键词搜索找到对应代码逻辑
首先我们把apk放入jadx进行反编译,方便我们进行查看
在jadx中,汉字一般被unicode编码了,所以我们 将 “大会员” 关键字进行unicode编码进行搜索,这里我采用的是改进版,就直接汉字搜了
整个逻辑如下
我们可以根据这个函数逻辑看smali代码
整个代码逻辑在这
1.修改判断
我们要直接执行一键三连操作,就需要绕过两个判断
1.大于等于10个硬币
2.是VIP
相关对应smail代码在这里
此处判断是否大于等于10,如果大于则跳转cond15
此处判断p是否0,如果是则跳转执行cond43 执行充值大会员弹窗操作
那修改逻辑很简单了,打开mt管理器进行修改
此处直接小于
此处直接不等于
反编译后直接安装,包过的啊
2.修改寄存器的值
直接令v0寄存器值为0,这样去比较的时候,永远会跳至cond_15的逻辑
随后执行判断vip的逻辑
直接让vip返回true即可
3.修改跳转逻辑
直接跳过第一个判断逻辑
改成直接执行cond15逻辑
并把下面vip判断逻辑omit掉
直接就进入到vip逻辑
0x04 总结
对于大多数小型+未加壳的应用,VIP功能点的判断绕过便是如此简单,但对于大型应用来说,则还需要涉及到包的sign值、数据库查询功能角色等一系列校验操作了,不单单只是安卓逆向,这个我们会在后面讲到。后期将会给大家带来更多安卓逆向的知识
参考链接: https://blog.csdn.net/AlunXZhou/article/details/134755054
原文始发于微信公众号(剑客古月的安全屋):app攻防-二刷smail&破解VIP之demo篇
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论