【Android 原創(chuàng)】MIUI 12穩(wěn)定版系統(tǒng)中的開發(fā)者選項(xiàng)限制解除
以下MIUI 12限制解除:
1.開發(fā)者選項(xiàng)中的USB安裝必須插入SIM卡

2.開發(fā)者選項(xiàng)中的USB調(diào)試(安全設(shè)置)25秒窗口繞過

3.通過ADB命令行安裝APK時(shí)提示小窗口“是否繼續(xù)安裝”

0x00 定位第一個(gè)限制代碼
實(shí)際控制權(quán)限App:com.miui.securitycenter
過程摘要:
? ?? ???一開始以為在com.android.settings包App里面,經(jīng)過界面定位發(fā)現(xiàn)竟然在MIUI手機(jī)管家。
? ?? ???解包,JEB?3.24 Decompiler之后迅速定位相關(guān)Activity: com.miui.permcenter.install.AdbInstallVerifyActivity
? ? 該Activity尋找的辦法是:點(diǎn)擊開啟USB安裝后,利用“開發(fā)者助手”的界面分析器看到棧頂界面有一閃而過的com.miui.permcenter,由于是一閃而過的小窗口,他顯示的是“正在開啟...”,然后迅速提示我”請(qǐng)插入SIM卡“,截圖來不及,就不上圖了.
? ? 隨后找到com.miui.securitycenter,利用AdbInstallVerifyActivity類名迅速定位,詳細(xì)尋找過程不再贅述。
查看OnCreate函數(shù),可以看到

直接在啟動(dòng)了一個(gè)后臺(tái)網(wǎng)絡(luò)線程,請(qǐng)求網(wǎng)絡(luò),查看q.a后發(fā)現(xiàn)是檢查用戶是否有權(quán)限解鎖:

此處不提,往下看可知

又執(zhí)行了一個(gè)b函數(shù),檢查是否登錄小米賬號(hào)。我這里已經(jīng)登錄所以沒有報(bào)錯(cuò)。如果想在不登錄賬戶的情況下解鎖,可以考慮回溯該處堆棧信息以進(jìn)行判斷Hook,讓他直接走this.a()函數(shù)。
我們繼續(xù)查看this.a函數(shù):

可以看到開始進(jìn)入布局界面inflate,做開發(fā)的看到這個(gè)函數(shù)一定很熟悉了,界面加載。
setupAlert函數(shù)沒什么看頭,目測(cè)是打開提示窗口。
我們直接看d函數(shù)

d函數(shù)很有意思,先進(jìn)行了網(wǎng)絡(luò)判斷,如果沒網(wǎng)會(huì)提示你開網(wǎng)再玩.有網(wǎng)的話它會(huì)執(zhí)行一個(gè)后臺(tái)任務(wù).
我們到new a這里看。
a是一個(gè)內(nèi)部靜態(tài)異步任務(wù)

里面持有了一個(gè)弱引用上下文防止內(nèi)存泄漏。
既然是Asynctask那么我們就關(guān)注一下兩個(gè)特殊函數(shù)

doInBackground是優(yōu)先于onPostExecute執(zhí)行的,是進(jìn)行網(wǎng)絡(luò)訪問等耗時(shí)操作,然后把結(jié)果傳回UI線程函數(shù)onPostExecute。
也就是說,我們只需要直接看結(jié)果接受函數(shù):onPostExecute.
doInBackground是返回了錯(cuò)誤信息,用于this.a函數(shù)接受,如果不符合解鎖條件那么a函數(shù)將會(huì)吐司它的String信息。
點(diǎn)開this.a(((String)arg1));我們看下a函數(shù)是干嘛的:

直接預(yù)覽一看,v0不用看了??是上下文??不會(huì)出現(xiàn)null指針,所以第一個(gè)判斷直接忽略,看第二個(gè):arg4 == null那么執(zhí)行v0.c()函數(shù)。
c函數(shù)又是干嘛的?我們預(yù)覽一下:

這個(gè)沒什么好說的了,InputApplyActivity不是我們的界面,略過,所以this.c一定是false才對(duì)。
又執(zhí)行了this.a(true)函數(shù),我們看一下:

好,最后執(zhí)行了最終操作函數(shù):d.a(clazzInstance).a(Boolean)
跳過去一看:

對(duì)頭了,終于找到控制adb安裝的選項(xiàng)。
重新梳理邏輯:
this.onPostExecute(null)參數(shù)必須為null,然后cls.c.value = false直接判斷為false走this.a(true)函數(shù),最后執(zhí)行了a(true)函數(shù),整個(gè)Hook就完成了。剩下的工作MIUI已經(jīng)做好了,我們Hook的只有兩個(gè)地方。
? ?? ???解除限制SIM卡的FrIDA?Hook代碼:(注釋較多)


0x01 尋找解除USB調(diào)試(安全設(shè)置)25秒窗口
實(shí)際控制權(quán)限App:com.miui.securitycenter
過程摘要:類似0x00節(jié),這里是彈出窗口后用“開發(fā)者助手”查看棧頂Activity,得到當(dāng)前界面:com.miui.permcenter.install.AdbInputApplyActivity

根據(jù)類名迅速定位:

既然是兩個(gè)按鈕,直接定位相關(guān)onClick代碼

看到圖中有一個(gè)0x7F090017和0x7F090502,一個(gè)ID是Accept和Reject,此處不難理解。
有趣的是ID:reject處調(diào)用了一個(gè)a函數(shù)。我們看:

那么如果我們?cè)O(shè)置它參數(shù)為true,會(huì)怎么樣呢?答案是會(huì)重啟手機(jī)adbd,成功開啟該選項(xiàng),從而繞過25秒提示。

0x02 尋找解除是否繼續(xù)安裝限制
實(shí)際控制權(quán)限App:com.miui.securitycenter
過程摘要:還是在MIUI手機(jī)管家里。MIUI真厲害!

簡(jiǎn)單分析,拒絕和繼續(xù)安裝還是按鈕。
直接從activity找相關(guān)執(zhí)行函數(shù):

可以看到,有一個(gè)arg3和arg4.
通過frida下log斷點(diǎn)得出 當(dāng)用戶點(diǎn)擊拒絕時(shí)arg4為-1,否則為-2.
我們看下a.a函數(shù)驗(yàn)證猜想:

果然,只有-2時(shí)參數(shù)arg3才是false,即allowed_pkg.
所以我們可以這樣寫:主動(dòng)調(diào)用onClick(null,-2),然后finish()讓窗口自己消失,這樣就達(dá)到了不用點(diǎn)擊全自動(dòng)安裝App不受限制的目的。
看代碼:

0x03 結(jié)果



App也直接成功直接安裝進(jìn)入debugger模式。
原文鏈接:https://www.52pojie.cn/thread-1274517-1-1.html