總結下 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());
}
});
方法二:通過js注入來獲取
首先是獲取網頁HTML的js是
document.getElementsByTagName('html')[0].innerHTML;
只需要在合適時間,注入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);
}
用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);
}
}
);
}
如果對方APP沒有WebViewClient ,直接拿到webview 在hook插件裏設置一個就行,
因爲調用的都是系統的class,所以不需要反射,直接在xposed插件裏像寫正常代碼一樣設置webview就可。