美团WebView代理设置

美团WebView代理设置

之前使用ProxyDroid设置代理,会被检测到,然后被风控,无法正常领券。

1
2
org.chromium.meituan.net.ProxyChangeListener$ProxyReceiver
org.chromium.net.ProxyChangeListener$ProxyReceiver

经测试,领券页面是WebView,只需要在打开页面前设置https代理服务器,再通知WebView的代理代理变化监听器(org.chromium.net.ProxyChangeListener$ProxyReceiver)即可。

1
/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