Android webview數據獲取 webview抓取

總結下 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就可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章