总结下 Android下 webview的数据获取、抓取。
先说总结的情况
方法一:给webview setWebViewClient,然后重写shouldInterceptRequest,获取请求参数,自己发起请求,返回WebResourceResponse。
方法二:WebViewClient 的onPageFinished 方法里面注入js,来获取html
如果是自己应用很简单,如果是其他APP,就是找Hook点,拿到webview,找到设置的WebViewClient 就可以了,剩下的跟自己的APP一样去写。
**
方法一:拦截伪造请求
**
流程就是自己拦截webview的请求,获取请求参数,自己发起请求,然后获取的数据,在给webview即可。
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
// 获取 url cookie 、head等信息
URL url = new URL(request.getUrl());
// 自己截获,发起http请求 ,直接发起http请求,
// 把请求的数据构建成WebResourceResponse ,让wevbview正常显示
return new WebResourceResponse(mimeType, connection.getContentEncoding(), connection.getInputStream());
}
});
1
2
3
4
5
6
7
8
9
10
11
12
方法二:通过js注入来获取
首先是获取网页HTML的js是
document.getElementsByTagName('html')[0].innerHTML;
1
只需要在合适时间,注入js,就能获取到网页源码,最好的时间,就是 页面加载完成后,就是
WebViewClient 的onPageFinished 方法。示例代码
webView.setWebViewClient(new WebViewClient() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onPageFinished(WebView view, String url) {
Log.e("TAG", "页面加载完成" + url);
if (url.startsWith("https://xxxxxxx?")){
// js 1 直接获取
webView.evaluateJavascript("document.getElementsByTagName('html')[0].innerHTML;",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e("TAG"," 网页源码里是 " +value);
}
});
// webView.evaluateJavascript("window.alert(document.getElementsByTagName('html')[0].innerHTML);",null); //js二通过 alert
}
super.onPageFinished(view, url);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
用js1可以直接在回调里拿到js的执行结果。
用js2可以在WebChromeClient 的onJsAlert获取到 alert的参数。
如果逆向搞别的APP,直接hook onPageFinished 方法如
// webview的hook
private void webViewHook(XC_LoadPackage.LoadPackageParam loadPackageParam) {
XposedHelpers.findAndHookMethod("xxxxxxx",// app的WebViewClient 的具体实现类
loadPackageParam.classLoader,
"onPageFinished",
WebView.class,
String.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.e(TAG, "======================webview beforeHookedMethod");
super.beforeHookedMethod(param);
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.e(TAG, "======================webview afterHookedMethod");
String url = null;
if (param.args.length == 2) {
url = (String) param.args[1];
Log.e(TAG, " =====url 是 " + url);
}
// url 过滤
if (url == null || !url.startsWith("https://xxxxx")) {
return;
}
WebView webView = (WebView) param.args[0];
webView.evaluateJavascript("document.getElementsByTagName('html')[0].innerHTML;",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(TAG, " js注入获取到的网页源码是 " + value);
}
});
super.afterHookedMethod(param);
}
}
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
如果对方APP没有WebViewClient ,直接拿到webview 在hook插件里设置一个就行,
因为调用的都是系统的class,所以不需要反射,直接在xposed插件里像写正常代码一样设置webview就可。
————————————————
版权声明:本文为优快云博主「spinchao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/spinchao/article/details/104769061