├── 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 | 3 | 0.1.0 4 | 5 | 6 | 7 | 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 | 3 | 4 | 5 | 5000 6 | 0 7 | 363010502 8 | 9 | 10 | 11 | 12 | 13 | 121.46412677624558,31.210201274644124 14 | 15 | 16 | org.telegram.flychat 17 | com.github.kr328.clash 18 | com.huanchengfly.icebridge 19 | com.tencent.mobileqq 20 | 21 | 3.63.1.5 22 | MyDreamPlus 23 | 24 | 25 | 26 | 1 27 | 28 | 29 | 78:8a:20:d5:87:7b 30 | 31 | 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 | 3 | 39.154518,117.1624979,1,8448,13861389,LTE.46001.天津 4 | 22.4710887,114.2325552,1,12083,1360144,UMTS.46002.香港 5 | 47.6050256,-122.3325906,1,11316,22270979,LTE.310260.Seattle 6 | 0.0213 7 | 21.282789,-157.838115,1,50995,59340402,UMTS.310410.Hawaii.US 8 | 18.222367,109.517929,1,30040,30821,LTE.46000.三亚.Sanya 9 | 35.7024617,139.7756743,1,5126,34637569,LTE.44010.Akihabara.JP秋叶原 10 | 31.3041157,120.5771762,1,20502,59413,GSM.46000.苏州 11 | 30.2572138,120.1571063,1,22544,23108,GSM.46000.杭州 12 | 18.2393661,109.503304,1,30134,38491,GSM.46000.三亚 13 | 22.191605,113.5476005,1,5,75759,UMTS.45500.澳门 14 | 39.9529652,-75.1582597,1,290,137732777,LTE.310410.Philadelphia 15 | 32.7759609,-96.7966243,1,27196,133906719,LTE.310410.Dallas 16 | 29.9499845,-90.0722654,1,14981,46161680,LTE.310410.New Orleansi 17 | 25.7624186,-80.1910292,1,14126,174192407,UMTS.310410.Miami 18 | 33.7498583,-84.388197,1,4542,226004005,UMTS.310410.Atlanta 19 | 22.5435327,113.9298311,1,42303,24169270,UMTS.46001.深圳南山 20 | 22.502015,113.944986,1,9518,4095,GSM.46007.深圳 21 | 36.170154,-115.141128,1,36984,34209866,UMTS.310410.Las Vegas.US 22 | 49.2827299,-123.1206273,1,11001,28184576,LTE.302220.Vancouver.CA 23 | AT&T Mobility 24 | 25 | 41.815196,123.433914,1,12546,142,GSM.46020.沈阳 26 | CHINA MOBILE 27 | 28 | 21.2806326,-157.8353498,1,34052,128044561,LTE.310410.Hawaii 29 | 51.500858,-0.123904,1,1078,9694442,UMTS.23430.London 30 | 45.420585,-75.690088,1,11651,108210052,UMTS.302610.Ottawa 31 | -33.8567510,151.2154480,1,211,81997172,UMTS.50503.Sydney 32 | 33 | 34 | 31.259578,121.520117,1,43014,10909258,UMTS.46001.杨浦 35 | 39.9147927,116.4051005,1,4213,1473,GSM.46000.王府井 36 | com.tencent.tmgp.sgame 37 | 38 | 10.8224084,106.6269557,1,22122,953649,UMTS.45201.Ho Chi Minh City 39 | 35.0109376,135.7619013,1,24966,100915205,LTE.44010.Kyoto 40 | 41 | 42 | 22.5628140,114.1201749,0,0,0,WGS84 43 | 44 | 45 | 13.7542543,100.4981224,1,1007,10142862,UMTS.52000.Bangkok 46 | 35.68993,139.691735,1,12311,13138177,LTE.44000.Tokyo 47 | 35.179465,129.068641,1,57524,36850690,LTE.45006.Busan 48 | 35.184219,136.895067,1,16390,67131648,LTE.44010.Nagoya 49 | 34.7006363,135.4906176,1,24590,109646338,LTE.44010.Osaka 50 | 37.56477,126.973059,1,8657,61093668,UMTS.45005.Seoul 51 | 4 52 | 22.6267545,120.2948408,1,19803,184340503,LTE.46601.Kaohsiung 53 | 1 54 | 22.9773315,120.2168743,1,10611,40103733,UMTS.46692.台南 55 | 25.0087863,121.4510863,1,9313,21806865,UMTS.46601.新北 56 | 57 | 24.9928359,121.3074437,1,10311,20391037,UMTS.46692.桃园 58 | 25.0144506,121.4617964,1,12400,30254359,LTE.46692.Taipei 59 | 31.240449,121.495299,1,43041,11384361,UMTS.46001.Shanghai 60 | 22.15061,113.562939,1,5,66999,UMTS.45500.澳门 61 | 24.444741,118.062277,1,22817,51555,GSM.46001.鼓浪屿 62 | 1.3031525,103.8326179,1,22273,20551954,UMTS.52501.Singapore 63 | 22.2828260,114.1844500,1,11061,1634009,UMTS.45419.Hong Kong 64 | 22.1892048,113.5432028,1,15,35136,UMTS.45501.Macau 65 | 66 | 67 | 310410 68 | 46000 69 | 70 | 1 71 | 0 72 | 73 | 37.9843502,23.7282282,1,10700,13829117,UMTS.20210.Athens 74 | 1 75 | 44.786203,20.450899,1,21101,2972852,UMTS.22003.Belgrade 76 | 00:00:00:00:00:00 77 | 45.4642507,9.1865267,1,12035,6999348,LTE.22210.Milan 78 | 41.3837826,2.1771392,1,20551,14686860,UMTS.21401.Barcelona 79 | 1 80 | 45.436471,12.326216,1,24056,17510897,UMTS.22288.Venice 81 | 41.9027775,12.4883087,1,31009,45913,GSM.22210.Rome 82 | 55.953571,-3.189892,1,118,21464,GSM.23410.Edinburgh 83 | 51.9243418,4.477851,1,1511,13674390,UMTS.20416.Rotterdam 84 | 40.4187895,-3.6968005,1,12726,8326725,UMTS.21401.Madrid 85 | 48.864079,2.337015,1,12102,60471,UMTS.20810.Paris 86 | 0.0213 87 | -1 88 | 30.5605351,104.0719206,1,33289,100139142,LTE.46000.Chengdu 89 | 90 | 36.0705708,103.8479162,1,37647,46371074,LTE.46001.Lanzhou 91 | 92 | 30.582638,114.350363,1,28701,112819462,LTE.46000.Wuhan 93 | -1 94 | 29.5588121,106.5458651,1,13070,37318913,LTE.46000.Chongqing 95 | -1 96 | 34.3098899,108.9573969,1,37263,5111,GSM.46000.Xi'an 97 | 33.924419,18.4264968,1,10006,141569,LTE.65510.Cape Town 98 | 27.7727584,-82.6357666,1,13572,112594234,LTE.310120.St. Petersburg 99 | 41.802421,123.442341,1,16642,18204163,LTE.46001.Shenyang 100 | 28.617258,77.206099,1,159,30413,GSM.40411.New Delhi 101 | 55.7534749,37.6211223,1,6401,796170,UMTS.25001.Moscow 102 | 0 103 | 0 104 | 0 105 | 0.0213 106 | 0 107 | -34.6028689,-58.3778729,1,17101,23440517,UMTS.722310,Buenos Aires 108 | -33.4510388,-70.6686568,1,13002,20942,GSM.73001.Santiago 109 | 50.0755675,14.4366642,1,10105,25733388,UMTS.23001.Prague 110 | 55.6766077,12.5704451,1,2000,15472916,LTE.23801.Copenhagen 111 | CMCC 112 | 113 | 19.4201416,-99.1358415,1,11008,131606528,UMTS.334020.Mexico City 114 | AT&T 115 | 116 | 43.6522475,-79.3827667,1,10500,230142611,UMTS.302220.Toronto 117 | 0.07929953 118 | 39.898217106627584,116.48663453546494,0,0,0,金牌-梦想加空间(北京大成国际社区) 119 | -23.5503255,-46.6335152,1,40311,20402693,UMTS.72410.Sao Paulo 120 | 121 | -22.9067893,-43.1734775,1,2021,16927,GSM.72411.Rio de Janeiro 122 | 42.3615435,-71.0575847,1,1042,132534894,LTE.310410.Boston 123 | 42.8859464,-78.8782609,1,3337,206353942,LTE.310410.Buffalo 124 | cn 125 | us 126 | 127 | 2 128 | 2 129 | 52.369084,4.8940587,1,1019,10308,GSM.20416.Amsterdam 130 | 3 131 | 50.846599,4.353588,1,16100,17189888,LTE.20610.Brussels 132 | 133 | 0 134 | 52.078653,4.312026,1,130,22821,GSM.20416.The Hague 135 | 48.208889,16.373707,1,2010,7305909,UMTS.23210.Vienna 136 | 50.9381804,6.9602899,1,13801,26568705,LTE.26201.Cologne 137 | 46.2042654,6.1429464,1,10602,61725,GSM.20810.Geneva 138 | 47.376374,8.539913,1,1616,1063360,UMTS.22801.Zurich 139 | 140 | 21.292154,-157.852249,1,34052,59311485,LTE.310410.Honolulu 141 | 142 | 143 | 50.1125949,8.6830396,1,24051,26694145,LTE.26201.Frankfurt 144 | 145 | 52.520062,13.403802,1,20443,41633,GSM.26201.Berlin 146 | 147 | 148 | 149 | 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 | --------------------------------------------------------------------------------