├── priv
├── Core
│ ├── clnc.pid
│ ├── MLBox
│ ├── clnc
│ ├── busybox
│ ├── Changes.txt
│ ├── download_core.sh
│ ├── watch.sh
│ └── CuteBi
├── addon
│ └── Volume-Key-Selector
│ │ ├── a
│ │ ├── tools
│ │ ├── arm
│ │ │ └── keycheck
│ │ └── x86
│ │ │ └── keycheck
│ │ ├── README.md
│ │ └── install.sh
├── stop.sh
├── start.sh
├── test.sh
├── apk
│ ├── dialog.apk
│ ├── lataclysm.apk
│ ├── digXposed.xml
│ ├── com.tencent.tmgp.sgame.xml
│ └── com.cataclysm.i_preferences.xml
├── config.ini
└── clnc_priv.conf
├── .gitignore
├── sepolicy.rule
├── META-INF
└── com
│ └── google
│ └── android
│ ├── updater-script
│ └── update-binary
├── system.prop
├── module.prop
├── service.sh
├── post-fs-data.sh
├── .gitattributes
├── uninstall.sh
├── README.md
└── customize.sh
/priv/Core/clnc.pid:
--------------------------------------------------------------------------------
1 | 4355
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | information/
2 |
--------------------------------------------------------------------------------
/priv/addon/Volume-Key-Selector/a:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/priv/stop.sh:
--------------------------------------------------------------------------------
1 | "${0%/*}"/Core/CuteBi stop
--------------------------------------------------------------------------------
/sepolicy.rule:
--------------------------------------------------------------------------------
1 | # 该文件允许您自定义SELinux规则
2 |
--------------------------------------------------------------------------------
/priv/start.sh:
--------------------------------------------------------------------------------
1 | "${0%/*}"/Core/CuteBi start
--------------------------------------------------------------------------------
/priv/test.sh:
--------------------------------------------------------------------------------
1 | "${0%/*}"/Core/CuteBi status
--------------------------------------------------------------------------------
/META-INF/com/google/android/updater-script:
--------------------------------------------------------------------------------
1 | #MAGISK
2 |
--------------------------------------------------------------------------------
/system.prop:
--------------------------------------------------------------------------------
1 | # 这个文件将被 resetprop 读取
2 | # 示例: 改变 dpi
3 | # ro.sf.lcd_density=320
4 |
--------------------------------------------------------------------------------
/priv/Core/MLBox:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/Core/MLBox
--------------------------------------------------------------------------------
/priv/Core/clnc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/Core/clnc
--------------------------------------------------------------------------------
/priv/Core/busybox:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/Core/busybox
--------------------------------------------------------------------------------
/priv/apk/dialog.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/apk/dialog.apk
--------------------------------------------------------------------------------
/priv/apk/lataclysm.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/apk/lataclysm.apk
--------------------------------------------------------------------------------
/priv/addon/Volume-Key-Selector/tools/arm/keycheck:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/addon/Volume-Key-Selector/tools/arm/keycheck
--------------------------------------------------------------------------------
/priv/addon/Volume-Key-Selector/tools/x86/keycheck:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyzcren/sgame_priv_protect/HEAD/priv/addon/Volume-Key-Selector/tools/x86/keycheck
--------------------------------------------------------------------------------
/module.prop:
--------------------------------------------------------------------------------
1 | id=sgame_priv_protect
2 | name=Sgame Priv Protect for Android
3 | version=latest_version
4 | versionCode=20210827
5 | author=ywlin
6 | description=防王者荣耀特权IP异常模块
7 |
--------------------------------------------------------------------------------
/service.sh:
--------------------------------------------------------------------------------
1 | #!/system/bin/sh
2 |
3 | MODDIR=${0%/*}
4 |
5 | (
6 | until [ $(getprop sys.boot_completed) -eq 1 ] ; do
7 | sleep 5
8 | done
9 | ${MODDIR}/priv/Core/watch.sh
10 | )&
11 |
--------------------------------------------------------------------------------
/post-fs-data.sh:
--------------------------------------------------------------------------------
1 | # 开机之前执行
2 | #!/system/bin/sh
3 | # 不要假设您的模块将位于何处。
4 | # 如果您需要知道此脚本和模块的放置位置,请使用$MODDIR
5 | # 这将确保您的模块仍能正常工作
6 | # 即使Magisk将来更改其挂载点
7 | MODDIR=${0%/*}
8 |
9 | # 此脚本将在post-fs-data模式下执行
10 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Declare files that will always have LF line endings on checkout.
2 | META-INF/** text eol=lf
3 | *.prop text eol=lf
4 | *.sh text eol=lf
5 | *.md text eol=lf
6 |
7 | # Denote all files that are truly binary and should not be modified.
8 | system/** binary
9 |
--------------------------------------------------------------------------------
/priv/Core/Changes.txt:
--------------------------------------------------------------------------------
1 | 0.9.3(当前版本)
2 | 添加只禁网内核TCP的选项
3 | 添加ipv6除内核外都禁网的选项
4 | 1.0.0
5 | 更新联网检测和IP地址检测
6 | 减少无关紧要的错误输出
7 | 更新clnc核心(修复socks5域名无法连接)
8 | 删除直连模式中过期的DNS服务器(过期的DNS服务器会导致部分用户打开网页慢)
9 | 1.0.1
10 | 更改http/https联网成功判断逻辑
11 | 后台检测脚本更新改为前台检测脚本更新
12 | 请加群更新:184531085
13 |
14 |
--------------------------------------------------------------------------------
/priv/apk/digXposed.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/uninstall.sh:
--------------------------------------------------------------------------------
1 | ##########################################################################################
2 | #
3 | # priv Magisk Module Uninstaller Script
4 | #
5 | ##########################################################################################
6 |
7 | remove_priv_data_dir() {
8 | rm -rf /data/priv
9 | }
10 |
11 | remove_priv_data_dir
12 |
--------------------------------------------------------------------------------
/priv/config.ini:
--------------------------------------------------------------------------------
1 | ;模式名(可省略.conf后缀)
2 | modeName='clnc_priv'
3 |
4 | ;clnc解析配置文件中域名的dnsIP, 只在启动的时候使用(一般留空智能选择, 只是部分域名有污染才需要自定义)
5 | clnc_dns=''
6 |
7 | ;免流Host(只在下载核心的时候用到,全局免流时的Host请在配置中设置)
8 | mlHost='dm.toutiao.com'
9 |
10 | ;自动重启数据(1开启)
11 | restartData='1'
12 |
13 | ;放行WiFi (1放行)
14 | allowWifi='0'
15 |
16 | ;放行IP(多个IP空格隔开)
17 | ;例子: allowIPs='10.0.0.0/8 8.8.8.8 fe80::1'
18 | allowIPs=''
19 |
20 | ;禁网内核,部分设备不禁网可能跳点大(1禁网, 2只禁内核TCP)
21 | denyKernel='2'
22 |
23 | ;ipv6选项 (allow/deny/denyNoKernel/proxy, allow放行, deny禁网, denyNoKernel除了内核都禁网, proxy代理)
24 | ;如果volte不可用就把volte关了,请勿反馈bug,有解决方案可以提出
25 | ipv6Opt='denyNoKernel'
26 |
27 | ;只代理应用(填uid或包名)
28 | onlyProxyApps=''
29 |
30 | ;应用全局放行(格式同上)
31 | localAllowApps=''
32 |
33 | ;放行应用udp, (格式同上) 默认放行全部端口
34 | ;格式:localUdpAllowApps='10001_80,8080 10022 10025_8000 com.qualcomm.qti.perfdump_80,8080 com.tencent.mtt'
35 | localUdpAllowApps='com.tencent.tmgp.sgame'
36 |
37 | ;放行应用tcp(格式同上)
38 | localTcpAllowApps=''
39 |
40 | ;只代理共享数据(1开启,本机数据会放行)
41 | onlyProxyShare=''
42 |
43 | ;共享放行udp端口 (留空关闭,多个端口空格隔开,连续端口用:连接,1:65535表示放行全部)
44 | ;格式:shareAllowUdpPorts='80 443:8080 666'
45 | shareAllowUdpPorts=''
46 |
47 | ;共享放行tcp端口 (格式同上)
48 | shareAllowTcpPorts=''
49 |
50 | ;共享全局放行 (1开启)
51 | shareAllow='0'
52 |
--------------------------------------------------------------------------------
/priv/addon/Volume-Key-Selector/README.md:
--------------------------------------------------------------------------------
1 | # Volume Key Selector - Addon that allows the use of the volume keys to select option in the installer
2 |
3 | ## Instructions:
4 | * Call chooseport whenever you want to call to use volume key check. The function returns true if user selected vol up and false if vol down. It'll wait 3 seconds for input by default
5 | Ex:
6 | ```
7 | if chooseport; then
8 | echo "true"
9 | else
10 | echo "false"
11 | fi
12 | ```
13 | * You can customize how many settings you want to wait for input. For example:
14 | * ```
15 | if chooseport 5; then
16 | echo "true"
17 | fi
18 | ```
19 | Will wait 5 seconds rather than the default of 3
20 | * If you want to use the bixby button on samsung galaxy devices, [check out this post here](https://forum.xda-developers.com/showpost.php?p=77908805&postcount=16) and modify the install.sh functions accordingly
21 |
22 | ## Notes:
23 | * Each volume key selector method will timeout after 3 seconds in the event of incompatibility or error
24 |
25 | ## Included Binaries/Credits:
26 | * [keycheck binary](https://github.com/sonyxperiadev/device-sony-common-init/tree/master/keycheck) compiled by me [here](https://github.com/Zackptg5/Keycheck)
27 |
--------------------------------------------------------------------------------
/priv/apk/com.tencent.tmgp.sgame.xml:
--------------------------------------------------------------------------------
1 |
2 |
32 |
--------------------------------------------------------------------------------
/priv/addon/Volume-Key-Selector/install.sh:
--------------------------------------------------------------------------------
1 | # External Tools
2 | chmod -R 0755 $MODPATH/priv/addon/Volume-Key-Selector/tools
3 |
4 | chooseport_legacy() {
5 | # Keycheck binary by someone755 @Github, idea for code below by Zappo @xda-developers
6 | # Calling it first time detects previous input. Calling it second time will do what we want
7 | [ "$1" ] && local delay=$1 || local delay=10
8 | local error=false
9 | while true; do
10 | timeout 0 $MODPATH/priv/addon/Volume-Key-Selector/tools/$ARCH32/keycheck
11 | timeout $delay $MODPATH/priv/addon/Volume-Key-Selector/tools/$ARCH32/keycheck
12 | local sel=$?
13 | if [ $sel -eq 42 ]; then
14 | return 0
15 | elif [ $sel -eq 41 ]; then
16 | return 1
17 | elif $error; then
18 | abort "未检测到音量键!"
19 | else
20 | error=true
21 | echo "未检测到音量键. 请重试"
22 | fi
23 | done
24 | }
25 |
26 | chooseport() {
27 | # Original idea by chainfire and ianmacd @xda-developers
28 | [ "$1" ] && local delay=$1 || local delay=10
29 | local error=false
30 | while true; do
31 | local count=0
32 | while true; do
33 | timeout $delay /system/bin/getevent -lqc 1 2>&1 > $TMPDIR/events &
34 | sleep 0.5; count=$((count + 1))
35 | if (`grep -q 'KEY_VOLUMEUP *DOWN' $TMPDIR/events`); then
36 | return 0
37 | elif (`grep -q 'KEY_VOLUMEDOWN *DOWN' $TMPDIR/events`); then
38 | return 1
39 | fi
40 | [ $count -gt 6 ] && break
41 | done
42 | if $error; then
43 | # abort "Volume key not detected!"
44 | echo "未检测到音量键. 检查按键方法"
45 | export chooseport=chooseport_legacy VKSEL=chooseport_legacy
46 | chooseport_legacy $delay
47 | return $?
48 | else
49 | error=true
50 | echo "未检测到音量键. 请重试"
51 | fi
52 | done
53 | }
54 |
55 | # Keep old variable from previous versions of this
56 | VKSEL=chooseport
57 |
--------------------------------------------------------------------------------
/priv/Core/download_core.sh:
--------------------------------------------------------------------------------
1 | #自带核心默认为linux arm64,大部分安卓机可以运行
2 | #其他系统无法运行则需要重新下载核心
3 |
4 |
5 | #是否下载体积更小的upx压缩版本,部分系统不支持(1开启)
6 | downloadUPX='1'
7 |
8 | #免流Host
9 | mlHost='dm.toutiao.com'
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | aotuGetAbi() {
19 | abi=`uname -m`
20 | if echo "$abi"|grep -Eq 'i686|i386'; then
21 | abi="386"
22 | elif echo "$abi"|grep -Eq 'armv7|armv6'; then
23 | abi="arm"
24 | elif echo "$abi"|grep -Eq 'armv8|aarch64'; then
25 | abi="arm64"
26 | elif echo "$abi"|grep -q 'mips64'; then
27 | shContent=`cat "$SHELL"`
28 | [ "${shContent:5:1}" = `echo $echo_e_arg "\x01"` ] && abi='mips64le' || abi='mips64'
29 | elif echo "$machine"|grep -q 'mips'; then
30 | shContent=`cat "$SHELL"`
31 | [ "${shContent:5:1}" = `echo $echo_e_arg "\x01"` ] && abi='mipsle' || abi='mips'
32 | else
33 | abi="amd64"
34 | fi
35 | }
36 |
37 | setDownloadTool() {
38 | export http_proxy='119.29.186.53:80'
39 | if type curl; then
40 | download_tool='curl -o'
41 | elif type wget; then
42 | download_tool="wget -O"
43 | else
44 | return 1
45 | fi &>/dev/null
46 | }
47 |
48 | installDownloadTool() {
49 | for PM in apt-get yum pacman pkg dnf; do
50 | type $PM && break
51 | done &>/dev/null
52 | $PM -y install wget curl 2>/dev/null
53 | }
54 |
55 | downloadCore() {
56 | host="$1"
57 | coreName="$2"
58 | helpFlag="$3"
59 | [ "$downloadUPX" = '1' ] && upxDir='upx'
60 | echo "$coreName($abi)下载中..."
61 | rm new$coreName 2>/dev/null
62 | $download_tool new$coreName --header 'Cute: pros.cutebi.flashproxy.cn' http://$host/$coreName/$upxDir/linux_$abi
63 | chmod 777 new$coreName
64 | if ./new$coreName -h 2>/dev/null | grep -q "$helpFlag"; then
65 | mv -f new$coreName $coreName
66 | fi &
67 | sleep 2
68 | if [ -f "/proc/$!/cwd/CuteBi" ]; then
69 | kill -9 $! 2>&-
70 | echo "$coreName($abi)下载或启动失败"
71 | echo "尝试下载非upx压缩的版本"
72 | downloadUPX='0'
73 | downloadCore "$host" "$coreName" "$helpFlag"
74 | elif [ -f "new$coreName" ]; then
75 | echo "$coreName($abi)下载或启动失败"
76 | else
77 | echo "$coreName($abi)下载成功"
78 | fi
79 | }
80 |
81 | cd "${0%/*}"
82 | aotuGetAbi
83 | if ! setDownloadTool; then
84 | installDownloadTool
85 | setDownloadTool || exec echo "系统必须有curl或者wget命令才可以下载!"
86 | fi
87 | if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
88 | downloadCore "$1" "$2" "$3"
89 | else
90 | downloadCore "$mlHost" clnc 'clnc'
91 | fi
92 |
--------------------------------------------------------------------------------
/priv/clnc_priv.conf:
--------------------------------------------------------------------------------
1 |
2 | #######UDP部分########
3 | httpUDP::udp {
4 | //如果搭建了cns服务器可以删除下面的//(尽量不要搭建443端口)
5 | //udp_socks5_listen = 0.0.0.0:1081
6 | //udp_tproxy_listen = 0.0.0.0:6650;
7 | //destaddr = 220.181.43.12:443;
8 | httpMod = tunnel;
9 | encrypt = 加密密码;
10 | header_host = 服务器IP:服务器端口;
11 | }
12 |
13 | tcp::Global {
14 | tcp_listen = :::6650;
15 | }
16 |
17 | //HTTPS模式
18 | httpMod::tunnel {
19 | del_line = host;
20 | set_first = "[M] [H] [V]\r\nHost: [H]\r\nX-T5-Auth: 1967948331\r\n";
21 | }
22 | //HTTP模式
23 | httpMod::http {
24 | del_line = host;
25 | set_first = "[M] http://[H_P][U] [V]\r\nHost: [H_P]\r\nX-T5-Auth: 1967948331\r\n";
26 | }
27 |
28 | tcpProxy::http_proxy {
29 | //HTTPS代理地址
30 | destaddr = 220.181.43.12:443;
31 | tunnelHttpMod = tunnel;
32 | tunnel_proxy = on;
33 | }
34 | tcpProxy::no_proxy {
35 | // 客户端原目标地址
36 | destaddr = original_dst;
37 | }
38 |
39 | //ssl端口先建立CONNECT连接
40 | tcpAcl::firstConnect {
41 | tcpProxy = no_proxy;
42 | matchMode = firstMatch;
43 | //读取数据后尝试匹配tcpAcl::http模块
44 | reMatch = priv_domains;
45 | }
46 | tcpAcl::priv_domains {
47 | tcpProxy = http_proxy;
48 |
49 | hdr_key(host) = (^|\.)priv\.igame\.qq\.com$;
50 | hdr_key(host) = (^|\.)forge\.speedtest\.cn$;
51 | hdr_key(host) = (^|\.)chaipip\.com$;
52 | hdr_key(host) = (^|\.)ip138\.com$;
53 | hdr_key(host) = (^|\.)ip38\.com$;
54 | hdr_key(host) = (^|\.)ipchaxun\.com$;
55 | }
56 |
57 | //其他请求使用CONNECT代理
58 | tcpAcl::CONNECT {
59 | tcpProxy = no_proxy;
60 |
61 | dst_port != 0;
62 | }
63 |
64 | dns::Global {
65 | dns_listen = :::6653;
66 | cachePath = /dev/null;
67 | }
68 | dnsAcl {
69 | httpMod = http;
70 | //HTTP代理地址
71 | destaddr = 220.181.43.12:443;
72 | header_host = 119.29.29.29;
73 | query_type = A;
74 | //query_type = AAAA;
75 | }
76 | dnsAcl {
77 | destaddr = 220.181.43.12:443;
78 | header_host = 39.106.194.18:44558;
79 | lookup_mode = tcpdns;
80 | tunnel_proxy = on;
81 | tunnelHttpMod = tunnel;
82 | }
83 |
84 | //用于接收socks5请求
85 | socks5::recv_socks5 {
86 | socks5_listen = 0.0.0.0:1081;
87 | socks5_dns = 127.0.0.1:6653;
88 | handshake_timeout = 60;
89 | }
90 |
91 | Tun {
92 | tunAddr4 = 10.0.0.1;
93 | tunAddr6 = fc00::1;
94 | tunMtu = 1500;
95 | tunDevice = tunDev;
96 | }
97 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 王者特权防异常 Magisk 模块
2 |
3 | ## 模块介绍
4 |
5 | 王者特权防异常模块,一目了然,是用于模拟特权的同学防异常使用。目前该模块包含功能:
6 |
7 | - [x] 启动王者时判断当前 IP 是不是指定地区的 IP,如果 IP 不对则自动关闭王者。
8 |
9 | > 特权异常的根源在于模拟的地区与登录IP不同,一般出现异常的情况有:
10 | >
11 | > - 1、异地模拟忘记开代理软件或代理软件无法正常工作
12 | > - 2、本地模拟使用数据流量 IP 飘到其他地区(本地模拟WiFi一般IP较为稳定)
13 | >
14 | > 如果出现上述情况没有采取措施直接登入游戏到大厅,那便导致异常。在游戏开启时判断情况不对劲直接关掉游戏,再根据实际情况采取相应措施。
15 | >
16 | > 这个需求源于我刚开始模拟时,因为怕异常每次上游戏都会用浏览器查下 IP,确认IP无误再登录游戏。后来我把这个需求用 xposed edge pro 实现,教其他人时总会有各种各样的问题,由此我才打算制作这样一个 Magisk 模块。
17 |
18 | - [x] 启动王者时自动启动代理软件
19 |
20 | - [x] 防换号异常
21 |
22 | > 玩小号的同学应该知道,一旦一个号出现异常,那么接下来换号也都会连续异常。该功能可以防止换号异常
23 |
24 | - [x] 关闭王者时自动冻结游戏
25 |
26 | > 对很多人来说这是个伪需求,有使用冰箱类软件的同学可以配合使用,其他同学请无视
27 |
28 | - [x] 关闭王者时自动冻结代理软件
29 |
30 | > 同上
31 |
32 | **升级 v0.8.0**之后使用默认 clnc 代理,可获取以下新特性:
33 |
34 | - [x] 自带代理,无需找他人购买代理 IP
35 | - [x] 防换区异常
36 | - [x] 防断线重连异常
37 | - [x] 防注销登录/换号异常
38 |
39 |
40 |
41 |
42 |
43 |
44 | ## 安装
45 |
46 | 下载压缩包通过 Magisk Manager 安装.
47 |
48 |
49 |
50 | ## 配置
51 |
52 | - 1、修改模拟的地区(判断IP的地区)
53 |
54 | 默认配置文件地区为空,此时不进行IP归属地判断,通过修改`/data/priv/config/local.config`文件内容更改地区。一般是:
55 |
56 | * 直辖市填写直辖市名称,如 **上海**、**北京**
57 | * 有县级市填写县级市名称,如 **长沙**
58 | * 上面2条都不是就写地级市
59 |
60 | > 不需要写“市”,不知道填什么的通过以下2个网站查询(代理的同学开启代理后再查询):
61 | >
62 | > https://ip.skk.moe/ (从国内查询(Sukka))
63 | >
64 | > https://www.speedtest.cn/tools/ip
65 |
66 | - 2、自动启动代理软件
67 |
68 | > 目前支持:
69 | >
70 | > * clnc
71 | >
72 | > * Kitsunebi
73 | > * v2rayNG
74 | >
75 | > 有其他软件需求的,有动手能力的同学可以自己修改。
76 |
77 | 使用MT管理器在 `/data/priv/` 路径下运行对应的 sh 文件即可。
78 |
79 | * clnc
80 |
81 | * Kitsunebi
82 |
83 | * v2rayNG
84 |
85 | * 其他(待添加)
86 |
87 |
88 |
89 | 代理软件不支持同时开启,配置优先级: ***clnc*** > ***Kitsunebi*** > ***v2rayNG*** > ***其他***
90 |
91 | * 3、关闭王者时自动冻结王者
92 |
93 | > 该功能其实就是杀后台,对于很多同学来说可能并不需要
94 |
95 | 手动在 `/data/priv/config/` 路径下添加文件 `freeze_self` 即可。
96 |
97 | 你也可以通过在控制台执行以下代码实现:
98 |
99 | ```shell
100 | touch /data/priv/config/freeze_self
101 | ```
102 |
103 | * 4、关闭王者时自动冻结代理软件
104 |
105 | > 这个说白了可能也是个伪需求,跟上面一样,我的代理软件是配合王者使用,平时用不到,我甚至不想在桌面上看到图标,所以有了这个功能
106 |
107 | 手动在 `/data/priv/config/` 路径下添加文件 `freeze_proxy_app` 即可。
108 |
109 | 你也可以通过在控制台执行以下代码实现:
110 |
111 | ```shell
112 | touch /data/priv/config/freeze_proxy_app
113 | ```
114 |
115 |
116 |
117 |
118 | ## 卸载
119 |
120 | 1. 通过 Magisk Manager 卸载模块.
--------------------------------------------------------------------------------
/priv/Core/watch.sh:
--------------------------------------------------------------------------------
1 | #!/system/bin/sh
2 |
3 | MODDIR=${0%/*}
4 | ip_site="https://forge.speedtest.cn/api/location/info"
5 | process_num_file="/data/priv/.system/.process_num"
6 | local_config="/data/priv/config/local.config"
7 | local_string="$(cat ${local_config})"
8 | proc_name="com.tencent.tmgp.sgame"
9 | kit_file="/data/priv/config/Kitsunebi"
10 | v2ray_file="/data/priv/config/v2rayNG"
11 | clnc_file="/data/priv/config/clnc"
12 | freeze_proxy_app="/data/priv/config/freeze_proxy_app"
13 | freeze_self="/data/priv/config/freeze_self"
14 | # process_num_log_file="/data/priv/.system/.process_num_log"
15 |
16 | validate_ip() {
17 | # 查询 IP
18 | find_ip="$(echo -e $(curl -s -m 10 ${ip_site}) | grep ${local_string})"
19 | if [ -n "${find_ip}" ]; then
20 | return 1
21 | fi
22 | return 0
23 | }
24 |
25 | start_proxy() {
26 | if [ -f "${clnc_file}" ]; then
27 | ${MODDIR}/CuteBi start >/dev/null 2>&1
28 | return 1
29 | elif [ -f "${kit_file}" ]; then
30 | pm enable fun.kitsunebi.kitsunebi4android >/dev/null 2>&1
31 | am start fun.kitsunebi.kitsunebi4android/.ui.StartVpnActivity >/dev/null 2>&1
32 | return 1
33 | elif [ -f "${v2ray_file}" ]; then
34 | pm enable com.v2ray.ang >/dev/null 2>&1
35 | am start "intent:#Intent;launchFlags=0x1000c000;component=com.v2ray.ang/.ui.ScSwitchActivity;end" >/dev/null 2>&1
36 | #am start com.v2ray.ang/.ui.ScSwitchActivity
37 | return 1
38 | fi
39 |
40 | return 0
41 | }
42 |
43 | handle_sgame_start() {
44 | local_string="$(cat ${local_config})"
45 | if [ ! -n "${local_string}" ]; then
46 | return 0
47 | fi
48 | # 验证IP,IP通过则不开启代理
49 | validate_ip
50 | ip_valid=$?
51 | if [ $ip_valid -eq 1 ]; then
52 | return 0
53 | fi
54 | # 开启代理
55 | start_proxy
56 | success_start_proxy=$?
57 | if [ $success_start_proxy -gt 0 ]; then
58 | sleep 8
59 | fi
60 | validate_ip
61 | ip_valid=$?
62 | if [ ! $ip_valid -eq 1 ]; then
63 | am force-stop com.tencent.tmgp.sgame
64 | fi
65 | }
66 |
67 | handle_sgame_stop() {
68 | freeze_proxy
69 | freeze_self
70 | delete_sgame_pref_file
71 | }
72 |
73 | freeze_proxy() {
74 | if [[ -f "${clnc_file}" ]]; then
75 | ${MODDIR}/CuteBi stop >/dev/null 2>&1
76 | elif [[ -f "$freeze_proxy_app" && -f "${kit_file}" ]]; then
77 | pm disable fun.kitsunebi.kitsunebi4android >/dev/null 2>&1
78 | elif [[ -f "$freeze_proxy_app" && -f "${v2ray_file}" ]]; then
79 | pm disable com.v2ray.ang >/dev/null 2>&1
80 | fi
81 | }
82 |
83 | freeze_self() {
84 | if [[ -f "$freeze_self" ]]; then
85 | pm disable com.tencent.tmgp.sgame >/dev/null 2>&1
86 | fi
87 | }
88 |
89 | delete_sgame_pref_file() {
90 | rm -rf /data/data/com.tencent.tmgp.sgame/shared_prefs/.xg.vip.settings.xml.xml
91 | rm -rf /data/data/com.tencent.tmgp.sgame/shared_prefs/device_id.vip.xml
92 | rm -rf /data/data/com.tencent.tmgp.sgame/shared_prefs/igame_priority_sdk_pref_temp_info.xml
93 | rm -rf /data/data/com.tencent.tmgp.sgame/shared_prefs/igame_priority_sdk_pref_wzry_info.xml
94 | rm -rf /data/data/com.tencent.tmgp.sgame/shared_prefs/tgpa.xml
95 | }
96 |
97 | start_service() {
98 | # 查询应用状态
99 | while true; do
100 | pre_process_num="$(cat ${process_num_file})"
101 | # 查询进程数
102 | process_num="$(ps -ef | grep -w ${proc_name} | grep -v grep | wc -l)"
103 | echo "${process_num}" >${process_num_file}
104 | # # 测试数据写入文件
105 | # if [ ${process_num} -gt ${pre_process_num} ]; then
106 | # echo $(date '+%Y-%m-%d %H:%M:%S') ":" ${pre_process_num} "/" ${process_num} >>"${process_num_log_file}"
107 | # fi
108 |
109 | if [[ ${process_num} -gt ${pre_process_num} && ${pre_process_num} -lt 4 ]]; then
110 | handle_sgame_start
111 | elif [[ ${process_num} -lt ${pre_process_num} && ${process_num} -le 2 ]]; then
112 | handle_sgame_stop
113 | fi
114 | if [ ${process_num} -le 2 ]; then
115 | sleep 1
116 | else
117 | sleep 5
118 | fi
119 | done
120 | }
121 |
122 | echo '0' >${process_num_file}
123 | echo 开始运行
124 | start_service
125 |
--------------------------------------------------------------------------------
/META-INF/com/google/android/update-binary:
--------------------------------------------------------------------------------
1 | #!/sbin/sh
2 |
3 | #################
4 | # Initialization
5 | #################
6 |
7 | umask 022
8 |
9 | # echo before loading util_functions
10 | ui_print() { echo "$1"; }
11 |
12 | require_new_magisk() {
13 | ui_print "*******************************"
14 | ui_print " Please install Magisk v20.0+! "
15 | ui_print "*******************************"
16 | exit 1
17 | }
18 |
19 | #########################
20 | # Load util_functions.sh
21 | #########################
22 |
23 | OUTFD=$2
24 | ZIPFILE=$3
25 |
26 | mount /data 2>/dev/null
27 |
28 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk
29 | . /data/adb/magisk/util_functions.sh
30 | [ $MAGISK_VER_CODE -lt 20000 ] && require_new_magisk
31 |
32 | if [ $MAGISK_VER_CODE -ge 20400 ]; then
33 | # New Magisk have complete installation logic within util_functions.sh
34 | install_module
35 | exit 0
36 | fi
37 |
38 | #################
39 | # Legacy Support
40 | #################
41 |
42 | TMPDIR=/dev/tmp
43 | PERSISTDIR=/sbin/.magisk/mirror/persist
44 |
45 | is_legacy_script() {
46 | unzip -l "$ZIPFILE" install.sh | grep -q install.sh
47 | return $?
48 | }
49 |
50 | print_modname() {
51 | local authlen len namelen pounds
52 | namelen=`echo -n $MODNAME | wc -c`
53 | authlen=$((`echo -n $MODAUTH | wc -c` + 3))
54 | [ $namelen -gt $authlen ] && len=$namelen || len=$authlen
55 | len=$((len + 2))
56 | pounds=$(printf "%${len}s" | tr ' ' '*')
57 | ui_print "$pounds"
58 | ui_print " $MODNAME "
59 | ui_print " by $MODAUTH "
60 | ui_print "$pounds"
61 | ui_print "*******************"
62 | ui_print " Powered by Magisk "
63 | ui_print "*******************"
64 | }
65 |
66 | # Override abort as old scripts have some issues
67 | abort() {
68 | ui_print "$1"
69 | $BOOTMODE || recovery_cleanup
70 | [ -n $MODPATH ] && rm -rf $MODPATH
71 | rm -rf $TMPDIR
72 | exit 1
73 | }
74 |
75 | rm -rf $TMPDIR 2>/dev/null
76 | mkdir -p $TMPDIR
77 |
78 | # Preperation for flashable zips
79 | setup_flashable
80 |
81 | # Mount partitions
82 | mount_partitions
83 |
84 | # Detect version and architecture
85 | api_level_arch_detect
86 |
87 | # Setup busybox and binaries
88 | $BOOTMODE && boot_actions || recovery_actions
89 |
90 | ##############
91 | # Preparation
92 | ##############
93 |
94 | # Extract prop file
95 | unzip -o "$ZIPFILE" module.prop -d $TMPDIR >&2
96 | [ ! -f $TMPDIR/module.prop ] && abort "! Unable to extract zip file!"
97 |
98 | $BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules
99 | MODULEROOT=$NVBASE/$MODDIRNAME
100 | MODID=`grep_prop id $TMPDIR/module.prop`
101 | MODNAME=`grep_prop name $TMPDIR/module.prop`
102 | MODAUTH=`grep_prop author $TMPDIR/module.prop`
103 | MODPATH=$MODULEROOT/$MODID
104 |
105 | # Create mod paths
106 | rm -rf $MODPATH 2>/dev/null
107 | mkdir -p $MODPATH
108 |
109 | ##########
110 | # Install
111 | ##########
112 |
113 | if is_legacy_script; then
114 | unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2
115 |
116 | # Load install script
117 | . $TMPDIR/install.sh
118 |
119 | # Callbacks
120 | print_modname
121 | on_install
122 |
123 | # Custom uninstaller
124 | [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh
125 |
126 | # Skip mount
127 | $SKIPMOUNT && touch $MODPATH/skip_mount
128 |
129 | # prop file
130 | $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop
131 |
132 | # Module info
133 | cp -af $TMPDIR/module.prop $MODPATH/module.prop
134 |
135 | # post-fs-data scripts
136 | $POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh
137 |
138 | # service scripts
139 | $LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh
140 |
141 | ui_print "- Setting permissions"
142 | set_permissions
143 | else
144 | print_modname
145 |
146 | unzip -o "$ZIPFILE" customize.sh -d $MODPATH >&2
147 |
148 | if ! grep -q '^SKIPUNZIP=1$' $MODPATH/customize.sh 2>/dev/null; then
149 | ui_print "- Extracting module files"
150 | unzip -o "$ZIPFILE" -x 'META-INF/*' -d $MODPATH >&2
151 |
152 | # Default permissions
153 | set_perm_recursive $MODPATH 0 0 0755 0644
154 | fi
155 |
156 | # Load customization script
157 | [ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh
158 | fi
159 |
160 | # Handle replace folders
161 | for TARGET in $REPLACE; do
162 | ui_print "- Replace target: $TARGET"
163 | mktouch $MODPATH$TARGET/.replace
164 | done
165 |
166 | if $BOOTMODE; then
167 | # Update info for Magisk Manager
168 | mktouch $NVBASE/modules/$MODID/update
169 | cp -af $MODPATH/module.prop $NVBASE/modules/$MODID/module.prop
170 | fi
171 |
172 | # Copy over custom sepolicy rules
173 | if [ -f $MODPATH/sepolicy.rule -a -e $PERSISTDIR ]; then
174 | ui_print "- Installing custom sepolicy patch"
175 | # Remove old recovery logs (which may be filling partition) to make room
176 | rm -f $PERSISTDIR/cache/recovery/*
177 | PERSISTMOD=$PERSISTDIR/magisk/$MODID
178 | mkdir -p $PERSISTMOD
179 | cp -af $MODPATH/sepolicy.rule $PERSISTMOD/sepolicy.rule || abort "! Insufficient partition size"
180 | fi
181 |
182 | # Remove stuffs that don't belong to modules
183 | rm -rf \
184 | $MODPATH/system/placeholder $MODPATH/customize.sh \
185 | $MODPATH/README.md $MODPATH/.git* 2>/dev/null
186 |
187 | #############
188 | # Finalizing
189 | #############
190 |
191 | cd /
192 | $BOOTMODE || recovery_cleanup
193 | rm -rf $TMPDIR
194 |
195 | ui_print "- Done"
196 | exit 0
197 |
--------------------------------------------------------------------------------
/customize.sh:
--------------------------------------------------------------------------------
1 | #!/sbin/sh
2 | #####################
3 | # Priv Protect Customization
4 | #####################
5 | SKIPUNZIP=1
6 |
7 | local_string="上海"
8 | lata_string="39.898217106627584,116.48663453546494,0,0,0,金牌-梦想加空间(北京大成国际社区)"
9 |
10 | # 删除旧版本配置
11 | ui_print "- 正在删除旧版本配置."
12 | rm -rf /data/priv
13 |
14 | # prepare execute environment
15 | ui_print "- 准备priv运行环境."
16 | mkdir -p /data/priv
17 | mkdir -p /data/priv/.system
18 | mkdir -p /data/priv/config
19 | touch /data/priv/.system/.process_num
20 |
21 | # 写入模拟地区
22 | echo "${local_string}" >/data/priv/config/local.config
23 | # 检查当前地区.sh
24 | cat >/data/priv/检查当前地区.sh </data/priv/修改模拟地区.sh </data/priv/config/local.config
34 | if
35 | EOF
36 | # 写入 Kitsunebi.sh
37 | cat >/data/priv/Kitsunebi.sh </data/priv/v2rayNG.sh </data/priv/clnc.sh <&2
57 | unzip -o "${ZIPFILE}" 'priv/config.ini' -d $MODPATH >&2
58 | unzip -o "${ZIPFILE}" 'priv/start.sh' -d $MODPATH >&2
59 | unzip -o "${ZIPFILE}" 'priv/stop.sh' -d $MODPATH >&2
60 | unzip -o "${ZIPFILE}" 'priv/test.sh' -d $MODPATH >&2
61 | unzip -o "${ZIPFILE}" 'priv/addon/*' -d $MODPATH >&2
62 | unzip -o "${ZIPFILE}" 'priv/Core/*' -d $MODPATH >&2
63 | unzip -j -o "${ZIPFILE}" 'service.sh' -d $MODPATH >&2
64 | unzip -j -o "${ZIPFILE}" 'uninstall.sh' -d $MODPATH >&2
65 |
66 | # Run addons
67 | if [ "$(ls -A $MODPATH/priv/addon/*/install.sh 2>/dev/null)" ]; then
68 | ui_print " "
69 | ui_print "- 安装插件 -"
70 | for i in $MODPATH/priv/addon/*/install.sh; do
71 | ui_print " 正在安装 $(echo $i | sed -r "s|$MODPATH/priv/addon/(.*)/install.sh|\1|")..."
72 | . $i
73 | done
74 | fi
75 |
76 | ui_print ""
77 | ui_print " 是否自动写入模拟信息? "
78 | ui_print " 音量+: 是 音量-: 否"
79 | ui_print ""
80 | if $VKSEL; then
81 | # 安装对话框取消模块
82 | if [ ! -n "$(pm list packages | grep com.mhook.dialog.beta)" ]; then
83 | ui_print "- 检测到未安装 对话框取消 模块"
84 | ui_print "- 解压 对话框取消 模块"
85 | unzip -j -o "${ZIPFILE}" 'priv/apk/dialog.apk' -d '/data/priv/apk' >&2
86 | ui_print "- 安装 对话框取消 模块"
87 | pm install /data/priv/apk/dialog.apk
88 | ui_print "- 清理 对话框取消 模块安装包"
89 | rm /data/priv/apk/dialog.apk
90 | else
91 | ui_print "- 检测到已安装 对话框取消 模块"
92 | fi
93 |
94 | # 安装 lataclysm 模块
95 | if [ ! -n "$(pm list packages | grep com.cataclysm.i)" ]; then
96 | ui_print "- 检测到未安装 lataclysm 模块"
97 | ui_print "- 解压 lataclysm 模块"
98 | unzip -j -o "${ZIPFILE}" 'priv/apk/lataclysm.apk' -d '/data/priv/apk' >&2
99 | ui_print "- 安装 lataclysm 模块"
100 | pm install /data/priv/apk/lataclysm.apk
101 | ui_print "- 清理 lataclysm 安装包"
102 | rm /data/priv/apk/lataclysm.apk
103 | else
104 | ui_print "- 检测到已安装 lataclysm 模块"
105 | fi
106 |
107 | # 写入模拟数据
108 | ui_print "- 启用对话框取消模块增强功能"
109 | unzip -j -o "${ZIPFILE}" 'priv/apk/digXposed.xml' -d '/data/data/com.mhook.dialog.beta/shared_prefs' >&2
110 | ui_print "- 写入WiFi模拟信息"
111 | unzip -j -o "${ZIPFILE}" 'priv/apk/com.tencent.tmgp.sgame.xml' -d '/data/data/com.mhook.dialog.beta/shared_prefs' >&2
112 | ui_print "- 写入定位模拟信息"
113 | if [ ! -f "/data/data/com.cataclysm.i/shared_prefs/com.cataclysm.i_preferences.xml" ]; then
114 | unzip -j -o "${ZIPFILE}" 'priv/apk/com.cataclysm.i_preferences.xml' -d '/data/data/com.cataclysm.i/shared_prefs' >&2
115 | fi
116 | sed -i "s/.*<\/string>/com\.tencent\.tmgp\.sgame<\/string>/g;s/.*<\/string>/0<\/string>/;s/.*<\/string>/${lata_string}<\/string>/" /data/data/com.cataclysm.i/shared_prefs/com.cataclysm.i_preferences.xml
117 | # 需要修改 lataclysm 及 对话框取消模块 的配置文件夹信息,否则会导致软件无法正常修改数据
118 | chmod 777 /data/data/com.cataclysm.i/shared_prefs/
119 | chmod 777 /data/data/com.mhook.dialog.beta/shared_prefs/
120 |
121 | ui_print "- 模拟信息已写入,请在xposed框架中启用“lataclysm”、“对话框取消beta版”模块"
122 | ui_print "- 如果你使用的是 LSPosed,请在模块作用域中勾选“王者荣耀”"
123 | else
124 | ui_print "- 不写入模拟信息 "
125 | fi
126 |
127 | # generate module.prop
128 | ui_print "- 生成 module.prop"
129 | rm -rf $MODPATH/module.prop
130 | touch $MODPATH/module.prop
131 | echo "id=sgame_priv" >$MODPATH/module.prop
132 | echo "name=王者特权防异常($local_string)" >>$MODPATH/module.prop
133 | echo -n "version=v0.8.0" >>$MODPATH/module.prop
134 | echo ${latest_v2ray_version} >>$MODPATH/module.prop
135 | echo "versionCode=20210913" >>$MODPATH/module.prop
136 | echo "author=ywlin" >>$MODPATH/module.prop
137 | echo "description=王者荣耀特权防异常模块,一键刷入无需配置。(源码地址: https://github.com/lyzcren/sgame_priv_protect#readme )" >>$MODPATH/module.prop
138 |
139 | set_perm_recursive $MODPATH 0 0 0755 0644
140 | set_perm $MODPATH/service.sh 0 0 0755
141 | set_perm $MODPATH/uninstall.sh 0 0 0755
142 | set_perm $MODPATH/priv/Core/watch.sh 0 0 0755
143 | set_perm $MODPATH/priv/start.sh 0 0 0755
144 | set_perm $MODPATH/priv/stop.sh 0 0 0755
145 | set_perm $MODPATH/priv/test.sh 0 0 0755
146 | set_perm $MODPATH/priv/Core/clnc 0 0 0755
147 | set_perm $MODPATH/priv/Core/CuteBi 0 0 0755
148 | set_perm $MODPATH/priv/Core/download_core 0 0 0755
149 | set_perm $MODPATH/priv/Core/MLBox 0 0 0755
150 | set_perm $MODPATH/priv/Core/busybox 0 0 0755
151 | set_perm /data/priv/Kitsunebi.sh 0 0 0755
152 | set_perm /data/priv/v2rayNG.sh 0 0 0755
153 | set_perm /data/priv/clnc.sh 0 0 0755
154 | set_perm /data/priv/检查当前地区.sh 0 0 0755
155 |
156 | rm -rf $MODPATH/priv/addon/
157 | ui_print "- 安装已完成"
158 |
--------------------------------------------------------------------------------
/priv/apk/com.cataclysm.i_preferences.xml:
--------------------------------------------------------------------------------
1 |
2 |
150 |
--------------------------------------------------------------------------------
/priv/Core/CuteBi:
--------------------------------------------------------------------------------
1 | ### Author: CuteBi ###
2 | #### Version: 1.0.1 ####
3 | ##### tun #####
4 |
5 | #联网检查
6 | networkCheck() {
7 | checkStatus() {
8 | checkVal="$1"
9 | checkName="$2"
10 | [ -z "$checkVal" ] && \
11 | echo -e "\r✘ $checkName联网失败 " || \
12 | echo -e "\r✔ $checkName联网成功 "
13 | }
14 | for lineNum in `stty size`; do :;done
15 | echo -n '正在测试DNS...'
16 | for ntpIP in `./MLBox -timeout=5 -dns="-qtype=A -domain=ntp.aliyun.com" | grep -v 'timeout'`; do break;done
17 | checkStatus "$ntpIP" 'DNS' true
18 | echo -n '正在测试HTTP...'
19 | httpsIP=`./MLBox -timeout=7 -http='http://182.254.116.116/d?dn=myip.ipip.net' 2>&1 | grep -Ev 'timeout|httpGetResponse'`
20 | checkStatus "$httpsIP" 'HTTP' true
21 | echo -n '正在测试HTTPS...'
22 | myIP=`./MLBox -timeout=7 -http="-url=https://myip.ipip.net/ -address=${httpsIP%%\;*}:443" 2>&1 | grep -Ev 'timeout|httpGetResponse'`
23 | checkStatus "$myIP" 'HTTPS' true
24 | echo -n '正在测试UDP...'
25 | currentTime=`./MLBox -timeout=5 -ntp="$ntpIP" | grep -v 'timeout'`
26 | checkStatus "$currentTime" 'UDP' false
27 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
28 | echo "$myIP"
29 | }
30 |
31 | #检查脚本更新
32 | checkUpdate() {
33 | echo -n '正在检测脚本更新...'
34 | version='1.0.1'
35 | changes=`./MLBox -timeout=7 -http="-address=119.29.186.53:80 -url=http://pros.cutebi.taobao69.cn/clncScript/Changes.php?version=$version" 2>/dev/null | grep -Ev 'timeout|httpGetResponse'`
36 | if [ -n "$changes" ]; then
37 | if echo "$changes" | grep -q 'no update'; then
38 | echo -e "\r✔ 当前脚本为最新版 "
39 | elif echo "$changes" | grep -q "^$version"; then
40 | echo -e "\r● 当前脚本非最新版 "
41 | cat <<-EOF
42 | $changes
43 | EOF
44 | fi
45 | else
46 | echo -e "\r✘ 检测脚本更新失败 "
47 | fi
48 | }
49 |
50 |
51 | #自动更新核心
52 | autoUpdataCores() {
53 | for coreInfo in 'clnc_clnc'; do
54 | coreName="${coreInfo%%_*}"
55 | helpFlag="${coreInfo#*_}"
56 | if ! ./$coreName -h 2>/dev/null | grep -q "$helpFlag"; then
57 | ./download_core.sh "$mlHost" "$coreName" "$helpFlag"
58 | fi
59 | done
60 | }
61 |
62 |
63 | #读取模式文件 得到所需内容
64 | readModeFile() {
65 | [ ! -f "../$modeName" -a -f "../${modeName}.conf" ] && modeName="${modeName}.conf"
66 | tunDevice=`grep '^ *tunDevice' "../$modeName" | grep -o '= *[^\;]*'`
67 | tunDevice=${tunDevice#=}
68 | }
69 |
70 | #通过包名得到uid
71 | getPackageUid() {
72 | packageName=${1%%_*} #过滤包名后面的端口
73 | if echo $packageName | grep -q '[A-Za-z]'; then
74 | packageInfo=`grep -oE "^$packageName ([0-9])+" /data/system/packages.list`
75 | [ $? != 0 ] && return 1
76 | echo "$1" | grep -qE '_([0-9])+' && \
77 | echo "${packageInfo#* }_${1#*_}" || \
78 | echo "${packageInfo#* }"
79 | else
80 | echo "$1"
81 | fi
82 | }
83 |
84 | #同时执行iptables和ip6tables
85 | ipts() {
86 | iptables $@
87 | ip6tables $@
88 | }
89 |
90 | #应用端口操作
91 | appsPortsAction() {
92 | [ -n "$1" ] && appProtocol="-p $1"
93 | apps="$2"
94 | jumpAction="$3"
95 | for app in $apps; do
96 | uid=`getPackageUid $app` || continue
97 | uid="${uid%_*}"
98 | ports=`echo $uid|grep -q '_' && echo "${uid#*_}"`
99 | ports="${ports//,/ }"
100 | if [ -z "$ports" ]; then
101 | ipts -t mangle -I TUN_OUTPUT $appProtocol -m owner --uid $uid -j $jumpAction
102 | [ "$app" != "$uid" ] && \
103 | grep -q "uid n=\"999${uid%_*}\"" '/data/system/appops.xml' && \
104 | ipts -t mangle -I TUN_OUTPUT $appProtocol -m owner --uid 999${uid} -j $jumpAction
105 | else
106 | for p in $appPorts; do
107 | ipts -t mangle -I TUN_OUTPUT $appProtocol --dport $p -m owner --uid $appUid -j $jumpAction
108 | [ "$app" != "$uid" ] && \
109 | grep -q "uid n=\"999${uid%_*}\"" '/data/system/appops.xml' && \
110 | ipts -t mangle -I TUN_OUTPUT $appProtocol -m owner --uid 999${uid} -j $jumpAction
111 | done
112 | fi
113 | done
114 | }
115 |
116 | #放行
117 | allowService() {
118 | #IP放行
119 | for ip in $allowIPs; do
120 | ipts -t mangle -I TUN_OUTPUT -d $ip -j ACCEPT
121 | ipts -t mangle -I TUN_PREROUTING -d $ip -j ACCEPT
122 | done 2>/dev/null #ipv6跟ipv4不兼容会提示错误
123 | #本地UDP放行
124 | appsPortsAction udp "$localUdpAllowApps" ACCEPT
125 | #本地TCP放行
126 | appsPortsAction tcp "$localTcpAllowApps" ACCEPT
127 | #本地全局放行
128 | appsPortsAction '' "$localAllowApps" ACCEPT
129 | #共享全局放行
130 | if [ "$shareAllow" = '1' ]; then
131 | ipts -t mangle -F TUN_PREROUTING
132 | else
133 | #共享UDP放行
134 | for p in $shareAllowUdpPorts; do
135 | ipts -t mangle -I TUN_PREROUTING -p udp --dport $p -j ACCEPT
136 | done
137 | #共享TCP放行
138 | for p in $shareAllowTcpPorts; do
139 | ipts -t mangle -I TUN_PREROUTING -p tcp --dport $p -j ACCEPT
140 | done
141 | fi
142 | }
143 |
144 | #配置主要ip[6]tables
145 | set_iptables() {
146 | ipts -t mangle -N TUN_OUTPUT 2>&-
147 | ipts -t mangle -N TUN_PREROUTING 2>&-
148 | #WiFi代理规则
149 | [ "$allowWifi" = '1' ] && \
150 | ipts -t mangle -A TUN_OUTPUT -o wlan+ -j ACCEPT || \
151 | #标记WiFi(WiFi的内网可能是192.168/16和fe80::/10)的DNS
152 | ipts -t mangle -A TUN_OUTPUT -o wlan+ -p 17 --dport 53 -j MARK --set-xmark 999
153 | ##开启只代理部分应用
154 | if [ -n "$onlyProxyApps" ]; then
155 | appsPortsAction '' "$onlyProxyApps" 'MARK --set-xmark 999'
156 | else
157 | ##本机规则
158 | grep -q 'conntrack' '/proc/net/ip_tables_matches' && \
159 | conntrackModule='conntrack --ctstate' || \
160 | conntrackModule='state --state'
161 | ipts -t mangle -A TUN_OUTPUT -o tun+ -j ACCEPT
162 | if [ "$denyKernel" = '1' -o "$denyKernel" = '2' ]; then
163 | [ "$denyKernel" = '2' ] && protocol='-p tcp'
164 | ipts -t mangle -A TUN_OUTPUT $protocol -m owner ! --uid 0-999999999 -j DROP || \
165 | ipts -t mangle -A TUN_OUTPUT $protocol -m owner ! --uid 0-99999 -j DROP #部分设备uid最大值为99999
166 | fi 2>/dev/null
167 | ipts -t mangle -A TUN_OUTPUT -m $conntrackModule NEW -j CONNMARK --set-xmark 999
168 | ipts -t mangle -A TUN_OUTPUT -m connmark --mark 999 -j CONNMARK --restore-mark
169 | ##共享规则
170 | ipts -t mangle -A TUN_PREROUTING -m $conntrackModule INVALID -j DROP
171 | ipts -t mangle -A TUN_PREROUTING -m $conntrackModule NEW -j CONNMARK --set-xmark 999
172 | ipts -t mangle -A TUN_PREROUTING -m connmark --mark 999 -j CONNMARK --restore-mark
173 | ipts -t mangle -I PREROUTING ! -i tun+ -g TUN_PREROUTING
174 | #共享的数据包在FORWARD放行
175 | ipts -I FORWARD -i tun+ -j ACCEPT
176 | ipts -I FORWARD -o tun+ -j ACCEPT
177 | fi
178 | if [ "$onlyProxyShare" != '1' ]; then
179 | iptables -t mangle -I OUTPUT ! -o lo ! -d 192.168/16 -m owner ! --gid 3004 -g TUN_OUTPUT
180 | ip6tables -t mangle -I OUTPUT ! -o lo ! -d fe80::/10 -m owner ! --gid 3004 -g TUN_OUTPUT
181 | fi
182 | #放行ipv6则清空ip6tables规则
183 | if [ "$ipv6Opt" = 'allow' ]; then
184 | ip6tables -t mangle -D PREROUTING ! -i tun+ -g TUN_PREROUTING
185 | ip6tables -t mangle -D OUTPUT ! -o lo ! -d fe80::/10 -m owner ! --gid 3004 -g TUN_OUTPUT
186 | elif [ "$ipv6Opt" = 'denyNoKernel' ]; then
187 | ip6tables -t mangle -F TUN_OUTPUT
188 | ip6tables -t mangle -A TUN_OUTPUT -m owner --uid 0-999999999 -j MARK --set-xmark 999 || \
189 | ip6tables -t mangle -A TUN_OUTPUT -m owner --uid 0-99999 -j MARK --set-xmark 999
190 | fi
191 | }
192 |
193 | #ip路由
194 | ip_route() {
195 | ip rule add fwmark 999 lookup 101 pref 99
196 | ip route add default dev $tunDevice table 101
197 | if [ "${ipv6Opt:0:4}" = 'deny' ]; then #禁网ipv6
198 | ip -6 rule add fwmark 999 unreachable pref 99
199 | elif [ "$ipv6Opt" != 'allow' ]; then #代理ipv6
200 | ip -6 rule add fwmark 999 lookup 101 pref 99
201 | ip -6 route add default dev $tunDevice table 101
202 | fi
203 | }
204 |
205 | #创建tun设备
206 | createTun() {
207 | echo 1 > /proc/sys/net/ipv4/ip_forward
208 | [ ! -e "/dev/net/tun" ] && mkdir -p /dev/net && ln -s /dev/tun /dev/net/tun
209 | }
210 |
211 | #clnc运行状态检测
212 | clncRunStatus() {
213 | if [ -f "/proc/$(grep -o ^[0-9]* clnc.pid)/cwd/CuteBi" ]; then
214 | echo '✔ clnc 正在运行'
215 | else
216 | echo '✘ clnc 没有运行'
217 | fi
218 | }
219 |
220 | #状态检查
221 | statusCheck() {
222 | ##网卡和IP检测
223 | ip addr | grep -E "^[0-9]+:|inet" | while read line; do
224 | if echo $line|grep -qE "^[0-9]+:"; then
225 | devName=`echo $line|grep -iE "^[0-9]+: [^:]+:"`
226 | devName=${devName#*: }
227 | devName=${devName%%:*}
228 | typeset -L17 devName=${devName%@*} 2>/dev/null
229 | else
230 | ipAddr=${line#* }
231 | ipAddr=${ipAddr%% *}
232 | echo "$devName$ipAddr"
233 | fi
234 | done
235 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
236 | echo
237 | clncRunStatus
238 | ipts -t mangle -N TUN_OUTPUT 2>&-
239 | ipts -t mangle -N TUN_PREROUTING 2>&-
240 | echo
241 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
242 | echo '❁ ipv4 mangle表 PREROUTING链:'
243 | iptables -t mangle -S PREROUTING
244 | echo '✺ ipv4 mangle表 TUN_PREROUTING链:'
245 | iptables -t mangle -S TUN_PREROUTING
246 | echo '❁ ipv4 filter表 FORWARD链:'
247 | iptables -S FORWARD
248 | echo '✺ ipv4 mangle表 OUTPUT链:'
249 | iptables -t mangle -S OUTPUT
250 | echo '❁ ipv4 mangle表 TUN_OUTPUT链:'
251 | iptables -t mangle -S TUN_OUTPUT
252 | echo
253 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
254 | echo '❁ ipv6 mangle表 PREROUTING链:'
255 | ip6tables -t mangle -S PREROUTING
256 | echo '✺ ipv6 mangle表 TUN_PREROUTING链:'
257 | ip6tables -t mangle -S TUN_PREROUTING
258 | echo '❁ ipv6 filter表 FORWARD链:'
259 | ip6tables -S FORWARD
260 | echo '✺ ipv6 mangle表 OUTPUT链:'
261 | ip6tables -t mangle -S OUTPUT
262 | echo '❁ ipv6 mangle表 TUN_OUTPUT链:'
263 | ip6tables -t mangle -S TUN_OUTPUT
264 | }
265 |
266 | #关闭脚本
267 | clearServer() {
268 | #关闭程序
269 | pid=`grep -o ^[0-9]* clnc.pid 2>/dev/null`
270 | [ -f "/proc/$pid/cwd/CuteBi" ] && kill $pid
271 | #清理ip路由规则
272 | {
273 | while ip rule del pref 99; do :;done
274 | while ip -6 rule del pref 99; do :;done
275 | while ipts -t mangle -D OUTPUT ! -o lo -m owner ! --gid 3004 -g TUN_OUTPUT; do :;done
276 | while ipts -t mangle -D PREROUTING ! -i tun+ -g TUN_PREROUTING; do :;done
277 | while iptables -t mangle -D OUTPUT ! -o lo ! -d 192.168/16 -m owner ! --gid 3004 -g TUN_OUTPUT; do :;done
278 | while ip6tables -t mangle -D OUTPUT ! -o lo ! -d fe80::/10 -m owner ! --gid 3004 -g TUN_OUTPUT; do :;done
279 | ipts -t mangle -F TUN_PREROUTING
280 | ipts -t mangle -F TUN_OUTPUT
281 | ipts -t mangle -Z TUN_PREROUTING
282 | ipts -t mangle -Z TUN_OUTPUT
283 | ipts -t mangle -X TUN_PREROUTING
284 | ipts -t mangle -X TUN_OUTPUT
285 | while ipts -D FORWARD -i tun+ -j ACCEPT; do :;done
286 | while ipts -D FORWARD -o tun+ -j ACCEPT; do :;done
287 | } 2>/dev/null
288 | }
289 |
290 | #启动脚本
291 | startServer() {
292 | readModeFile #读取模式文件
293 | createTun #创建tun
294 | clearServer #清理规则
295 | autoUpdataCores #自动更新核心
296 | set_iptables #设置ip[6]tables代理规则
297 | allowService #执行放行代码
298 | #启动clnc
299 | [ -n "$clnc_dns" ] && export CLNC_INIT_CONFIG_DNS="$clnc_dns"
300 | ./clnc -p clnc.pid -g 3004 -c "../$modeName"
301 | ip_route #ip路由
302 | ##重启数据
303 | if [ "$restartData" = '1' ]; then
304 | echo "关闭数据连接"
305 | svc data disable
306 | sleep 1
307 | echo "开启数据连接"
308 | svc data enable
309 | echo -n "等待数据网络恢复中..."
310 | while ./MLBox -timeout=4 -http="http://182.254.116.116/d?dn=ip.sb" | grep -q 'network is unreachable'; do sleep 1;done
311 | echo -e "\r网络已恢复 "
312 | fi 2>/dev/null
313 | }
314 |
315 | #ip[6]tables命令获取锁失败则重新执行
316 | aliasIptables() {
317 | iptables_path=`which iptables`
318 | ip6tables_path=`which ip6tables`
319 | if iptables --help | grep -q "\-w"; then
320 | iptables() { "${iptables_path:-/system/bin/iptables}" -w $@; }
321 | ip6tables() { "${ip6tables_path:-/system/bin/ip6tables}" -w $@; }
322 | else
323 | iptables() {
324 | result=`"${iptables_path:-/system/bin/iptables}" $@ 2>&1`
325 | [ "$?" = '4' ] && iptables $@ || echo -E "$result"|grep -qE 'xtables block|xtables_lock wait = [1-9]'
326 | }
327 | ip6tables() {
328 | result=`"${ip6tables_path:-/system/bin/ip6tables}" $@ 2>&1`
329 | [ "$?" = '4' ] && ip6tables $@ || echo -E "$result"|grep -qE 'xtables block|xtables_lock wait = [1-9]'
330 | }
331 | fi
332 | }
333 |
334 | #读取脚本配置文件
335 | readConfigFile() {
336 | eval "`grep -v '^\;' ../config.ini`" #ini文件;开头是注释
337 | }
338 |
339 | #脚本入口
340 | main() {
341 | cd "${1%/*}"
342 | chmod 777 *
343 | readConfigFile
344 | aliasIptables
345 | case "$2" in
346 | 'stop')
347 | clearServer
348 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
349 | clncRunStatus
350 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
351 | ;;
352 | 'start')
353 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
354 | startServer
355 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
356 | clncRunStatus
357 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
358 | networkCheck
359 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
360 | checkUpdate
361 | echo "✄┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄"
362 | ;;
363 | 'status')
364 | statusCheck
365 | ;;
366 | esac
367 | }
368 |
369 | main "$0" "$1" 2>&1
370 |
--------------------------------------------------------------------------------