#!/usr/bin/env bash
# ==============================================================================
# phantom_frida_keepalive.sh — Phantom-Frida 保活守护（FS-6）
#
# 背景：微信 8.0.69 反检测会间歇 kill frida-server，导致 Hook 掉线、开发中断。
# 本守护在 Mac 主机循环检查设备端 Phantom-Frida 进程，死了就用 Root 重起，
# 并触发 Agent 重连（可选）。不依赖手机端 Termux。
#
# 用法：
#   nohup bash phantom_frida_keepalive.sh xgfe65eimrrofyws > logs/phantom_keepalive.log 2>&1 &
# ==============================================================================
set -uo pipefail

SERIAL="${1:-xgfe65eimrrofyws}"
CFG="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/anti_detect/phantom_frida_config.json"
BIN_PATH="$(python3 -c "import json;print(json.load(open('$CFG'))['binary_path'])" 2>/dev/null || echo /data/local/tmp/fs_8e6b0b)"
BIN_NAME="$(basename "$BIN_PATH")"
PORT="$(python3 -c "import json;print(json.load(open('$CFG'))['listen_port'])" 2>/dev/null || echo 24781)"
INTERVAL="${KEEPALIVE_INTERVAL:-12}"

echo "[keepalive] serial=$SERIAL bin=$BIN_PATH port=$PORT (前台持有模式)"

# 前台持有模式：Mac 端阻塞运行 frida（adb shell 持有连接 → 子进程不收 SIGHUP）。
# 实测 `su -c 'nohup X &'` 后台化在本机型失效，前台持有最可靠；frida 被杀则循环重连。
while true; do
  # 清理可能的端口占用残留（旧 frida-server / TIME_WAIT 实例）
  adb -s "$SERIAL" shell "su -c 'pidof $BIN_NAME | xargs -r kill -9'" 2>/dev/null
  echo "[keepalive $(date '+%H:%M:%S')] 前台启动 Phantom-Frida..."
  # 阻塞：frida 活着则此行一直挂起；退出（被杀/崩溃）才返回
  adb -s "$SERIAL" shell "su -c '$BIN_PATH -l 0.0.0.0:$PORT'" 2>&1
  echo "[keepalive $(date '+%H:%M:%S')] Phantom-Frida 退出，${INTERVAL}s 后重连..."
  sleep "$INTERVAL"
done
