我的CSDN地址:https://blog.csdn.net/zenglintao/article/details/106029499
一、smali基本语法
本次实战需要用到smali语言的知识,下面讲一下smali语言的基本语法吧
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支:
"if-eq vA, vB, :cond_" 如果vA等于vB则跳转到:cond_
"if-ne vA, vB, :cond_" 如果vA不等于vB则跳转到:cond_
"if-lt vA, vB, :cond_" 如果vA小于vB则跳转到:cond_
"if-ge vA, vB, :cond_" 如果vA大于等于vB则跳转到:cond_
"if-gt vA, vB, :cond_" 如果vA大于vB则跳转到:cond_
"if-le vA, vB, :cond_" 如果vA小于等于vB则跳转到:cond_
"if-eqz vA, :cond_" 如果vA等于0则跳转到:cond_
"if-nez vA, :cond_" 如果vA不等于0则跳转到:cond_
"if-ltz vA, :cond_" 如果vA小于0则跳转到:cond_
"if-gez vA, :cond_" 如果vA大于等于0则跳转到:cond_
"if-gtz vA, :cond_" 如果vA大于0则跳转到:cond_
"if-lez vA, :cond_" 如果vA小于等于0则跳转到:cond_
二、root检测分析
app检测root无非就以下几种方式
1.检测系统版本是否为开发版
2.检测手机上是否安装了root管理器(Magisk,supersu,superuser等)
3.检测手机上是否安装了需要root的软件(xposed,lucky patcher等)
4.检测手机是否存在二进制su文件
5.检测手机是否存在busybox
三、实战开始
本次实战就用手机端的MT管理器,用apktool的话感觉有点大材小用了
实战对象是某公司的金融类app
首先打开app会发现无法使用,因为手机已经被root了
然后我们进行第一步修改,查找root工具的包名
我的手机是使用magisk管理root的,所以我就直接搜索magisk
通过查找找到了一个有很多包名的类,可以看出这是一个用来保存字符串变量的类
将里面的包名全部替换掉,随便替换成什么字符串都行,目的就是让它不能匹配
然后还要替换里面的路径,路径不能随便替换,不然会导致应用无法打开的
我是用的root管理工具是magisk,magisk会在你的手机根目录创建一个名为sbin的文件夹
里面存放着su和busybox,所以我只要替换掉sbin这个文件夹就可以了
替换掉之后就保存编译
再次运行错误代码变成了R008
使用R008继续查找dex文件
然后找到了错误码所在的类
这条语句是一个Lambda表达式,写成java就是bVar.f() ? "R008"
就是说当bVar.f()是真的时候就显示R008
我查了一下,这个bVar是b类new的一个对象,而这个b类是在com.scottyab.rootbeer.b这个包下面
我打开了这个包下面的b类,找到 f 方法,发现这里是执行了su命令以及which命令,于是我把这两条命令也替换了,再次保存编译。
最后打开app查看结果
完美解决root手机不能使用的问题