Android webview数据获取 webview抓取

  • Post author:
  • Post category:其他


总结下 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就可。

————————————————

版权声明:本文为CSDN博主「spinchao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/spinchao/article/details/104769061