's'
This commit is contained in:
62
rebuilt_app/scripts/adb_device_autosetup.sh
Normal file
62
rebuilt_app/scripts/adb_device_autosetup.sh
Normal 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 能 su(Magisk「超级用户」里给 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 su(Magisk 里可单独给「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
|
||||
37
rebuilt_app/scripts/adb_runtime_forensics.sh
Normal file
37
rebuilt_app/scripts/adb_runtime_forensics.sh
Normal 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"
|
||||
24
rebuilt_app/scripts/jadx_decompile_bundle.sh
Normal file
24
rebuilt_app/scripts/jadx_decompile_bundle.sh
Normal 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"
|
||||
72
rebuilt_app/scripts/ubuntu_gps_pipeline.sh
Normal file
72
rebuilt_app/scripts/ubuntu_gps_pipeline.sh
Normal 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"
|
||||
Reference in New Issue
Block a user