我的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手機不能使用的問題