跳至内容

Jixun's Blog 填坑还是开坑,这是个好问题。

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

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论区