Crack App | 【填坑】某 H5 app 的反調(diào)試?yán)@過(Frida 與 Xposed 雙版本)
第一時(shí)間關(guān)注Python技術(shù)干貨!

圖源:極簡壁紙
今日目標(biāo)
這個(gè) app 是之前文章的讀者在評(píng)論區(qū)提供的樣本
正好今天填一下之前的坑

所以我上網(wǎng)找了樣本,研究一波
aHR0cHM6Ly93d3cud2FuZG91amlhLmNvbS9hcHBzLzgwOTg1NzM=
反調(diào)試
雖然知道這個(gè)H5 app 是有反調(diào)試的,但還是測(cè)試一下看看是不是,不要搞出烏龍來了
訪問 PC 的chrom://inspect

可以看到能看到有手機(jī)設(shè)備,但是沒辦法inspect 這個(gè)app,所以是由反調(diào)試的
直接拖到jadx里搜索關(guān)鍵詞setWebContentsDebuggingEnabled看看這個(gè)設(shè)置

搜索結(jié)果還是很明顯的,一下就能搜索到這個(gè)關(guān)鍵位置

但是看這個(gè)邏輯,不大對(duì)勁啊,如果是反調(diào)試的話應(yīng)該是false才對(duì)
這里是true,說明是可以接受反調(diào)試的
而我們測(cè)試的結(jié)果是無法調(diào)試的,那么這個(gè) app 一定是在某個(gè)角落里做了修改
如果繞過反調(diào)試的話應(yīng)該怎么搞?
先試試 Frida hook 繞過
Frida hook 繞過 H5 反調(diào)試檢測(cè)
竟然檢索結(jié)果只有一個(gè),去找 app 在什么位置修改了這個(gè)的值需要費(fèi)很多功夫,只針對(duì)這個(gè)反調(diào)試的話就有點(diǎn)得不償失了
所以直接用frida hook 把這個(gè)類的所有示例中的這個(gè)值都寫入為true,就不用一個(gè)個(gè)分析了
這個(gè)setWebContentsDebuggingEnabled來自android.webkit.WebView

那么直接hook android.webkit.WebView 將他初始化后所有的setWebContentsDebuggingEnabled全部寫成true應(yīng)該就沒啥問題了
我們寫一個(gè)demo看看
查個(gè)包名

然后hook android.webkit.WebView的$init方法
console.log("腳本加載成功");
function?main(){
????Java.perform(function(){
????????var?WebView?=?Java.use('android.webkit.WebView');
????????WebView.$init.implementation?=?function(a){
????????????var?result?=?this.$init(a);
????????????return?result;
????????}
????});
}
setImmediate(main)
先這么寫,然后運(yùn)行一波看看
frida?-U?-f?[app?name]?-l?script.js?--no-pause

系統(tǒng)會(huì)提示有重載,我們把所有的重載都hook上
console.log("腳本加載成功");
function?main(){
????Java.perform(function(){
????????var?WebView?=?Java.use('android.webkit.WebView');
????????WebView.$init.overload('android.content.Context').implementation?=?function(a){
????????????var?result?=?this.$init(a);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet').implementation?=?function(a,b){
????????????var?result?=?this.$init(a,b);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int').implementation?=?function(a,b,c){
????????????var?result?=?this.$init(a,b,c);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'int').implementation?=?function(a,b,c,d){
????????????var?result?=?this.$init(a,b,c,d);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'boolean').implementation?=?function(a,b,c,d){
????????????var?result?=?this.$init(a,b,c,d);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'java.util.Map',?'boolean').implementation?=?function(a,b,c,d,e){
????????????var?result?=?this.$init(a,b,c,d,e);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'int',?'java.util.Map',?'boolean').implementation?=?function(a,b,c,d,e,f){
????????????var?result?=?this.$init(a,b,c,d,e,f);
????????????return?result;
????????}
????});
}
setImmediate(main)
這樣就可以將所有webview.$init都hook上了
然后我們需要做的是將這些init實(shí)例的setWebContentsDebuggingEnabled全都設(shè)置為true
console.log("腳本加載成功");
function?main(){
????Java.perform(function(){
????????var?WebView?=?Java.use('android.webkit.WebView');
????????WebView.$init.overload('android.content.Context').implementation?=?function(a){
????????????var?result?=?this.$init(a);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet').implementation?=?function(a,b){
????????????var?result?=?this.$init(a,b);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int').implementation?=?function(a,b,c){
????????????var?result?=?this.$init(a,b,c);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'int').implementation?=?function(a,b,c,d){
????????????var?result?=?this.$init(a,b,c,d);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'boolean').implementation?=?function(a,b,c,d){
????????????var?result?=?this.$init(a,b,c,d);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'java.util.Map',?'boolean').implementation?=?function(a,b,c,d,e){
????????????var?result?=?this.$init(a,b,c,d,e);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????????WebView.$init.overload('android.content.Context',?'android.util.AttributeSet',?'int',?'int',?'java.util.Map',?'boolean').implementation?=?function(a,b,c,d,e,f){
????????????var?result?=?this.$init(a,b,c,d,e,f);
????????????this.setWebContentsDebuggingEnabled(true);
????????????return?result;
????????}
????});
}
setImmediate(main);
然后再運(yùn)行下hook腳本看看是否能夠繞過反調(diào)試

運(yùn)行成功,再試下chorme://inspect

就可以看到這個(gè)app顯示出來了
點(diǎn)擊inspect就可以調(diào)試了

Xposed 插件繞過反調(diào)試
在之前的文章里面我提供了xposed插件用于繞過H5 的反調(diào)試,我們測(cè)試一下能不能繞過這個(gè)app的反調(diào)試
安裝好插件之后,記得勾選一下

然后打開目標(biāo)app,然后再訪問chrome://inspect

也是可以inspect的
這個(gè)插件針對(duì)H5反調(diào)試還是蠻好用的,有需要的可以訪問下方的鏈接,查看使用方式和插件的獲取方式
Crack App | 某保險(xiǎn)資訊 App 請(qǐng)求頭參數(shù) token 與 sign 加密算法分析
End.
以上就是全部的內(nèi)容了,咱們下次再會(huì)~
公眾號(hào)配套技術(shù)交流群,備注【咸魚666】,入群交流
我是沒有更新就在摸魚的咸魚
收到請(qǐng)回復(fù)~
我們下次再見。
對(duì)了,看完記得一鍵三連,這個(gè)對(duì)我真的很重要。
