美团WebView代理设置
之前使用ProxyDroid设置代理,会被检测到,然后被风控,无法正常领券。
| org.chromium.meituan.net.ProxyChangeListener$ProxyReceiver org.chromium.net.ProxyChangeListener$ProxyReceiver
|
经测试,领券页面是WebView,只需要在打开页面前设置https代理服务器,再通知WebView的代理代理变化监听器(org.chromium.net.ProxyChangeListener$ProxyReceiver)即可。
| /product/app/WebViewGoogle64/WebViewGoogle64.apk
|
https://chromium.googlesource.com/chromium/src/net/+/master/android/java/src/org/chromium/net/ProxyChangeListener.java#182
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
| Java.perform(function () { mylog("start...") var proxyHost = "192.168.31.111"; var proxyPort = 8888;
var KNBWebCompatDelegateImpl = Java.use("com.sankuai.meituan.android.knb.KNBWebCompatDelegateImpl"); KNBWebCompatDelegateImpl.loadUrl.overload('java.lang.String', 'java.util.Map', 'boolean').implementation = function (arg_0, arg_1, arg_2) { if (flag_proxy && arg_0 != null && arg_0.indexOf('cube.meituan.com') > -1) {
try { var System = Java.use('java.lang.System'); System.setProperty('https.proxyHost', proxyHost); System.setProperty('https.proxyPort', proxyPort.toString()); System.setProperty('nonProxyHosts', "test.com"); mylog('set proxy success!')
send_proxy_change_notify()
Java.scheduleOnMainThread(function () { var Toast = Java.use("android.widget.Toast"); var context = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext() Toast.makeText(context, Java.use("java.lang.String").$new("设置代理成功"), 0).show(); }); flag_proxy = false; } catch (e) { mylog('set proxy failed!') console.log(e) }
} this.loadUrl(arg_0, arg_1, arg_2); }
});
|
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
| function send_proxy_change_notify() { var registeredReceivers = [] Java.choose('android.content.BroadcastReceiver', { onMatch: function (instance) { var className = instance.getClass().getName();
if (className.indexOf('org.chromium.net.ProxyChangeListener') !== -1) {
console.log('[找到] ' + className);
registeredReceivers.push({ receiver: instance, className: className }); } }, onComplete: function () { console.log('\n[搜索完成] 找到 ' + registeredReceivers.length + ' 个相关接收器\n'); if (registeredReceivers.length > 0) { console.log('[接收器列表]:'); var context = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext() var Intent = Java.use('android.content.Intent'); var PROXY_CHANGE_ACTION = 'android.intent.action.PROXY_CHANGE'; var intent = Intent.$new(PROXY_CHANGE_ACTION); for (var i = 0; i < registeredReceivers.length; i++) { console.log(' [' + (i + 1) + '] ' + registeredReceivers[i].className); registeredReceivers[i].receiver.onReceive(context, intent)
} console.log(''); } } }); }
|
参考链接
https://github.com/ybx945ybx/Android-webviewproxy/blob/master/WebViewProxy/app/src/main/java/tom/webviewproxy/ProxyUtils.java#L279