安卓免 root 绕过网易云音乐 IP 限制 | 季寻日志

找到个免 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 的说法,如果你关机的时候开了防火墙,那么重启后防火墙将自动启用。

(0)

相关推荐