随身WiFi转短信服务器

大类
Android
Env
技术标签
云服务-白嫖
环境增强
原理研究-Android
逆向-Java
优先级
Medium
开始日期
Jan 15, 2023
状态
Maintaining
Public
Public
最后更新
Nov 2, 2023

前言

使用场景 - 境外卡保号

  • 例:Vodafone保活
    • 需180天消费一次,如发送一次短信
    • 180天充值一次
  • 根据我之前用CMlink的经验,我绝对会忘,所以我肯定得长期挂着

为什么要用随身WiFi做短信转发

  • 其他方案没法在卡多的情况下用
    • 手机:
      • 一个价格一般100左右,甚至更高
      • 体积大
      • 关屏的时候不好保活,长期充电容易过充
    • 树莓派:
      • 树莓派价格懂的都懂,模块价格也不低
    • 高档的随身WiFi(如华为)
      • 价格高
      • 固件不开放,无法远程控制
  • 随身WiFi的优点:
      1. 体积小:一个大号U盘
      1. 价格极低:(闲鱼20~30元不等,开车时则更便宜,可能会便宜到10~20元)

配置随身WiFi服务器

下面所有的相关文件均可在 https://github.com/NyaMisty/UFISmsTools 中下载

1. 随身WiFi购买

  • 建议通过闲鱼购买UFI001C或UFI003的板子,刷机资源多,可玩性高
    • 中芯微的方案虽然全网通,但不可以用ADB
    • 本文使用UFI001C

2. 基础系统配置

  • 安装Launcher:也有人叫6k桌面,在很多 “随身WiFi准备工具” 里面有
  • 连接WiFi, 启用互联网时间
    • 否则很多东西都用不了(因为TLS证书验证依赖于时间)
  • 禁用移动数据,避免高昂流量费
    • 经测试移动网络被关闭后不会自动启用
    • 经测试移动网络被关闭后热点仍然可用

3. 安装Magisk并去除原有服务

安装Magisk:教程有很多,不赘述了(如果是从咸鱼买,你可以让卖家帮你刷好)

  • 我用的是 “纸盒UFI系列全能刷机”
  • 直接在fastboot刷入我对应型号的boot.img就可以了
  • 刷完boot.img后装好Magisk apk即可
  • 配置Magisk
    • 连上WiFi,完整安装Magisk
    • 设置magisk自动允许root请求

删除原有服务

  • 删除/system/priv-app的cpeweb apk
    • adb shell里面跑
      • su mount -o remount,rw / mount -o remount,rw /system rm /system/priv-app/cpeweb.apk
  • (强迫症可选)删除/data/dalvik-cache的cpeweb odex

配置Xposed Dalvik Systemless

  • 下载并安装Xposed Installer 2.6.1
    • 这个版本支持4.4.4,并且安装包自带Xposed框架文件(新版需要链接官网下载,官网已经down)
  • 安装Xposed框架
    • 进入设置,切换安装方式为 Recovery 写入SD卡安装
      • notion image
        notion image
    • 然后安装xposed_dalvik这个Magisk模块
      • 需要安装我的魔改版,否则ARDC会由于linker的warning message出现异常,无法识别输出
      • adb push xposed_dalvik-mistymod.zip /sdcard adb shell su -c magisk --install-module /sdcard/xposed_dalvik-mistymod.zip
        notion image
    • 确认无误后,重启:adb reboot

解除系统云控(去除自动重启、自动飞行模式等)

  • 新版的随身WiFi大量出现云控、自动飞行模式等
  • 安装ElinkDisableMod.apk ,在Xposed中启用模块,然后重启即可
    • notion image
    • 如果有hook不完全的地方,也可以自己进一步魔改,hook更多的逻辑

4. 配置各种服务:短信转发、SSH、ADB

  • 配置短信转发:使用GitHub pppscn大佬的SmsForwarder
    • 安装:最新版因为Gradle原因无法在随身Wifi上面跑,目前降级Gradle的PR已经合并,等待新版发布
    • 配置:
      • 通用设置:转发短信&通话(来电提醒)、去除重复(4s)、开机自启、增强保活
      • 推送通道:必须使用https的通道,因为为了在Android4.4支持TLS1.2,pppscn做了很多黑魔法,HTTP不再可用
      • Frpc
        • 端口1是5000,短信转发自己的服务器
        • 端口2是2222,ssh的端口
        • 记住要在保存的时候勾选开机自启
  • 配置ADB:允许WiFi连接(或修改adb端口)
    • 原有端口可能并不是5555而是10242,可以用这个方法改一下方便记
    • su mount -o remount,rw / mount -o remount,rw /system setprop persist.adb.tcp.port 5555
 

5. 配置Magisk自启动脚本:自动开启WiFi脚本

  • 在/data/adb/service.d下面创建脚本(adb push传进去),并chmod 755
  • enable_wifi.sh:在系统启动后自动打开WiFi,如果1分钟内都没有连接到则切换到热点状态
    • 有些厂商脑子有问题,使用的是模拟点击的方法来启动热点,所以新版脚本加入了循环启动WiFi的逻辑
    • #!/system/bin/sh LOGF=/data/adb/enable_wifi.log rm -f $LOGF echo "Env info:" >> $LOGF export >> $LOGF SVC=/system/bin/svc wifiMode() { if [ -z $1 ]; then echo "Enabling Wifi..." fi $SVC data disable # avoid expensive data usage! service call wifi 29 i32 0 i32 0 # name=null, enable=false service call connectivity 40 i32 0 $SVC wifi enable $SVC wifi prefer } tetherMode() { echo "Enabling Tether..." $SVC data disable # avoid expensive data usage! $SVC wifi disable service call wifi 29 i32 0 i32 1 # name=null, enable=true service call connectivity 40 i32 1 # usb tether enable } checkWifi() { if ip a show wlan0 | grep inet | grep -v "scope link" | grep -v "169.254" >/dev/null; then echo "Has WiFi IP" return 0 else echo "No WiFi IP" return 1 fi } keepWifi() { while true; do wifiMode quiet sleep 2 done } mainFunc() { set -x if [ -z "$DEBUG" ]; then echo "Waiting for bootup!" sleep 60 fi for i in $(busybox seq 1 20); do # 1min not connected then go hotspot wifiMode; if checkWifi; then echo "Wifi Connected, good to go!" keepWifi & break fi if [ $i = 20 ]; then echo "Failed to connect to WiFi! Going to tether mode!" tetherMode; break fi sleep 3 done echo "Updating clock!" for i in $(busybox seq 1 20); do am broadcast -a android.intent.action.NETWORK_SET_TIME -f 536870912 sleep 2 done set +x fg } mainFunc >> $LOGF 2>&1
  • autorestart_adb.sh:每5分钟重启一次adbd,避免WiFi连接闪断后,adb一直offline连不进来(一直提示offline,disconnect也没用)
    • 配合这个脚本,出现offline时adb kill-server后再connect就行
    • #!/system/bin/sh while true; do sleep 300 # 5min adb keep alive setprop ctl.restart adbd done
 

踩坑随记(我干了啥)

不用ARDC,基于screencap和input tap强行启用magisk

把随身WiFi连上ARDC

  • 找出随身wifi在我笔记本上连不上的原因
  • 找出随身wifi一直重启的原因
    • TypeC的问题
 

清除原有的服务

  • 原有服务是cpeweb,会自启动、强行全屏
  • 尝试pm disable,Launcher选择里面没有他了,但是service还在
  • 最后发现是system app,mount rw后删除即可
 

配置随身WiFi短信转发

  • Android 4.4报VerifyError
  • Android 4.4要么没法用TLS,要么没法用HTTP
  • 我的推送WebHook在CF上,手机不好开代理,用nginx配了一个走梯子的CF转发

让随身Wifi不自动开启热点

  • 寻找WiFi自动打开的位置
    • logcat中定位,发现setWifiEnabled提示均来自system_server进程
    • 去rootfs中全局搜索找setWifiEnabled,发现除了cpeweb就是在frameworks里
  • 在Frameworks里面找Wifi开启逻辑
    • APKDB的工具没法直接把odex合并回dex
    • 但frameworks里面还有jar,jar随便选了几个小的出来看发现是一样的
    • 直接把所有jar提出来,用jadx打开,全局搜索发现在WifiManager初始化的时候会有个ElongXXX的Task,在里面会禁用WiFi并启用热点
  • 由于嵌入在Framework里面,没法简单改
    • 决定保留这段逻辑,然后在他跑完之后改
    • 在启动后等待一段时间让他启动完成, 随后自动启用Wifi 如果WiFi一直链接失败(获取不到IP),则切换回热点模式
 

让随身WiFi自动设置时间

  • 打开设置中对应开关
  • 手动发送更新广播
 

随身WIFI的SSH服务器

  • 勾选自启动,配好密码