From 5378a34f58069223c806d16bbfda9ea4ade5d408 Mon Sep 17 00:00:00 2001 From: mars <3361409208@qq.com> Date: Tue, 4 Aug 2026 12:26:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(tng):=20=E4=BF=AE=E5=A4=8D=E5=8C=BA?= =?UTF-8?q?=E5=8F=B7=E9=A1=B5=20HWUI=20=E9=97=AA=E9=80=80=E5=B9=B6?= =?UTF-8?q?=E6=94=BE=E8=A1=8C=20Compose=20HW=20=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拦截 HardwareRenderer.setName,校验/缓存 libandroid.so,避免软件绘制撞 hardware bitmap;附带 Money Packet hook 与 mitm 脚本。 --- debug-server/tng_mmp_mitm_addon.py | 137 +++++ magisk-modules/tng_exit_guard/jni/main.cpp | 435 +++++++++++-- .../tng_exit_guard/zygisk/arm64-v8a.so | Bin 194640 -> 194640 bytes scripts/start-tng-mitm.ps1 | 41 ++ .../smsmessage/xposed/HookBridge.java | 1 + .../smsmessage/xposed/MainHook.java | 2 + .../xposed/hook/TngMoneyPacketHook.java | 579 ++++++++++++++++++ .../xposed/hook/TngRootBypassHook.java | 275 +++++++-- 8 files changed, 1394 insertions(+), 76 deletions(-) create mode 100644 debug-server/tng_mmp_mitm_addon.py create mode 100644 scripts/start-tng-mitm.ps1 create mode 100644 xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngMoneyPacketHook.java diff --git a/debug-server/tng_mmp_mitm_addon.py b/debug-server/tng_mmp_mitm_addon.py new file mode 100644 index 0000000..d43cfcb --- /dev/null +++ b/debug-server/tng_mmp_mitm_addon.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +""" +mitmproxy 插件:自动保存 TNG Money Packet 含 receiverList 的 API 响应。 + +用法: + mitmdump -s debug-server/tng_mmp_mitm_addon.py -p 8888 + 或 + mitmweb -s debug-server/tng_mmp_mitm_addon.py -p 8888 + +手机 WiFi 代理 -> PC_IP:8888,安装 mitmproxy CA 后打开 TNG 红包 Leaderboard。 +命中响应会打印到终端,并写入 reverse/dumps/mitm_mmp/ +""" + +from __future__ import annotations + +import json +import os +import re +from datetime import datetime + +from mitmproxy import ctx, http + +OUTPUT_DIR = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "reverse", + "dumps", + "mitm_mmp", +) + +MMP_HINTS = ( + "receiverlist", + "claimedamount", + "mmpreceiver", + "moneypacket", + "merchantmoneypacket", +) + +HOST_HINTS = ( + "ebuckler.com", + "tngdigital.com", + "alipaydev.com", +) + + +def _ensure_dir() -> None: + os.makedirs(OUTPUT_DIR, exist_ok=True) + + +def _looks_like_mmp(body: str) -> bool: + lower = body.lower() + if any(h in lower for h in MMP_HINTS): + return True + return "mmp" in lower and "amount" in lower + + +def _extract_receiver_list(obj): + """递归找 receiverList 并格式化为 [(nickname, amount), ...]""" + rows = [] + + def walk(node): + if isinstance(node, dict): + if "receiverList" in node and isinstance(node["receiverList"], list): + for item in node["receiverList"]: + if not isinstance(item, dict): + continue + name = ( + item.get("nickName") + or item.get("displayName") + or item.get("userName") + or item.get("receiverName") + or item.get("name") + ) + amount = ( + item.get("claimedAmount") + or item.get("receiveAmount") + or item.get("amount") + ) + if name and amount is not None: + rows.append((str(name), str(amount))) + for v in node.values(): + walk(v) + elif isinstance(node, list): + for v in node: + walk(v) + + walk(obj) + return rows + + +class TngMmpCapture: + def __init__(self) -> None: + _ensure_dir() + self.count = 0 + ctx.log.info(f"TNG MMP capture -> {OUTPUT_DIR}") + + def response(self, flow: http.HTTPFlow) -> None: + if flow.response is None or not flow.response.content: + return + host = (flow.request.host or "").lower() + if not any(h in host for h in HOST_HINTS): + return + try: + text = flow.response.get_text(strict=False) + except Exception: + return + if not text or not _looks_like_mmp(text): + return + + self.count += 1 + ts = datetime.now().strftime("%Y%m%d_%H%M%S") + safe_host = re.sub(r"[^\w.-]", "_", host)[:40] + path = os.path.join(OUTPUT_DIR, f"mmp_{ts}_{self.count}_{safe_host}.json") + + summary_lines = [ + f"[TNG-MMP #{self.count}] {flow.request.method} {flow.request.url}", + ] + try: + data = json.loads(text) + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + rows = _extract_receiver_list(data) + if rows: + summary_lines.append(f" receiverList ({len(rows)} 条):") + for name, amount in rows: + summary_lines.append(f" {name} -> {amount}") + else: + summary_lines.append(" (JSON 已保存,未解析到 receiverList)") + except json.JSONDecodeError: + with open(path, "w", encoding="utf-8") as f: + f.write(text) + summary_lines.append(" (非 JSON,已保存原文)") + + summary_lines.append(f" saved: {path}") + ctx.log.info("\n".join(summary_lines)) + + +addons = [TngMmpCapture()] diff --git a/magisk-modules/tng_exit_guard/jni/main.cpp b/magisk-modules/tng_exit_guard/jni/main.cpp index 7ad86e5..7eafe8a 100644 --- a/magisk-modules/tng_exit_guard/jni/main.cpp +++ b/magisk-modules/tng_exit_guard/jni/main.cpp @@ -6,6 +6,7 @@ * pc==lr 循环 SEGV 也 skip;libc++abi __cxa_guard_acquire → SIGABRT 吞掉。 */ #include +#include #include #include #include @@ -174,11 +175,20 @@ static void fatal_skip_handler(int sig, siginfo_t *info, void *ctx) { freeze_forever(); } int n = ++g_abrt_swallow; - if (n <= 5 || n % 50 == 0) { - LOGI("ABRT pc+4 tid=%d pc=%lx lr=%lx streak=%d", (int)tid, - (unsigned long)pc, (unsigned long)lr, streak); + /* 主线程:abort 后 _exit 被 seccomp 拦 → abort 内部死循环(还复位 handler)→ + * 主线程永久卡死 → 黑屏/ANR。主线程 ABRT 时跳回 lr(Looper pollOnce)恢复; + * 仅当 lr 距 pc 远(不在 abort 内部)才跳,否则仍在 abort epilogue 内跳 LR 会再 abort。 */ + uintptr_t target = pc + 4; + if (tid == g_main_tid.load() && lr != 0 && pc != 0 + && (lr < pc - 0x1000 || lr > pc + 0x1000)) { + target = lr; } - uc->uc_mcontext.pc = pc + 4; + if (n <= 5 || n % 50 == 0) { + LOGI("ABRT tid=%d pc=%lx lr=%lx streak=%d -> %lx", (int)tid, + (unsigned long)pc, (unsigned long)lr, streak, + (unsigned long)target); + } + uc->uc_mcontext.pc = target; return; } @@ -236,14 +246,23 @@ static void install_soft_signals() { ((struct sock_filter){(unsigned short)(code), (jt), (jf), (unsigned int)(k)}) static int install_seccomp_exit_group_only() { + /* exit_group 拦 + 精准拦 Promon 自杀 kill(SIGABRT)(SI_USER)。 + * 只拦 kill()(nr=129):Promon 自杀是 kill(pid,SIGABRT) → si_code=SI_USER。 + * 不拦 tgkill/tkill:ART 的 abort() 用 tgkill(self) → si_code=SI_TKILL, + * 拦它会让 libart 状态错乱 → 进程崩(之前验证)。 */ struct sock_filter filter[] = { + // 0: arch _BPFI(BPF_LD | BPF_W | BPF_ABS, 0, 0, offsetof(struct seccomp_data, arch)), _BPFI(BPF_JMP | BPF_JEQ | BPF_K, 1, 0, AUDIT_ARCH_AARCH64), - _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ALLOW), + _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ALLOW), // 2: not aarch64 _BPFI(BPF_LD | BPF_W | BPF_ABS, 0, 0, offsetof(struct seccomp_data, nr)), - _BPFI(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 94), - _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ERRNO_EPERM), - _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ALLOW), + _BPFI(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, __NR_exit_group), // 4: exit_group? true→5 + _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ERRNO_EPERM), // 5: EPERM exit_group + _BPFI(BPF_JMP | BPF_JEQ | BPF_K, 0, 3, __NR_kill), // 6: kill? true→7 + _BPFI(BPF_LD | BPF_W | BPF_ABS, 0, 0, offsetof(struct seccomp_data, args) + 8), // 7: args[1]=sig + _BPFI(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, SIGABRT), // 8: sig==SIGABRT? true→9 + _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ERRNO_EPERM), // 9: EPERM kill ABRT + _BPFI(BPF_RET | BPF_K, 0, 0, SC_RET_ALLOW), // 10: allow }; struct sock_fprog prog = { .len = (unsigned short)(sizeof(filter) / sizeof(filter[0])), @@ -258,9 +277,9 @@ static int install_seccomp_exit_group_only() { LOGE("seccomp failed errno=%d", errno); return -1; } - LOGI("seccomp exit_group via prctl"); + LOGI("seccomp exit_group+kill-ABRT via prctl"); } else { - LOGI("seccomp exit_group via TSYNC"); + LOGI("seccomp exit_group+kill-ABRT via TSYNC"); } g_seccomp_ok.store(1); return 0; @@ -277,10 +296,31 @@ using pthread_kill_fn = int (*)(pthread_t, int); using cxa_guard_acquire_fn = int (*)(void *); using cxa_guard_abort_fn = void (*)(); using dlopen_fn = void *(*)(const char *, int); +using android_dlopen_ext_fn = void *(*)(const char *, int, const void *); +using sphal_load_fn = void *(*)(const char *, int); +using open_passthrough_hal_fn = void *(*)(const char *, const char *, int); static cxa_guard_acquire_fn orig_cxa_guard_acquire = nullptr; static cxa_guard_abort_fn orig_cxa_guard_abort = nullptr; static dlopen_fn orig_dlopen = nullptr; +static android_dlopen_ext_fn orig_android_dlopen_ext = nullptr; +static sphal_load_fn orig_sphal_load = nullptr; +static open_passthrough_hal_fn orig_open_passthrough_hal = nullptr; +static void *g_libandroid_handle = nullptr; +static void *g_mapper_pixel_handle = nullptr; + +#ifndef RTLD_NOW +#define RTLD_NOW 2 +#endif +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0x100 +#endif +#ifndef RTLD_NOLOAD +#define RTLD_NOLOAD 0x4 +#endif +#ifndef RTLD_DEFAULT +#define RTLD_DEFAULT reinterpret_cast(static_cast(-1)) +#endif static exit_fn orig_exit = nullptr; static exit_fn orig__exit = nullptr; @@ -359,31 +399,186 @@ static void hooked_cxa_guard_abort() { LOGI("blocked __cxa_guard_abort tid=%d depth=%d", (int)gettid(), tl_cxa_depth); } +static void *try_dlopen_noload(const char *name) { + if (!orig_dlopen || name == nullptr) { + return nullptr; + } + void *h = orig_dlopen(name, RTLD_NOW | RTLD_NOLOAD); + if (h != nullptr) { + return h; + } + const char *base = strrchr(name, '/'); + if (base != nullptr && base[1] != '\0') { + h = orig_dlopen(base + 1, RTLD_NOW | RTLD_NOLOAD); + } + return h; +} + +/** 校验 dlopen 句柄:拒绝空/明显毒化指针,并用 dlsym 探活。 */ +static bool libandroid_handle_ok(void *h) { + if (h == nullptr) return false; + uintptr_t p = reinterpret_cast(h); + // 用户态典型映射;排除明显垃圾(如 0x...c5c5 / 高熵毒化) + if (p < 0x10000UL) return false; + if ((p & 0xffffUL) == 0xc5c5UL) return false; + void *sym = dlsym(h, "ANativeWindow_fromSurface"); + if (sym == nullptr) { + sym = dlsym(h, "AAssetManager_fromJava"); + } + return sym != nullptr; +} + +static void preload_hwui_libs() { + if (!orig_dlopen) { + // PLT 尚未拿到 orig 时,用 libc 直调 + orig_dlopen = reinterpret_cast(dlsym(RTLD_DEFAULT, "dlopen")); + } + if (!orig_sphal_load) { + orig_sphal_load = reinterpret_cast( + dlsym(RTLD_DEFAULT, "android_load_sphal_library")); + } + if (g_libandroid_handle != nullptr && !libandroid_handle_ok(g_libandroid_handle)) { + LOGI("drop invalid cached libandroid %p", g_libandroid_handle); + g_libandroid_handle = nullptr; + } + if (g_libandroid_handle == nullptr && orig_dlopen) { + static const char *kPaths[] = { + "libandroid.so", + "/system/lib64/libandroid.so", + "/apex/com.android.runtime/lib64/libandroid.so", + }; + for (const char *path : kPaths) { + void *h = orig_dlopen(path, RTLD_NOW | RTLD_GLOBAL); + if (h == nullptr) { + h = try_dlopen_noload(path); + } + if (libandroid_handle_ok(h)) { + g_libandroid_handle = h; + LOGI("preload libandroid ok path=%s -> %p", path, h); + break; + } + if (h != nullptr) { + LOGI("preload libandroid reject path=%s -> %p", path, h); + } + } + if (g_libandroid_handle == nullptr) { + LOGI("preload libandroid FAILED"); + } + } + if (g_mapper_pixel_handle == nullptr) { + if (orig_sphal_load) { + g_mapper_pixel_handle = orig_sphal_load("mapper.pixel.so", RTLD_NOW); + LOGI("preload mapper via sphal -> %p", g_mapper_pixel_handle); + } + if (g_mapper_pixel_handle == nullptr && orig_dlopen) { + g_mapper_pixel_handle = orig_dlopen( + "/vendor/lib64/hw/mapper.pixel.so", RTLD_NOW | RTLD_GLOBAL); + LOGI("preload mapper via path -> %p", g_mapper_pixel_handle); + } + } +} + static void *hooked_dlopen(const char *name, int flags) { void *handle = orig_dlopen ? orig_dlopen(name, flags) : nullptr; - if (handle != nullptr || name == nullptr) { + if (name == nullptr) { return handle; } - // Compose/HWUI 依赖 libandroid + gralloc mapper;sphal 失败时尝试绝对路径兜底 - if (strstr(name, "libandroid.so") != nullptr - || strstr(name, "mapper.pixel") != nullptr - || strstr(name, "android.hardware.graphics.mapper") != nullptr) { - static const char *kFallbacks[] = { + if (handle != nullptr) { + // 命名空间下偶发返回毒化非空句柄,HWUI 随后 FATAL + if (strstr(name, "libandroid.so") != nullptr && !libandroid_handle_ok(handle)) { + LOGI("dlopen got bad handle %p for %s — recover", handle, name); + handle = nullptr; + } else { + if (strstr(name, "libandroid.so") != nullptr) { + g_libandroid_handle = handle; + } + return handle; + } + } + // 已映射库:命名空间下按名 dlopen 会失败,RTLD_NOLOAD 可取回句柄 + handle = try_dlopen_noload(name); + if (handle != nullptr) { + if (strstr(name, "libandroid.so") == nullptr || libandroid_handle_ok(handle)) { + LOGI("dlopen NOLOAD hit name=%s -> %p", name, handle); + if (strstr(name, "libandroid.so") != nullptr) { + g_libandroid_handle = handle; + } + return handle; + } + } + if (strstr(name, "libandroid.so") != nullptr) { + if (g_libandroid_handle != nullptr && !libandroid_handle_ok(g_libandroid_handle)) { + LOGI("drop bad cached libandroid %p", g_libandroid_handle); + g_libandroid_handle = nullptr; + } + if (g_libandroid_handle != nullptr) { + LOGI("dlopen return cached libandroid %p (from %s)", + g_libandroid_handle, name); + return g_libandroid_handle; + } + static const char *kAndroidPaths[] = { "/system/lib64/libandroid.so", - "/system/lib/libandroid.so", - "/vendor/lib64/hw/mapper.pixel.so", - "/vendor/lib/hw/mapper.pixel.so", "libandroid.so", - "mapper.pixel.so", }; - for (const char *path : kFallbacks) { - handle = orig_dlopen ? orig_dlopen(path, flags) : nullptr; - if (handle != nullptr) { + LOGI("dlopen miss name=%s flags=0x%x tid=%d — try fallback", + name, flags, (int)gettid()); + for (const char *path : kAndroidPaths) { + handle = try_dlopen_noload(path); + if (handle == nullptr && orig_dlopen) { + handle = orig_dlopen(path, flags | RTLD_GLOBAL); + } + if (libandroid_handle_ok(handle)) { + g_libandroid_handle = handle; LOGI("dlopen fallback %s -> %p (from %s)", path, handle, name); return handle; } + if (handle != nullptr) { + LOGI("dlopen fallback reject %s -> %p", path, handle); + } } LOGI("dlopen fallback failed name=%s tid=%d", name, (int)gettid()); + return nullptr; + } + if (strstr(name, "mapper.pixel") != nullptr + || strstr(name, "mapper.") != nullptr) { + if (g_mapper_pixel_handle != nullptr) { + LOGI("dlopen return cached mapper %p (from %s)", + g_mapper_pixel_handle, name); + return g_mapper_pixel_handle; + } + if (orig_sphal_load) { + handle = orig_sphal_load("mapper.pixel.so", RTLD_NOW); + if (handle != nullptr) { + g_mapper_pixel_handle = handle; + LOGI("dlopen sphal mapper -> %p (from %s)", handle, name); + return handle; + } + } + if (orig_dlopen) { + handle = orig_dlopen("/vendor/lib64/hw/mapper.pixel.so", + flags | RTLD_GLOBAL); + if (handle != nullptr) { + g_mapper_pixel_handle = handle; + LOGI("dlopen path mapper -> %p (from %s)", handle, name); + return handle; + } + } + LOGI("dlopen mapper failed name=%s tid=%d", name, (int)gettid()); + } + return handle; +} + +static void *hooked_android_dlopen_ext(const char *name, int flags, const void *extinfo) { + void *handle = orig_android_dlopen_ext + ? orig_android_dlopen_ext(name, flags, extinfo) + : nullptr; + if (handle != nullptr || name == nullptr) { + return handle; + } + if (strstr(name, "libandroid.so") != nullptr + || strstr(name, "mapper") != nullptr) { + LOGI("android_dlopen_ext miss name=%s — try dlopen fallback", name); + return hooked_dlopen(name, flags); } return handle; } @@ -402,7 +597,7 @@ static bool find_lib_match(const char *suffix, const char *contains, unsigned long inode = 0; char path[512] = {}; int n = sscanf(line, "%lx-%lx %7s %llx %31s %lu %511[^\n]", - &start, &end, perms, &offset, &deststr, &inode, path); + &start, &end, perms, &offset, deststr, &inode, path); if (n < 7 || inode == 0) continue; char *p = path; while (*p == ' ') ++p; @@ -438,12 +633,160 @@ static bool find_libc(dev_t *dev, ino_t *ino) { return find_lib_by_suffix("libc.so", dev, ino); } +/** 收集 maps 里所有匹配后缀的已加载库(去重)。Zygisk commit 前必须覆盖全部副本, + * 否则 libc++ 多副本(/system、/vendor、/apex)时只 hook 一份,调用点仍走原生实现。 */ +struct lib_devino { + dev_t dev; + ino_t ino; +}; + +static int find_all_lib_by_suffix(const char *suffix, lib_devino *out, int max) { + FILE *fp = fopen("/proc/self/maps", "r"); + if (!fp) return 0; + char line[1024]; + int n = 0; + while (fgets(line, sizeof(line), fp)) { + uintptr_t start = 0, end = 0; + char perms[8] = {}; + unsigned long long offset = 0; + char deststr[32] = {}; + unsigned long inode = 0; + char path[512] = {}; + int got = sscanf(line, "%lx-%lx %7s %llx %31s %lu %511[^\n]", + &start, &end, perms, &offset, deststr, &inode, path); + if (got < 7 || inode == 0) continue; + char *p = path; + while (*p == ' ') ++p; + size_t plen = strlen(p); + size_t slen = strlen(suffix); + if (plen < slen || strcmp(p + plen - slen, suffix) != 0) continue; + unsigned maj = 0, min = 0; + if (sscanf(deststr, "%x:%x", &maj, &min) != 2) continue; + dev_t d = makedev(maj, min); + ino_t in = inode; + bool dup = false; + for (int i = 0; i < n; i++) { + if (out[i].dev == d && out[i].ino == in) { + dup = true; + break; + } + } + if (dup) continue; + if (n < max) { + out[n].dev = d; + out[n].ino = in; + n++; + } + } + fclose(fp); + return n; +} + static void register_plt(zygisk::Api *api, dev_t dev, ino_t ino, const char *sym, void *hook, void **orig) { if (!api || dev == 0 || ino == 0) return; api->pltHookRegister(dev, ino, sym, hook, orig); } +static void *hooked_sphal_load(const char *name, int flags) { + void *handle = orig_sphal_load ? orig_sphal_load(name, flags) : nullptr; + if (handle != nullptr || name == nullptr) { + return handle; + } + LOGI("sphal miss name=%s flags=0x%x — try cache/path", name, flags); + if (strstr(name, "mapper") != nullptr) { + if (g_mapper_pixel_handle != nullptr) { + LOGI("sphal return cached mapper %p", g_mapper_pixel_handle); + return g_mapper_pixel_handle; + } + if (orig_dlopen) { + handle = orig_dlopen("/vendor/lib64/hw/mapper.pixel.so", + RTLD_NOW | RTLD_GLOBAL); + if (handle != nullptr) { + g_mapper_pixel_handle = handle; + LOGI("sphal path mapper -> %p", handle); + return handle; + } + handle = orig_dlopen("mapper.pixel.so", RTLD_NOW | RTLD_GLOBAL); + if (handle != nullptr) { + g_mapper_pixel_handle = handle; + LOGI("sphal name mapper -> %p", handle); + return handle; + } + } + } + return nullptr; +} + +static void *hooked_open_passthrough_hal(const char *interface, const char *instance, + int dlopen_flags) { + void *handle = orig_open_passthrough_hal + ? orig_open_passthrough_hal(interface, instance, dlopen_flags) + : nullptr; + if (handle != nullptr) { + return handle; + } + LOGI("passthroughHal miss iface=%s inst=%s — try mapper path", + interface ? interface : "?", instance ? instance : "?"); + if ((interface && strstr(interface, "mapper") != nullptr) + || (instance && strstr(instance, "pixel") != nullptr)) { + if (g_mapper_pixel_handle != nullptr) { + return g_mapper_pixel_handle; + } + if (orig_sphal_load) { + handle = orig_sphal_load("mapper.pixel.so", RTLD_NOW); + } + if (handle == nullptr && orig_dlopen) { + handle = orig_dlopen("/vendor/lib64/hw/mapper.pixel.so", + RTLD_NOW | RTLD_GLOBAL); + } + if (handle != nullptr) { + g_mapper_pixel_handle = handle; + LOGI("passthroughHal mapper recovered -> %p", handle); + } + } + return handle; +} + +static void register_dlopen_on_lib(zygisk::Api *api, const char *suffix) { + dev_t dev = 0; + ino_t ino = 0; + if (!find_lib_by_suffix(suffix, &dev, &ino)) { + return; + } + // 必须 hook 调用方 PLT(libhwui/libui),只 hook libc 拦不到 HWUI 的 dlopen + register_plt(api, dev, ino, "dlopen", + (void *)hooked_dlopen, (void **)&orig_dlopen); + register_plt(api, dev, ino, "android_dlopen_ext", + (void *)hooked_android_dlopen_ext, (void **)&orig_android_dlopen_ext); + register_plt(api, dev, ino, "android_load_sphal_library", + (void *)hooked_sphal_load, (void **)&orig_sphal_load); + register_plt(api, dev, ino, "AServiceManager_openDeclaredPassthroughHal", + (void *)hooked_open_passthrough_hal, + (void **)&orig_open_passthrough_hal); + LOGI("dlopen PLT on %s", suffix); +} + +/** 注册所有已加载 libc++ 副本的 __cxa_guard_acquire/abort。返回注册的副本数。 */ +static int register_cxx_guard_hooks(zygisk::Api *api) { + if (!api) return 0; + lib_devino libs[8]; + int n = find_all_lib_by_suffix("libc++.so", libs, 8); + if (n == 0) { + n = find_all_lib_by_suffix("libc++_shared.so", libs, 8); + } + for (int i = 0; i < n; i++) { + register_plt(api, libs[i].dev, libs[i].ino, "__cxa_guard_acquire", + (void *)hooked_cxa_guard_acquire, (void **)&orig_cxa_guard_acquire); + register_plt(api, libs[i].dev, libs[i].ino, "__cxa_guard_abort", + (void *)hooked_cxa_guard_abort, (void **)&orig_cxa_guard_abort); + } + if (n > 0) { + LOGI("cxx guard target libc++ copies=%d", n); + } + return n; +} + static void install_plt(zygisk::Api *api) { if (!api) return; dev_t dev = 0; @@ -460,9 +803,25 @@ static void install_plt(zygisk::Api *api) { register_plt(api, dev, ino, "pthread_kill", (void *)hooked_pthread_kill, (void **)&orig_pthread_kill); register_plt(api, dev, ino, "dlopen", (void *)hooked_dlopen, (void **)&orig_dlopen); + register_plt(api, dev, ino, "android_dlopen_ext", + (void *)hooked_android_dlopen_ext, (void **)&orig_android_dlopen_ext); } + // HWUI / libui 直接 PLT→linker,必须单独挂 + register_dlopen_on_lib(api, "libhwui.so"); + register_dlopen_on_lib(api, "libui.so"); + register_dlopen_on_lib(api, "libandroid_runtime.so"); + register_dlopen_on_lib(api, "libbinder_ndk.so"); + register_dlopen_on_lib(api, "libvndksupport.so"); + // libc++ cxa guard 必须在首次 commit 前注册:Zygisk pltHookCommit 二次调用会失败, + // 导致 __cxa_guard_acquire 递归 abort 保护从未生效(主线程反复 SIGABRT → 黑屏)。 + int cxx = register_cxx_guard_hooks(api); bool ok = api->pltHookCommit(); - LOGI("PLT commit=%d", ok ? 1 : 0); + LOGI("PLT commit=%d cxx_guard_copies=%d", ok ? 1 : 0, cxx); + if (ok && cxx > 0) { + g_cxx_plt.store(1); + } + // commit 后立刻预加载,抢在 Promon/命名空间收紧之前拿到句柄 + preload_hwui_libs(); } static void try_install_cxx_guard_plt() { @@ -470,17 +829,7 @@ static void try_install_cxx_guard_plt() { dev_t dev = 0; ino_t ino = 0; bool any = false; - // libc++:必须走 orig acquire(否则 gralloc 静态初始化被跳过 → mapper missing 黑屏)。 - // 仅在同 guard 递归时 return 1;abort 仍拦截。 - if (find_lib_by_suffix("libc++.so", &dev, &ino) - || find_lib_by_suffix("libc++_shared.so", &dev, &ino)) { - register_plt(g_api, dev, ino, "__cxa_guard_acquire", - (void *)hooked_cxa_guard_acquire, (void **)&orig_cxa_guard_acquire); - register_plt(g_api, dev, ino, "__cxa_guard_abort", - (void *)hooked_cxa_guard_abort, (void **)&orig_cxa_guard_abort); - any = true; - LOGI("cxx guard target libc++"); - } + // libc++ 副本已由首次 PLT commit 覆盖;此处仅补 libtngdigital_ewallet.so 自身 PLT。 if (find_lib_by_suffix("libtngdigital_ewallet.so", &dev, &ino)) { register_plt(g_api, dev, ino, "__cxa_guard_acquire", (void *)hooked_cxa_guard_acquire, (void **)&orig_cxa_guard_acquire); @@ -490,7 +839,9 @@ static void try_install_cxx_guard_plt() { LOGI("cxx guard target libtngdigital_ewallet"); } if (!any) return; - if (g_api->pltHookCommit()) { + bool ok = g_api->pltHookCommit(); + LOGI("cxx guard commit=%d", ok ? 1 : 0); + if (ok) { g_cxx_plt.store(1); LOGI("PLT cxx guards committed (orig acquire + recursive skip)"); } @@ -498,9 +849,13 @@ static void try_install_cxx_guard_plt() { static void *phase_thread(void *) { install_promon_segv_handler(); + /* Promon 用 SVC exit_group 绕过 PLT;必须 seccomp。延迟 400ms 避开最早的 fork/getprop。 */ usleep(400 * 1000); - install_seccomp_exit_group_only(); - LOGI("seccomp armed @400ms ok=%d", g_seccomp_ok.load()); + if (install_seccomp_exit_group_only() == 0) { + LOGI("seccomp exit_group armed @400ms"); + } else { + LOGE("seccomp install failed"); + } for (int i = 0; i < 40; i++) { usleep(1000 * 1000); install_soft_signals(); @@ -516,7 +871,7 @@ static void *phase_thread(void *) { static void install_all(zygisk::Api *api) { g_api = api; g_main_tid.store(gettid()); - LOGI("install pid=%d main_tid=%d (PLT+cxx-guard+ABRT-pc+4+SEGV-skip+exit_group@400ms)", + LOGI("install pid=%d main_tid=%d (PLT+cxx-guard+ABRT-pc+4+SEGV-skip+seccomp@400ms)", getpid(), (int)g_main_tid.load()); install_fatal_skip_handlers(); install_soft_signals(); diff --git a/magisk-modules/tng_exit_guard/zygisk/arm64-v8a.so b/magisk-modules/tng_exit_guard/zygisk/arm64-v8a.so index 8d6635b809210e631e2f1ee4ab4bd0f385b28b93..209e78530935dc6c727afce582750f2babb9b91b 100644 GIT binary patch literal 194640 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 literal 194640 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

x@{L4}FbqEc%)emJfXx$-x#%`(N>C!H32w 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 进群 -> 打开红包 Leaderboard" -ForegroundColor White +Write-Host "5. 命中响应保存到 reverse/dumps/mitm_mmp/" -ForegroundColor White +Write-Host "" +Write-Host "若 TNG 报网络错误,可能是证书 pinning,见 docs 说明。" -ForegroundColor Yellow +Write-Host "" + +if ($mitm.Name -eq "mitmweb") { + Write-Host "Web UI: http://127.0.0.1:8081" -ForegroundColor Cyan + & mitmweb -s $Addon -p 8888 --web-host 127.0.0.1 +} else { + & mitmdump -s $Addon -p 8888 +} diff --git a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/HookBridge.java b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/HookBridge.java index b3a3cfc..4827c0f 100644 --- a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/HookBridge.java +++ b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/HookBridge.java @@ -18,6 +18,7 @@ public final class HookBridge { public static final String SOURCE_XPOSED_SUNCORP_NOTIFY = "xposed_suncorp_notify"; public static final String SOURCE_XPOSED_UBANK = "xposed_ubank"; public static final String SOURCE_XPOSED_UBANK_NOTIFY = "xposed_ubank_notify"; + public static final String SOURCE_XPOSED_TNG_MMP = "xposed_tng_mmp"; private HookBridge() { } diff --git a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/MainHook.java b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/MainHook.java index fa72915..4c67500 100644 --- a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/MainHook.java +++ b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/MainHook.java @@ -3,6 +3,7 @@ package com.miraclegarden.smsmessage.xposed; import com.miraclegarden.smsmessage.xposed.hook.MariBankRootBypassHook; import com.miraclegarden.smsmessage.xposed.hook.MariBankShpsNativeHook; import com.miraclegarden.smsmessage.xposed.hook.SuncorpBankMessageHook; +import com.miraclegarden.smsmessage.xposed.hook.TngMoneyPacketHook; import com.miraclegarden.smsmessage.xposed.hook.TngRootBypassHook; import com.miraclegarden.smsmessage.xposed.hook.SqliteMessageHook; import com.miraclegarden.smsmessage.xposed.hook.TelegramMessageHook; @@ -66,6 +67,7 @@ public class MainHook implements IXposedHookLoadPackage { if (TngRootBypassHook.isTargetPackage(lpparam.packageName)) { TngRootBypassHook.install(lpparam); + TngMoneyPacketHook.install(lpparam); return; } diff --git a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngMoneyPacketHook.java b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngMoneyPacketHook.java new file mode 100644 index 0000000..240dd19 --- /dev/null +++ b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngMoneyPacketHook.java @@ -0,0 +1,579 @@ +package com.miraclegarden.smsmessage.xposed.hook; + +import android.content.Context; +import android.text.TextUtils; + +import com.miraclegarden.smsmessage.xposed.HookBridge; +import com.miraclegarden.smsmessage.xposed.HookForwarder; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; +import de.robv.android.xposed.callbacks.XC_LoadPackage; + +/** + * TNG eWallet Money Packet(群红包)领取统计。 + * 从 HTTP 响应 JSON / Gson 反序列化结果中提取 receiverList(昵称 + 金额),转发到 notiMessage。 + */ +public final class TngMoneyPacketHook { + + private static final String TAG = "notiMessageHook/TngMmp"; + private static final String PACKAGE = TngRootBypassHook.PACKAGE; + private static final int DEDUP_SIZE = 256; + + private static final ArrayDeque RECENT_KEYS = new ArrayDeque<>(); + private static final HashSet RECENT_SET = new HashSet<>(); + private static final ThreadLocal CURRENT_REQUEST_URL = new ThreadLocal<>(); + + private TngMoneyPacketHook() { + } + + public static void install(XC_LoadPackage.LoadPackageParam lpparam) { + if (!TngRootBypassHook.isTargetPackage(lpparam.packageName)) { + return; + } + hookOkHttpUrl(lpparam); + hookResponseBody(lpparam); + hookGsonFromJson(lpparam); + XposedBridge.log(TAG + " installed for " + lpparam.packageName); + } + + private static void hookOkHttpUrl(XC_LoadPackage.LoadPackageParam lpparam) { + try { + XposedHelpers.findAndHookMethod( + "okhttp3.Request$Builder", + lpparam.classLoader, + "build", + new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + try { + Object url = XposedHelpers.callMethod(param.getResult(), "url"); + if (url != null) { + CURRENT_REQUEST_URL.set(String.valueOf(url)); + } + } catch (Throwable ignored) { + } + } + }); + } catch (Throwable t) { + XposedBridge.log(TAG + " Request.Builder.build hook failed: " + t.getMessage()); + } + } + + private static void hookResponseBody(XC_LoadPackage.LoadPackageParam lpparam) { + try { + XposedHelpers.findAndHookMethod( + "okhttp3.ResponseBody", + lpparam.classLoader, + "string", + new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + String body = (String) param.getResult(); + String url = CURRENT_REQUEST_URL.get(); + CURRENT_REQUEST_URL.remove(); + if (!isMmpPayload(url, body)) { + return; + } + forwardParsedJson(body, url, "http"); + } + }); + } catch (Throwable t) { + XposedBridge.log(TAG + " ResponseBody.string hook failed: " + t.getMessage()); + } + } + + private static void hookGsonFromJson(XC_LoadPackage.LoadPackageParam lpparam) { + XC_MethodHook hook = new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + Object result = param.getResult(); + if (result == null) { + return; + } + String className = result.getClass().getName(); + if (!isMmpModelClass(className)) { + return; + } + try { + String json = buildJsonFromObject(result); + if (TextUtils.isEmpty(json)) { + return; + } + forwardParsedJson(json, className, "gson"); + } catch (Throwable t) { + XposedBridge.log(TAG + " gson capture failed: " + t.getMessage()); + } + } + }; + try { + XposedHelpers.findAndHookMethod( + "com.google.gson.Gson", + lpparam.classLoader, + "fromJson", + String.class, + Class.class, + hook); + } catch (Throwable t) { + XposedBridge.log(TAG + " Gson.fromJson(Class) hook failed: " + t.getMessage()); + } + try { + XposedHelpers.findAndHookMethod( + "com.google.gson.Gson", + lpparam.classLoader, + "fromJson", + String.class, + java.lang.reflect.Type.class, + hook); + } catch (Throwable ignored) { + } + } + + private static boolean isMmpPayload(String url, String body) { + if (TextUtils.isEmpty(body) || body.length() < 24) { + return false; + } + String lower = body.toLowerCase(Locale.US); + boolean jsonHit = lower.contains("receiverlist") + || lower.contains("\"claimedamount\"") + || lower.contains("mmpreceiver") + || (lower.contains("nick") && lower.contains("amount") && lower.contains("mmp")); + if (jsonHit) { + return true; + } + if (TextUtils.isEmpty(url)) { + return false; + } + String urlLower = url.toLowerCase(Locale.US); + return urlLower.contains("mmp") || urlLower.contains("moneypacket"); + } + + private static boolean isMmpModelClass(String className) { + if (TextUtils.isEmpty(className)) { + return false; + } + return className.contains("MmpDetailResult") + || className.contains("MmpClaimQueryResult") + || className.contains("MmpClaimResult") + || className.contains("MmpReceiver") + || className.contains("MmpDetailLeaderboard"); + } + + private static void forwardParsedJson(String json, String sourceHint, String channel) { + MmpSnapshot snapshot = parseSnapshot(json); + if (snapshot == null || snapshot.claims.isEmpty()) { + return; + } + String dedupKey = snapshot.dedupKey(); + if (!remember(dedupKey)) { + return; + } + Context context = getContext(); + if (context == null) { + return; + } + String title = TextUtils.isEmpty(snapshot.title) ? "TNG Money Packet" : snapshot.title; + String content = snapshot.formatForForward(channel, sourceHint); + HookForwarder.forward(context, PACKAGE, title, content, HookBridge.SOURCE_XPOSED_TNG_MMP); + XposedBridge.log(TAG + " captured packet=" + snapshot.packetId + + " claims=" + snapshot.claims.size() + " via " + channel); + } + + private static MmpSnapshot parseSnapshot(String json) { + try { + JSONObject root = new JSONObject(json.trim()); + return parseSnapshot(root, null); + } catch (Throwable t) { + return null; + } + } + + private static MmpSnapshot parseSnapshot(JSONObject root, MmpSnapshot base) { + MmpSnapshot snapshot = base != null ? base : new MmpSnapshot(); + fillMeta(root, snapshot); + + JSONArray receiverList = findReceiverList(root); + if (receiverList != null) { + for (int i = 0; i < receiverList.length(); i++) { + JSONObject item = receiverList.optJSONObject(i); + if (item == null) { + continue; + } + ClaimLine line = parseClaimLine(item); + if (line != null) { + snapshot.claims.add(line); + } + } + } + + Iterator keys = root.keys(); + while (keys.hasNext()) { + String key = keys.next(); + Object val = root.opt(key); + if (val instanceof JSONObject) { + parseSnapshot((JSONObject) val, snapshot); + } else if (val instanceof JSONArray) { + JSONArray arr = (JSONArray) val; + for (int i = 0; i < arr.length(); i++) { + Object elem = arr.opt(i); + if (elem instanceof JSONObject) { + ClaimLine line = parseClaimLine((JSONObject) elem); + if (line != null && looksLikeClaimRow((JSONObject) elem)) { + snapshot.claims.add(line); + } + parseSnapshot((JSONObject) elem, snapshot); + } + } + } + } + return snapshot; + } + + private static JSONArray findReceiverList(JSONObject obj) { + Iterator keys = obj.keys(); + while (keys.hasNext()) { + String key = keys.next(); + Object val = obj.opt(key); + if ("receiverList".equalsIgnoreCase(key) && val instanceof JSONArray) { + return (JSONArray) val; + } + if (val instanceof JSONObject) { + JSONArray nested = findReceiverList((JSONObject) val); + if (nested != null) { + return nested; + } + } + } + return null; + } + + private static void fillMeta(JSONObject obj, MmpSnapshot snapshot) { + putIfPresent(obj, snapshot, "packetId", "mmpId", "moneyPacketId", "id"); + putIfPresent(obj, snapshot, "groupId", "chatId", "conversationId"); + putIfPresent(obj, snapshot, "groupName", "chatName", "conversationName"); + putIfPresent(obj, snapshot, "senderName", "senderNickName", "operatorName"); + putIfPresent(obj, snapshot, "totalAmount", "packetAmount", "amount"); + if (TextUtils.isEmpty(snapshot.title)) { + String merchant = firstNonEmpty( + obj.optString("merchantName", null), + obj.optString("shopName", null)); + if (!TextUtils.isEmpty(merchant)) { + snapshot.title = merchant; + } + } + } + + private static void putIfPresent(JSONObject obj, MmpSnapshot snapshot, String... keys) { + for (String key : keys) { + if (!obj.has(key)) { + continue; + } + String val = obj.optString(key, null); + if (TextUtils.isEmpty(val) || "null".equalsIgnoreCase(val)) { + continue; + } + if (key.toLowerCase(Locale.US).contains("packet") || key.equals("mmpId") || key.equals("id")) { + if (TextUtils.isEmpty(snapshot.packetId)) { + snapshot.packetId = val; + } + } else if (key.toLowerCase(Locale.US).contains("group")) { + if (TextUtils.isEmpty(snapshot.groupId)) { + snapshot.groupId = val; + } + } else if (key.toLowerCase(Locale.US).contains("name") && key.toLowerCase(Locale.US).contains("group")) { + snapshot.title = val; + } else if (key.toLowerCase(Locale.US).contains("sender") + || key.toLowerCase(Locale.US).contains("operator")) { + if (TextUtils.isEmpty(snapshot.senderName)) { + snapshot.senderName = val; + } + } else if (key.toLowerCase(Locale.US).contains("total") || key.equals("amount")) { + if (TextUtils.isEmpty(snapshot.totalAmount)) { + snapshot.totalAmount = val; + } + } + } + } + + private static boolean looksLikeClaimRow(JSONObject obj) { + String name = firstNonEmpty( + obj.optString("nickName", null), + obj.optString("displayName", null), + obj.optString("userName", null), + obj.optString("receiverName", null)); + String amount = firstNonEmpty( + obj.optString("claimedAmount", null), + obj.optString("receiveAmount", null), + obj.optString("amount", null)); + return !TextUtils.isEmpty(name) && !TextUtils.isEmpty(amount); + } + + private static ClaimLine parseClaimLine(JSONObject obj) { + String name = firstNonEmpty( + obj.optString("nickName", null), + obj.optString("displayName", null), + obj.optString("userName", null), + obj.optString("receiverName", null), + obj.optString("name", null)); + String amount = firstNonEmpty( + obj.optString("claimedAmount", null), + obj.optString("receiveAmount", null), + obj.optString("amount", null)); + if (TextUtils.isEmpty(name) || TextUtils.isEmpty(amount)) { + return null; + } + ClaimLine line = new ClaimLine(); + line.nickname = name; + line.amount = amount; + line.claimTime = firstNonEmpty( + obj.optString("claimTime", null), + obj.optString("claimedTime", null), + obj.optString("receiveTime", null)); + return line; + } + + private static String buildJsonFromObject(Object root) { + JSONObject json = objectToJson(root, new HashSet(), 0); + return json != null ? json.toString() : null; + } + + private static JSONObject objectToJson(Object obj, Set visited, int depth) { + if (obj == null || depth > 6) { + return null; + } + if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) { + JSONObject wrap = new JSONObject(); + try { + wrap.put("value", obj); + } catch (Throwable ignored) { + } + return wrap; + } + int identity = System.identityHashCode(obj); + if (visited.contains(identity)) { + return null; + } + visited.add(identity); + + JSONObject out = new JSONObject(); + Class clazz = obj.getClass(); + if (clazz.isArray()) { + JSONArray arr = new JSONArray(); + int len = Array.getLength(obj); + for (int i = 0; i < len; i++) { + Object elem = Array.get(obj, i); + JSONObject child = objectToJson(elem, visited, depth + 1); + if (child != null) { + arr.put(child); + } + } + try { + out.put("array", arr); + } catch (Throwable ignored) { + } + return out; + } + if (obj instanceof Iterable) { + JSONArray arr = new JSONArray(); + for (Object elem : (Iterable) obj) { + JSONObject child = objectToJson(elem, visited, depth + 1); + if (child != null) { + arr.put(child); + } + } + try { + out.put("receiverList", arr); + } catch (Throwable ignored) { + } + return out; + } + + for (Field field : clazz.getDeclaredFields()) { + String fname = field.getName(); + if (fname.contains("$") || fname.startsWith("CREATOR")) { + continue; + } + try { + field.setAccessible(true); + Object val = field.get(obj); + if (val == null) { + continue; + } + if (isPrimitiveLike(val)) { + out.put(fname, String.valueOf(val)); + } else if (val instanceof Iterable || val.getClass().isArray()) { + JSONArray arr = new JSONArray(); + if (val instanceof Iterable) { + for (Object elem : (Iterable) val) { + putJsonValue(arr, elem, visited, depth + 1); + } + } else { + int len = Array.getLength(val); + for (int i = 0; i < len; i++) { + putJsonValue(arr, Array.get(val, i), visited, depth + 1); + } + } + out.put(fname, arr); + } else if (val.getClass().getName().startsWith("my.com.tngdigital") + || val.getClass().getName().contains("Mmp")) { + JSONObject child = objectToJson(val, visited, depth + 1); + if (child != null) { + out.put(fname, child); + } + } else if (isPrimitiveLikeViaGetter(obj, fname)) { + out.put(fname, String.valueOf(val)); + } + } catch (Throwable ignored) { + } + } + return out.length() > 0 ? out : null; + } + + private static void putJsonValue(JSONArray arr, Object elem, Set visited, int depth) { + if (elem == null) { + return; + } + if (isPrimitiveLike(elem)) { + arr.put(String.valueOf(elem)); + return; + } + JSONObject child = objectToJson(elem, visited, depth); + if (child != null) { + arr.put(child); + } + } + + private static boolean isPrimitiveLike(Object val) { + return val instanceof String + || val instanceof Number + || val instanceof Boolean + || val instanceof Character; + } + + private static boolean isPrimitiveLikeViaGetter(Object obj, String fieldName) { + try { + String suffix = fieldName.substring(0, 1).toUpperCase(Locale.US) + fieldName.substring(1); + for (String prefix : new String[]{"get", "is"}) { + try { + Method m = obj.getClass().getMethod(prefix + suffix); + Class rt = m.getReturnType(); + return rt == String.class || Number.class.isAssignableFrom(rt) + || rt == boolean.class || rt == Boolean.class; + } catch (Throwable ignored) { + } + } + } catch (Throwable ignored) { + } + return false; + } + + private static boolean remember(String key) { + if (TextUtils.isEmpty(key)) { + return false; + } + if (RECENT_SET.contains(key)) { + return false; + } + RECENT_SET.add(key); + RECENT_KEYS.addLast(key); + while (RECENT_KEYS.size() > DEDUP_SIZE) { + String old = RECENT_KEYS.removeFirst(); + RECENT_SET.remove(old); + } + return true; + } + + private static String firstNonEmpty(String... values) { + if (values == null) { + return null; + } + for (String v : values) { + if (!TextUtils.isEmpty(v) && !"null".equalsIgnoreCase(v)) { + return v; + } + } + return null; + } + + private static Context getContext() { + try { + Class activityThread = XposedHelpers.findClass("android.app.ActivityThread", null); + Object app = XposedHelpers.callStaticMethod(activityThread, "currentApplication"); + if (app instanceof Context) { + return (Context) app; + } + } catch (Throwable ignored) { + } + return null; + } + + private static final class MmpSnapshot { + String packetId; + String groupId; + String title; + String senderName; + String totalAmount; + final List claims = new ArrayList<>(); + + String dedupKey() { + StringBuilder sb = new StringBuilder(); + sb.append(TextUtils.isEmpty(packetId) ? "?" : packetId).append('|'); + for (ClaimLine line : claims) { + sb.append(line.nickname).append('=').append(line.amount).append(';'); + } + return sb.toString(); + } + + String formatForForward(String channel, String sourceHint) { + StringBuilder sb = new StringBuilder(); + sb.append("[MMP统计] "); + if (!TextUtils.isEmpty(packetId)) { + sb.append("packet=").append(packetId).append(' '); + } + if (!TextUtils.isEmpty(groupId)) { + sb.append("group=").append(groupId).append(' '); + } + if (!TextUtils.isEmpty(senderName)) { + sb.append("sender=").append(senderName).append(' '); + } + if (!TextUtils.isEmpty(totalAmount)) { + sb.append("total=").append(totalAmount).append(' '); + } + sb.append("via=").append(channel); + if (!TextUtils.isEmpty(sourceHint)) { + sb.append(" src=").append(sourceHint.length() > 120 + ? sourceHint.substring(0, 120) + "..." : sourceHint); + } + sb.append("\n"); + for (ClaimLine line : claims) { + sb.append(line.nickname).append(" -> ").append(line.amount); + if (!TextUtils.isEmpty(line.claimTime)) { + sb.append(" (").append(line.claimTime).append(')'); + } + sb.append('\n'); + } + return sb.toString().trim(); + } + } + + private static final class ClaimLine { + String nickname; + String amount; + String claimTime; + } +} diff --git a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngRootBypassHook.java b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngRootBypassHook.java index b78c1c0..4515549 100644 --- a/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngRootBypassHook.java +++ b/xposed-module/src/main/java/com/miraclegarden/smsmessage/xposed/hook/TngRootBypassHook.java @@ -45,6 +45,12 @@ public final class TngRootBypassHook { /** Promon 混淆包名:1.9.10 为 vhvlnqgy,旧版为 xwwqazamx。 */ private static final String[] PROMON_PKG_PREFIXES = {"vhvlnqgy", "xwwqazamx"}; + /** + * 登录优先:少 Hook、少短路 native-bridge,避免 JNI DeleteLocalRef 损坏 → Runtime abort。 + * 能进 UserLogin 后再逐步打开诊断 Hook。 + */ + private static final boolean LOGIN_FIRST_MINIMAL = true; + private static final String SECURITY_ERROR_ACTIVITY = "my.com.tngdigital.common.security.ui.SecurityErrorActivity"; @@ -230,11 +236,15 @@ public final class TngRootBypassHook { } XposedBridge.log(TAG + " install for " + lpparam.packageName + " pid=" + Process.myPid() - + " proc=" + getProcessName()); + + " proc=" + getProcessName() + + " minimal=" + LOGIN_FIRST_MINIMAL); - // Splash 常卡死;Instrumentation 强拉即可。双通道会抢跑导致 Login 重载/卡死。 hookEarlyAttachLog(lpparam); hookConscryptStatsLogGuard(); + if (LOGIN_FIRST_MINIMAL) { + installLoginFirstMinimal(lpparam); + return; + } hookRegistrationFlowGuard(lpparam); hookSplashForceLogin(lpparam); hookLoginDismissSplash(lpparam); @@ -277,6 +287,43 @@ public final class TngRootBypassHook { hookWebViewErrorDiag(lpparam); } + /** 最小集:藏 root + 拦自杀 Java 链 + bl#a/b,不碰 native-bridge 探测短路。 */ + private static void installLoginFirstMinimal(XC_LoadPackage.LoadPackageParam lpparam) { + hookSplashForceLogin(lpparam); + hookLoginDismissSplash(lpparam); + // 点区号会走 onCountryClick → i7.l loading;真 show → HWUI setName/gralloc abort + hookLoadingDialogSkip(); + // setName 一律 noop(A16+Zygisk 下 native setName→dlopen libandroid 易 ART abort)。 + // 区号 Compose 必须 HW:软件绘制会 IllegalArgumentException(hardware bitmaps)。 + hookHardwareRendererSetNameNoop(); + hookCallingCodeAllowHwSurface(lpparam); + + RootBypassHelper.hookFileExists(lpparam); + RootBypassHelper.hookRuntimeExec(lpparam); + RootBypassHelper.hookSystemGetProperty(lpparam); + ProcMapsFilterHook.install(lpparam); + + hookAntiSuicide(); + hookPromonSuicideUpstream(lpparam); + hookUncaughtPromonException(lpparam); + hookKillApplicationHandler(lpparam); + hookBlockSecurityErrorLaunch(lpparam); + hookPromonNativeGuard(lpparam); + hookPromonLifecycle(lpparam); + hookActivityThreadExit(lpparam); + hookFinishAllActivityAndKillApp(lpparam); + hookSecurityUrlOpeners(lpparam); + hookJailBroken(lpparam); + hookJailBrokenRpc(lpparam); + hookAppSecurityManager(lpparam); + hookAppSecurityCallbacks(lpparam); + hookSecurityErrorActivity(lpparam); + // seccomp 开着时必须 stub TigerTally init,否则 fork getprop 永不退出 → App.onCreate ANR + hookTigerTally(lpparam); + hookTigerTallyAppWrappers(lpparam); + XposedBridge.log(TAG + " login-first minimal hooks armed"); + } + /** * Zygisk/命名空间下 android.util.StatsLog native 常 UnsatisfiedLinkError, * Conscrypt TLS 指标线程一写就炸 → ART fatal。直接 noop 指标写入。 @@ -1066,30 +1113,130 @@ public final class TngRootBypassHook { } /** - * 非区号:清 HW flag + 拦 enableHW(成对,防半开黑屏); - * 区号 Compose / BottomSelect:完整 HW(软件绘制 Compose 必黑)。 - * Dialog.show 窗口期可拦 setName。 + * 一律跳过 HardwareRenderer.setName。 + * Pixel/A16 + Zygisk 命名空间下 native setName → dlopen("libandroid.so") 失败会 ART abort。 */ - private static void hookHwuiBySurfacePolicy(XC_LoadPackage.LoadPackageParam lpparam) { + private static void hookHardwareRendererSetNameNoop() { try { XposedHelpers.findAndHookMethod( "android.graphics.HardwareRenderer", null, "setName", String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { - if (Looper.myLooper() != Looper.getMainLooper()) { - return; - } - if (!shouldBlockSetNameOnMain()) { - return; - } param.setResult(null); } }); - XposedBridge.log(TAG + " hooked HardwareRenderer.setName (dialog-only block)"); + XposedBridge.log(TAG + " hooked HardwareRenderer.setName (always noop)"); } catch (Throwable t) { - XposedBridge.log(TAG + " HardwareRenderer.setName hook failed: " + t.getMessage()); + XposedBridge.log(TAG + " HardwareRenderer.setName noop failed: " + t.getMessage()); } + } + + /** + * 区号 Compose:标记 surface + 保证 HW flag(勿清、勿拦 enableHW)。 + * 软件绘制会崩:Software rendering doesn't support hardware bitmaps。 + */ + private static void hookCallingCodeAllowHwSurface(XC_LoadPackage.LoadPackageParam lpparam) { + XC_MethodHook markOn = new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + Intent intent = extractIntent(param.args); + if (isCallingCodeIntent(intent)) { + callingCodeSurfaceActive = true; + XposedBridge.log(TAG + " callingCode surface ON (HW path)"); + } + } + }; + try { + XposedHelpers.findAndHookMethod( + Activity.class, "startActivity", Intent.class, markOn); + XposedHelpers.findAndHookMethod( + Activity.class, "startActivity", Intent.class, Bundle.class, markOn); + } catch (Throwable t) { + XposedBridge.log(TAG + " startActivity callingCode mark failed: " + t.getMessage()); + } + try { + XposedHelpers.findAndHookMethod( + Instrumentation.class, + "execStartActivity", + Context.class, + android.os.IBinder.class, + android.os.IBinder.class, + Activity.class, + Intent.class, + int.class, + Bundle.class, + new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + Intent intent = (Intent) param.args[4]; + if (isCallingCodeIntent(intent)) { + callingCodeSurfaceActive = true; + XposedBridge.log(TAG + + " callingCode surface ON (execStart HW)"); + } + } + }); + } catch (Throwable t) { + XposedBridge.log(TAG + " execStart callingCode mark failed: " + t.getMessage()); + } + try { + XposedHelpers.findAndHookMethod( + Instrumentation.class, + "callActivityOnCreate", + Activity.class, + Bundle.class, + new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + Activity activity = (Activity) param.args[0]; + if (activity == null) { + return; + } + if (isCallingCodeActivity(activity.getClass().getName())) { + callingCodeSurfaceActive = true; + try { + Window window = activity.getWindow(); + if (window != null) { + window.addFlags( + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + } + } catch (Throwable ignored) { + } + XposedBridge.log(TAG + + " callingCode onCreate — keep HW for Compose"); + } + } + }); + XposedHelpers.findAndHookMethod( + Instrumentation.class, + "callActivityOnDestroy", + Activity.class, + new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + Activity activity = (Activity) param.args[0]; + if (activity != null + && isCallingCodeActivity(activity.getClass().getName())) { + callingCodeSurfaceActive = false; + XposedBridge.log(TAG + " callingCode surface OFF"); + } + } + }); + } catch (Throwable t) { + XposedBridge.log(TAG + " callingCode lifecycle mark failed: " + t.getMessage()); + } + XposedBridge.log(TAG + " callingCode allow-HW surface armed"); + } + + /** + * 非区号:清 HW flag + 拦 enableHW(成对,防半开黑屏); + * 区号 Compose / BottomSelect:完整 HW(软件绘制 Compose 必黑)。 + * Dialog.show 窗口期可拦 setName。 + */ + private static void hookHwuiBySurfacePolicy(XC_LoadPackage.LoadPackageParam lpparam) { + // setName 一律 noop(A16 Zygisk 下 native setName 会 abort) + hookHardwareRendererSetNameNoop(); try { Class vri = XposedHelpers.findClass("android.view.ViewRootImpl", null); @@ -1976,7 +2123,9 @@ public final class TngRootBypassHook { } /** - * Promon lifecycle:1.9.10 用 vhvlnqgy.u,旧版用 w。只吞异常,不全拦。 + * Promon lifecycle:1.9.10 用 vhvlnqgy.u,旧版用 w。 + * 实测 afterHook 仍跑 native → DeleteLocalRef 损坏 → ART Runtime abort (signal 6)。 + * 登录优先:onActivity* / onApplication* 全部 noop,不调原 native。 */ private static void hookPromonLifecycle(XC_LoadPackage.LoadPackageParam lpparam) { Class promonExc = findPromonClass(lpparam.classLoader, "W"); @@ -2005,25 +2154,37 @@ public final class TngRootBypassHook { if (!name.startsWith("onActivity") && !name.startsWith("onApplication")) { continue; } - XposedBridge.hookMethod(method, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - if (!param.hasThrowable()) { - return; + if (LOGIN_FIRST_MINIMAL) { + // 不调原 native:避免 JNI DeleteLocalRef → ART abort + XposedBridge.hookMethod(method, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + setSafeHookResult(param, method); } - Throwable t = param.getThrowable(); - if (isPromonThrowable(t, promonExc)) { - XposedBridge.log(TAG + " swallowed " + t.getClass().getSimpleName() - + " in " + lifecycleName + "#" + method.getName()); - param.setThrowable(null); + }); + } else { + XposedBridge.hookMethod(method, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + if (!param.hasThrowable()) { + return; + } + Throwable t = param.getThrowable(); + if (isPromonThrowable(t, promonExc)) { + XposedBridge.log(TAG + " swallowed " + t.getClass().getSimpleName() + + " in " + lifecycleName + "#" + method.getName()); + param.setThrowable(null); + } } - } - }); + }); + } hooked++; } if (hooked > 0) { - XposedBridge.log(TAG + " hooked " + hooked - + " " + lifecycleName + " lifecycle method(s) (afterHook only)"); + XposedBridge.log(TAG + " hooked " + hooked + " " + lifecycleName + + " lifecycle (" + + (LOGIN_FIRST_MINIMAL ? "noop (login-first)" : "afterHook only") + + ")"); } } catch (Throwable t) { XposedBridge.log(TAG + " " + lifecycleName + " lifecycle hook failed: " @@ -2061,8 +2222,8 @@ public final class TngRootBypassHook { } /** - * bl/R 全方法 short-circuit:a/b 之外的方法仍会跑 native,~40s 后 stack_chk/SEGV。 - * a.run 是 bl#b 后台 Runnable,必须 beforeHook 直接 return。 + * 登录优先:只 short-circuit bl#a / bl#b(文档有效路径)。全拦 bl/R 六个方法会破坏 + * u.onActivityCreated JNI → ART abort;a.run 仍单独 noop。 */ private static void hookPromonBlSwallowExceptions(XC_LoadPackage.LoadPackageParam lpparam) { for (String simple : new String[]{"bl", "R"}) { @@ -2079,6 +2240,10 @@ public final class TngRootBypassHook { try { int hooked = 0; for (Method method : clazz.getDeclaredMethods()) { + String methodName = method.getName(); + if (!"a".equals(methodName) && !"b".equals(methodName)) { + continue; + } XposedBridge.hookMethod(method, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) { @@ -2089,7 +2254,7 @@ public final class TngRootBypassHook { } if (hooked > 0) { XposedBridge.log(TAG + " hooked " + hooked + " " + clazz.getName() - + " method(s), all short-circuit"); + + " method(s), a/b short-circuit only"); } } catch (Throwable t) { XposedBridge.log(TAG + " " + clazz.getName() + " short-circuit failed: " @@ -2423,18 +2588,56 @@ public final class TngRootBypassHook { } /** - * TigerTally:init/initCommon + genericNt1 必须短路。 - * 只短路 genericNt1 而放行 init 会导致 encodeUid 缺失(cloudauth 403)、JNI 损坏、主线程 ABRT 无响应。 + * seccomp 开着时:必须 stub init/initCommon/genericNt1,否则 fork getprop 卡死。 + * seccomp 关且非登录优先:只 stub genericNt1 探测。 */ private static boolean isTigerShortCircuit(String className, String methodName) { if ("com.aliyun.TigerTally.TigerTallyAPI".equals(className) - && ("init".equals(methodName) || "initCommon".equals(methodName))) { - return true; + || "com.aliyun.TigerTally.t.B".equals(className) + || "com.aliyun.TigerTally.t.C".equals(className)) { + if ("init".equals(methodName) || "initCommon".equals(methodName) + || "genericNt1".equals(methodName) || "initialize".equals(methodName)) { + return true; + } } return "com.aliyun.TigerTally.t.B".equals(className) && "genericNt1".equals(methodName); } + /** TNG 封装层:CaptchaInitializer / TigerTallyApiWrapper 直接 noop,避免 Startup latch 卡住。 */ + private static void hookTigerTallyAppWrappers(XC_LoadPackage.LoadPackageParam lpparam) { + String[] classes = { + "my.com.tngdigital.captcha.TigerTallyApiWrapper", + "my.com.tngdigital.app.launcher.initializer.CaptchaInitializer", + }; + for (String className : classes) { + try { + Class clazz = XposedHelpers.findClass(className, lpparam.classLoader); + int n = 0; + for (Method method : clazz.getDeclaredMethods()) { + String name = method.getName(); + if (!"initialize".equals(name) && !"init".equals(name) + && !"create".equals(name)) { + continue; + } + XposedBridge.hookMethod(method, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) { + XposedBridge.log(TAG + " TigerTally wrapper SC " + + className + "#" + method.getName()); + setSafeHookResult(param, method); + } + }); + n++; + } + XposedBridge.log(TAG + " hooked TigerTally wrapper " + className + " n=" + n); + } catch (Throwable t) { + XposedBridge.log(TAG + " TigerTally wrapper " + className + + " skipped: " + t.getMessage()); + } + } + } + private static Object safeJnicReturn(int cmd, Object[] args) { if (args != null) { for (Object arg : args) {