This commit is contained in:
eric
2026-04-05 01:00:07 -05:00
parent b94c00fe56
commit 4bd5a33d3a
2607 changed files with 137903 additions and 92 deletions

View File

@@ -0,0 +1,62 @@
#!/usr/bin/env bash
# 安装后尽量全自动:权限、模拟位置 appops/settings、冷启动不依赖人手点设置
# 用法: adb_device_autosetup.sh <adb_serial>
set +e
S="${1:?serial required}"
MAIN=com.lerist.fakelocation
XP=com.lerist.fakelocation.common.xposed
A() { adb -s "$S" "$@" 2>/dev/null; }
grant_main() {
A shell pm grant "$MAIN" android.permission.ACCESS_FINE_LOCATION
A shell pm grant "$MAIN" android.permission.ACCESS_COARSE_LOCATION
A shell pm grant "$MAIN" android.permission.READ_PHONE_STATE
A shell pm grant "$MAIN" android.permission.POST_NOTIFICATIONS
A shell pm grant "$MAIN" android.permission.NEARBY_WIFI_DEVICES
A shell pm grant "$MAIN" android.permission.ACCESS_WIFI_STATE
A shell pm grant "$MAIN" android.permission.CHANGE_WIFI_STATE
}
mock_location_ops() {
A shell appops set "$MAIN" android:mock_location allow
A shell cmd appops set "$MAIN" android:mock_location allow
# 部分 ROM
A shell appops set "$MAIN" mock_location allow
A shell settings put secure mock_location_app "$MAIN"
A shell settings put secure mock_location 1
}
# 若 adb shell 能 suMagisk「超级用户」里给 shell/root 或 adb root
mock_location_su() {
A shell su -c "settings put secure mock_location_app $MAIN"
A shell su -c "appops set $MAIN android:mock_location allow"
A shell su -c "cmd appops set $MAIN android:mock_location allow"
A shell su 0 settings put secure mock_location_app "$MAIN"
A shell su 0 appops set "$MAIN" android:mock_location allow
}
echo "== adb_device_autosetup: grants + mock_location ($S) =="
echo "-- pm path --"
A shell pm path "$MAIN"
A shell pm path "$XP"
grant_main
mock_location_ops
mock_location_su
A shell am force-stop "$XP"
A shell am force-stop "$MAIN"
echo "== cold start + logcat tail (FakeLocation / FLXposed) =="
A logcat -c
A shell am start -W -n "$MAIN/.MainActivity"
sleep 2
A logcat -d -t 250 | grep -iE 'fakelocation|FLXposed|lerist|MockState|AndroidRuntime' | tail -80 || true
echo "== adb shell suMagisk 里可单独给「ADB」或 shell root与应用内 root 无关)=="
adb -s "$S" shell su -c id || adb -s "$S" shell su 0 id || echo "(本机 adb shell 未 root — 已尽量写 appops应用内弹 Magisk 仍正常)"
echo "== Xposed / LSPosed 管理器包名(模块需在管理器里启用一次;无公开稳定 adb API=="
adb -s "$S" shell pm list packages 2>/dev/null | grep -iE 'org\.lsposed|lsposed\.manager|edxposed|xposed\.installer|de\.robv\.android\.xposed' || echo "(未列出常见管理器)"
exit 0

View File

@@ -0,0 +1,37 @@
#!/usr/bin/env bash
# 运行时取证截图、dumpsys、logcat、在 su 可用时扫 Magisk/LSPosed/应用私有目录
# 用法: adb_runtime_forensics.sh <serial> <OUT_DIR>
set +e
S="${1:?serial}"
OUT="${2:?OUT_DIR}"
TS="$(date +%Y%m%d_%H%M%S)"
D="$OUT/runtime_dump_$TS"
mkdir -p "$D"
A() { adb -s "$S" "$@" 2>/dev/null; }
echo "runtime forensics -> $D"
A exec-out screencap -p >"$D/screen.png" || A shell screencap -p >"$D/screen_alt.png"
A shell dumpsys package com.lerist.fakelocation >"$D/dumpsys_package_main.txt"
A shell dumpsys package com.lerist.fakelocation.common.xposed >"$D/dumpsys_package_xposed.txt" || true
A shell dumpsys meminfo com.lerist.fakelocation >"$D/dumpsys_meminfo_main.txt"
A logcat -d -t 500 >"$D/logcat_tail.txt"
A shell dumpsys activity activities 2>&1 | tail -200 >"$D/dumpsys_activity_tail200.txt" || true
A shell cmd activity top -n 1 >"$D/activity_top.txt" || true
# —— 以下需设备 root + su 对 adb shell 放行(或仅记录失败)——
A shell su -c "id" >"$D/su_id.txt" 2>&1
A shell su -c "magisk -v" >"$D/magisk_version.txt" 2>&1
A shell su -c "magisk --path" >"$D/magisk_path.txt" 2>&1
A shell su -c "ls -la /data/adb" >"$D/data_adb_ls.txt" 2>&1
A shell su -c "ls -la /data/adb/modules" >"$D/magisk_modules_ls.txt" 2>&1
A shell su -c "for p in /data/adb/lspd /data/misc/lsposed /data/adb/modules/zygisk_lsposed; do echo ==== \$p ====; ls -la \"\$p\" 2>&1; done" >"$D/lsposed_related_ls.txt" 2>&1
for PKG in com.lerist.fakelocation com.lerist.fakelocation.common.xposed; do
A shell su -c "find /data/data/$PKG -maxdepth 4 -type f 2>/dev/null | head -200" >"$D/find_${PKG//./_}.txt" 2>&1
A shell su -c "ls -la /data/data/$PKG/databases 2>/dev/null" >"$D/db_ls_${PKG//./_}.txt" 2>&1
done
echo "done $D"
echo "$D"

View File

@@ -0,0 +1,24 @@
#!/usr/bin/env bash
# 用 jadx 反编译 OUT 目录下的重建双包 +(若存在)商店拉取的原版包
# 用法: jadx_decompile_bundle.sh <OUT_DIR>
set +e
OUT="${1:?OUT_DIR}"
[[ -d "$OUT" ]] || exit 1
command -v jadx >/dev/null 2>&1 || { echo "jadx not installed (apt install jadx)"; exit 0; }
JROOT="$OUT/jadx"
mkdir -p "$JROOT"
run_jadx() {
local apk="$1" name="$2"
[[ -f "$apk" ]] || return 0
echo "jadx -> $JROOT/$name"
rm -rf "$JROOT/$name"
jadx -d "$JROOT/$name" --show-bad-code --quiet "$apk" || echo "(jadx failed for $name)"
}
run_jadx "$OUT/fakelocation-gps-debug.apk" "rebuilt_main"
run_jadx "$OUT/FL-Xposed-gps-debug.apk" "rebuilt_xposed"
run_jadx "$OUT/original_com_lerist_fakelocation_base.apk" "original_store_main"
echo "jadx roots under $JROOT"

View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
# 在 Ubuntu 上于工程根目录执行:提取设备上已装原版 APK、编译 gps-only 双包、可选安装到 USB 机
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
OUT="${GPS_ARTIFACT_DIR:-$HOME/gps_build_artifacts}"
export ANDROID_HOME="${ANDROID_HOME:-$HOME/android-sdk}"
if [[ -d /usr/lib/jvm/java-17-openjdk-amd64 ]]; then
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
fi
mkdir -p "$OUT"
cd "$ROOT_DIR"
chmod +x ./gradlew 2>/dev/null || true
chmod +x ./scripts/*.sh 2>/dev/null || true
./gradlew :app:assembleDebug :fl_xposed:assembleDebug --no-daemon
cp -f app/build/outputs/apk/debug/app-debug.apk "$OUT/fakelocation-gps-debug.apk"
cp -f fl_xposed/build/outputs/apk/debug/fl_xposed-debug.apk "$OUT/FL-Xposed-gps-debug.apk"
pick_serial() {
adb devices | awk 'NR>1 && $2=="device" && $1 !~ /^emulator/ && $1 !~ /^127/ && $1 !~ /^localhost/ {print $1; exit}'
}
SERIAL="$(pick_serial)"
if [[ -n "${SERIAL}" ]]; then
# 与商店版/其他签名冲突时必须先卸再装
adb -s "$SERIAL" uninstall com.lerist.fakelocation 2>/dev/null || true
adb -s "$SERIAL" uninstall com.lerist.fakelocation.common.xposed 2>/dev/null || true
adb -s "$SERIAL" install -r "$OUT/fakelocation-gps-debug.apk"
adb -s "$SERIAL" install -r "$OUT/FL-Xposed-gps-debug.apk"
for PKG in com.lerist.fakelocation com.lerist.fakelocation.rebuilt com.lerist.fakelocation.rebuilt.debug; do
LINE="$(adb -s "$SERIAL" shell pm path "$PKG" 2>/dev/null | head -1 | tr -d '\r' || true)"
if [[ -n "$LINE" && "$LINE" == package:* ]]; then
APK="${LINE#package:}"
SAFE="${PKG//./_}"
adb -s "$SERIAL" pull "$APK" "$OUT/original_${SAFE}_base.apk" || true
unzip -l "$OUT/original_${SAFE}_base.apk" 2>/dev/null | head -50 > "$OUT/original_${SAFE}_listing.txt" || true
fi
done
bash "$ROOT_DIR/scripts/adb_device_autosetup.sh" "$SERIAL"
else
echo "No USB/device serial found; skipped adb install/pull."
fi
# 可选GPS_JADX_REFERENCE=1 仅反编译拉取的原版包(与 CODEX_PIPELINE 并存时由后者覆盖完整 jadx 目录)
if [[ "${GPS_JADX_REFERENCE:-0}" == "1" && "${CODEX_PIPELINE:-0}" != "1" ]]; then
if command -v jadx >/dev/null 2>&1; then
for f in "$OUT"/original_com_lerist_fakelocation_base.apk; do
[[ -f "$f" ]] || continue
JOUT="$OUT/jadx_original_fakelocation"
rm -rf "$JOUT"
echo "Running jadx -> $JOUT"
jadx -d "$JOUT" --show-bad-code --quiet "$f" || true
done
else
echo "GPS_JADX_REFERENCE=1 but jadx not found (e.g. sudo apt install jadx)"
fi
fi
# Codex 式:双 APK jadx + 连接真机时运行时截图/dumpsys/内存摘要/logcat/Magisk&LSPosed 路径/私有数据枚举
if [[ "${CODEX_PIPELINE:-0}" == "1" ]]; then
bash "$ROOT_DIR/scripts/jadx_decompile_bundle.sh" "$OUT"
if [[ -n "${SERIAL}" ]]; then
bash "$ROOT_DIR/scripts/adb_runtime_forensics.sh" "$SERIAL" "$OUT"
else
echo "CODEX_PIPELINE: no adb serial, skipped runtime forensics"
fi
fi
ls -la "$OUT"
echo "Done. APKs in $OUT"