安卓逆向,阻止app对root权限的检测

我的博客园地址:https://www.cnblogs.com/zenglintao/p/12861113.html

一、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权限的检测_第1张图片

首先打开app会发现无法使用,因为手机已经被root了

然后我们进行第一步修改,查找root工具的包名

安卓逆向,阻止app对root权限的检测_第2张图片

我的手机是使用magisk管理root的,所以我就直接搜索magisk

安卓逆向,阻止app对root权限的检测_第3张图片

通过查找找到了一个有很多包名的类,可以看出这是一个用来保存字符串变量的类

安卓逆向,阻止app对root权限的检测_第4张图片

将里面的包名全部替换掉,随便替换成什么字符串都行,目的就是让它不能匹配

然后还要替换里面的路径,路径不能随便替换,不然会导致应用无法打开的

我是用的root管理工具是magisk,magisk会在你的手机根目录创建一个名为sbin的文件夹

里面存放着su和busybox,所以我只要替换掉sbin这个文件夹就可以了

替换掉之后就保存编译

安卓逆向,阻止app对root权限的检测_第5张图片

再次运行错误代码变成了R008

使用R008继续查找dex文件

安卓逆向,阻止app对root权限的检测_第6张图片

然后找到了错误码所在的类

这条语句是一个布尔表达式,写成java就是bVar.f() ? “R008”

就是说当bVar.f()是真的时候就显示R008

我查了一下,这个bVar是b类new的一个对象,而这个b类是在com.scottyab.rootbeer.b这个包下面

我打开了这个包下面的b类,找到 f 方法,发现这里是执行了su命令以及which命令,于是我把这两条命令也替换了,再次保存编译。

安卓逆向,阻止app对root权限的检测_第7张图片

最后打开app查看结果

安卓逆向,阻止app对root权限的检测_第8张图片

完美解决root手机不能使用的问题

你可能感兴趣的:(android)