某得物 - WebView App H5调试
⚠️前言⚠️
本文仅用于学术交流。
学习探讨逆向知识,欢迎私信共享学习心得。
如有侵权,联系博主删除。
请勿商用,否则后果自负。
说明一下
本文不涉及算法还原,仅记录一下
- 如何调试 App H5
- 定位加密位置
App版本与入口
- app版本:5.31.1
- app - 主页 - 心愿海洋 - 领鱼食任务列表
一. 什么是WebView? 特地去问了一个 kimi,我们来简单了解一下。
i. WebView 是用来做什么的?
WebView 是一种用于在应用程序中嵌入网页内容的组件,它允许用户在应用内部浏览网页,而无需打开独立的浏览器。
WebView 广泛应用于各种开发平台,包括 Android、iOS 和桌面应用程序开发中。
在 Android 开发中,WebView 是一个强大的组件,用于嵌入网页内容。它基于 Chromium 浏览器引擎,支持 HTML5 和 JavaScript。
在 iOS 开发中,WKWebView 是 WebView 的现代版本,属于 WebKit 框架的一部分,用于替代旧的 UIWebView。支持多线程渲染,性能更优。
支持 JavaScript 与原生代码的双向通信。可以通过 WKNavigationDelegate 和 WKScriptMessageHandler 管理网页加载和交互。
ii. WebView 的优势
用户体验:用户无需离开应用即可浏览网页内容。
功能集成:可以方便地将网页功能集成到原生应用中。
跨平台:支持多种操作系统和开发框架。
二. WebView 打开调试
WebView.setWebContentsDebuggingEnabled 是 Android 开发中用于开启或关闭 WebView 调试功能的方法。
通过调用 WebView.setWebContentsDebuggingEnabled(true) 开启调试功能。
【位置定位】可在jadx中全局检索 setWebContentsDebuggingEnabled。
为 true 时, 表示可调式。若为 False, 则需 frida hook 开启调试。
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;
}
})
三. 暗坑 - frida 反调试
- WebView 开启调试的方法,一般在 app 启动时被调用。
- hook 过程中 app 频繁闪退。
- 这个时候我们需要hook看一下,app 在启动过程中都调用了那些 so 文件,并且在那个so文件执行的时候导致app闪退的。
- 通过 hook 日志可以看到执行到 libmsaoaidsec.so,app 闪退
- 一般公司的安全人员会单独写so文件用来检测,我们可以按照打印路径尝试删除/重命名试一下
- 当然若修改后行不通, 就需要用ida打开该so文件看看了, 看看具体是字符串检测还是线程检测,有针对性的进行hook操作
- 修改完成后,app就不会再出现闪退的现象了
4. 调试
-
WebView 开启调试后,app进入要调试的 H5 页面,chrome 浏览器输入 chrome://inspect/#devices
-
整体就是这个样子的,我们就可以开始抓包调试js了
-
目标数据包 data 参数
- ajax 断点
- 调试找到如下位置:这里调试起来有点费劲,搞了好久 【或者可以全局检索 ‘data’】
- 加密入口,目标js文件【 poreinforce.js】