Crack App | 某 H5 App 反調(diào)試對抗
第一時間關注Python技術干貨!

圖源:網(wǎng)絡
Android 提供多種向用戶呈現(xiàn)內(nèi)容的方式,要提供與平臺其他部分一致的用戶體驗,通常最好構建一個原生應用,并在其中融入框架提供的體驗,某些應用可能需要增強對界面的控制,在這種情況下,可以使用 WebView 顯示受信任的第一方內(nèi)容。
以上內(nèi)容修改編輯自 Android 開發(fā)文檔:https://developer.android.com/guide/webapps
通過以上的內(nèi)容可以知道 h5 app 可以通過 webview 控件向我們提供在線的網(wǎng)頁展示,今天我們搞的 App 就是這樣的
如何判斷 app 的類型?
這個網(wǎng)上的文章可太多了
參考鏈接:
1、https://blog.csdn.net/jackli11241201/article/details/91361692
2、https://buhuibaidu.me/?s=%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%ADapp%E6%98%AF%E5%90%A6%E6%98%AF%20h5
3、通過使用本地的 SDK/tools/bin/uiautomatorviewer 分辨加載頁面的組件是否是 webview 判斷
H5 App 的分析流程

按照上面的展示圖,大概淺顯的理解 H5 app 就是把網(wǎng)頁圖塞到了 app 里面展示出來的(其實沒這么簡單,大概理解個意思)
“H5 的 app 通常是界面里嵌入一個WebView控件,然后使用它來加載網(wǎng)頁
正常的 APP 的分析流程一般是這樣的:
關鍵參數(shù)的加密邏輯是在 Java 層或者 So 層,我們可以通過搜索關鍵詞或者 Frida 等調(diào)試工具動態(tài)調(diào)試定位

然后的我們拿到的 APP 是 H5 的話,在分析這一步就有問題了
H5 App 是將網(wǎng)頁的內(nèi)容套了一個 App 的殼然后給用戶使用,網(wǎng)頁上算法加密一般是用 Js 完成加密
那么問題來了, 怎么調(diào)試定位 H5 App 里面的 Js 加密邏輯呢?
通過百度可以得到以下答案
1、在 H5 App 沒有反調(diào)試的情況下
2、設備USB連接電腦,打開 PC 的 Chrome 訪問網(wǎng)址 chrome://inspect
3、取消Discover network targets - 這一步是關閉網(wǎng)絡上的設備,防止干擾,不關閉也可以
4、在Devices中可以看到對應的設備的WebView
5、點擊 inspect
小試牛刀
既然這樣就拿一臺設備試一試

果然可以看到我們的設備,打開設備的瀏覽器看看(自帶的 Google 怎么說也不會反調(diào)試吧)
用手機的 Chrome 瀏覽器打開百度,然后 PC 重新訪問一下chrome://inspect頁面

可以看到 PC 頁面更新成上面這樣了,我們試著調(diào)試一下手機百度的頁面
點擊inspect,跳轉到下面的頁面,這個時候在下圖右側做的所有操作都同步到手機上了

這就和在瀏覽器里調(diào)試不能說是完全相同,但也可以說是一模一樣了?!竟奉^】
注意事項
1、咸魚 PC 使用的 Chrome 版本 100.0.4896.60(正式版本),環(huán)境一模一樣保平安,其他版本我也沒測試過

2、打開手機頁面的時候,可能或出現(xiàn)白屏或者 404 的情況,導致這個現(xiàn)象的原因可能是因為你沒有使用魔法上網(wǎng),在打開這個頁面的時候會下載文件,沒有魔法上網(wǎng)的話就出錯了
建議在第一次打開的時候將魔法上網(wǎng)切換到全局模式保證可以一步到位
H5 App 的反調(diào)試對抗
這個 App 比較上古,已經(jīng)不提供服務了,本來想用大黃鳥抓包,但是沒抓到需要的登陸包

應該是服務器都掛逼了
不過不影響我們進行今天的內(nèi)容 >> 關于 H5 應用的反調(diào)試對抗
我們按照剛剛的步驟發(fā)現(xiàn),Chrome 里并沒有顯示inspect,猜測是 App 反調(diào)試了
先百度了解一下h5 app 的反調(diào)試

參考鏈接:https://its401.com/article/freak_csh/95585148
也就是說當WebView.setWebContentsDebuggingEnabled(false);的時候就沒辦法調(diào)試了
那我們把目標 app 拖到 Jadx 里以setWebContentsDebuggingEnabled為關鍵詞搜索,看看是否能夠找到目標位置

結果有三個,我們一個個看
第一個寫入的是 true

第二個通過反射寫入 False

第三個是一個判斷,待定

這樣看的話是第二個位置嫌疑最大
我們用 Frida hook 一下看看
// 錯誤實例
function main() {
console.log("Enter the Script!");
Java.perform(function x() {
console.log("Inside Java perform");
Java.choose("類名.ui.WebViewImpl", {
onMatch: function (x) {
console.log("find instance :" + x);
x.setWebViewData.implementation = function(){
console.log("x.setWebViewData.implementation");
}
},
onComplete: function () {
console.log("end");
}
});
});
}
setImmediate(main);
本來用上面的那個代碼發(fā)現(xiàn) hook 不上
// 正確實例
console.log("腳本加載成功");
function main(){
Java.perform(function(){
const WebViewImpl = Java.use('類名.ui.WebViewImpl');
WebViewImpl['setWebViewData'].implementation = function(){
console.log("替換為空");
};
})
}
setImmediate(main)
感謝花哥的指點
本來我是 search 實例然后將方法置空,但是發(fā)現(xiàn)的總是進不去implementation的邏輯,然后的求助花哥,花哥提示我可以不用搜索類實例直接implementation,測試了一下發(fā)現(xiàn)可以進入implementation 的邏輯了。

不過用 Frida 并沒有繞過檢測,感覺還是我有一些地方疏漏了,如果有知道的大佬后臺留言 dddd ,萬分感謝
無奈之下,隨后測試了下 xposed ,用 xposed 實現(xiàn)一下
public class HookMain implements IXposedHookLoadPackage {
String TAG = "xianyuplus";
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
XposedBridge.log("Loaded app :" + loadPackageParam.packageName );
XposedHelpers.findAndHookMethod("類名.ui.WebViewImpl",loadPackageParam.classLoader,"setWebViewData", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return null;
}
});
}
}
結果相當 nice,直接將setWebViewData方法替換為空就可以解決反調(diào)試了
ps:需要注意的是這里的setWebViewData內(nèi)部邏輯只有webview反調(diào)試相關的邏輯所以直接置空是可以的,如果有其他的邏輯的話就不能這樣替換置空了


以上就是本次的全部內(nèi)容了,因為 app 的服務端已經(jīng)掛逼了,所以沒辦法測試,之后有新的 H5 app 樣本的話就再水一篇。
我是沒有更新就在摸魚的咸魚
收到請回復~
我們下次再見。
對了,看完記得一鍵三連,這個對我真的很重要。
