安卓免 root 绕过网易云音乐 IP 限制
2023.07.25: 更方便的方法应该是通过 AdGuard 自定义规则来屏蔽了。下文仅供参考。
找到个免 root 的安卓防火墙 (NetGuard),通过虚拟一个本地 VPN 实现对网络访问数据的拦截以及处理。
但是对流量进行拦截为该应用的收费功能,该方案在未来可能会被网易封锁,因此请自行进行决舍。像我这样的好孩子当然是买买买啦
因为我的网络环境有点特殊,不能使用自定义 DNS 服务器,只好通过修改 dns 劫持的代码使其工作。程序本身不支持篡改 DNS 回应,但得力于其易读的代码,可以很简单的对代码进行改造实现。
当然,因为不是很懂安卓 JNI 交互,因此地址是写死到编译后的 apk 里的。如果你不需要这个功能,你可以跳过这部分直接到防火墙设定部分。
代码修改法
准备工作
- Android Studio 最新版
- 一份 NetGuard 最新版的源代码
- 一颗有着折腾的 ♥
首先要修改的是 JNI 的代码,使其在遇到希望修改的域名处将其 IP 数据给修改掉。
/**
* 修改文件:
* app/src/main/jni/netguard/dns.c
* 行号:
* 123 ~ 124 行中间插入
*/
if (qtype == DNS_QTYPE_A) {
if (strcmp(name, "music.163.com") == 0
|| strcmp(name, "ip.ws.126.net") == 0) {
inet_pton(AF_INET, "79.137.38.20", data + off);
} else if (strcmp(name, "m10.music.126.net") == 0) {
inet_pton(AF_INET, "125.39.1.27", data + off);
}
} else {
if (strcmp(name, "music.163.com") == 0
|| strcmp(name, "ip.ws.126.net") == 0) {
inet_pton(AF_INET6, "2001:41d0:401:3100::4f8a", data + off);
}
}
然后是基于 IP 的屏蔽:
/**
* 修改文件:
* app/src/main/jni/netguard/ip.c
* 行号:
* 第 24 行后增加
*/
jboolean allow_ip(uint32_t dest);
307 ~ 312 行是这样的,替换为:
if (version != 4 || allow_ip(*(uint32_t*)daddr)) {
jobject objPacket = create_packet(
args, version, protocol, flags,
source, sport, dest, dport, "", uid, 0);
redirect = is_address_allowed(args, objPacket);
allowed = (redirect != NULL);
if (redirect != NULL && (*redirect->raddr == 0 || redirect->rport == 0))
redirect = NULL;
} else {
redirect = NULL;
allowed = 0;
}
然后在下面找到 get_uid
这个函数,上面加上:
jboolean allow_ip(uint32_t dest) {
switch (dest){
case 180878559: // 223.252.199.10
case 1434516327: // 103.251.128.85
return 0;
}
return 1;
}
然后因为流量过滤功能需要进行应用内购才允许执行,因此你还需要干掉内购认证的代码。
这个部分我就不多说了,代码都在那,自行寻找 😘
然后参考安卓应用签名编译的步骤产生 apk 文件,将其安装到手机内就行了。
防火墙设定法
- 首先保存事先配置好的设定文件到手机
- “三个点”的菜单 > 设定 Settings > 备份 Backup > 导入设定 Import Settings
- 选择刚才保存的文件
- 等待数秒,直到提示操作完成 Action Complete
- 此时应停留在设定界面,返回到主界面。
- 点击应用左上角的滑条,启用防火墙。
总结
根据应用 FAQ 的说法,如果你关机的时候开了防火墙,那么重启后防火墙将自动启用。