一个通过 Zygisk 注入目标 App、直接遍历原生 View 树,并通过 TCP 回环端口按需返回界面节点信息(文字、资源ID、坐标、可点击状态)的 Magisk 模块,无需使用无障碍服务。

Stars

8

7 天增长

暂无数据

Fork 数

4

开放 Issue

0

开源协议

MIT

最近更新

2026-07-27

AI 仓库情报摘要
FR-AI / ANALYSIS

为什么值得关注

它在不触发无障碍服务检测的前提下,提供了实时、完整的原生控件树获取能力,比无障碍更隐蔽、更高效,非常适合已 root 设备上的自动化与逆向场景。

适合谁使用

  • 需要隐蔽操作、已 root 的自动化用户
  • 开发无需无障碍权限的测试工具的开发人员
  • 逆向分析 App UI 布局的研究者
  • 安全研究人员:在不留下无障碍痕迹的前提下观察 App 行为

典型使用场景

  • 自动化脚本获取 App 界面信息并进行操作(点击坐标由外部实现)
  • 免无障碍的视频流自动播放或点赞控制
  • 从屏蔽无障碍服务的 App 中提取文本与控件数据
  • 跨应用 UI 状态监控,用于调试或自动化框架

项目优势

  • 不依赖无障碍服务,目标 App 无法检测到注入
  • 进程内直接读取 View 树,数据实时、完整,包含对话框和弹出窗
  • 按需拉取,闲置时零开销,CPU 和内存占用极低
  • 配置简单(包名和端口),无需重新编译模块

使用前须知

  • 需要 root 权限并启用 Zygisk(Magisk 或 Zygisk Next)
  • 仅覆盖原生 View,WebView、Flutter 等自绘内容不可见
  • 只读不操作,点击等交互需用户通过其他方式(如 input tap)实现

README 快速开始

Zygisk NodeInfo

用 Zygisk 注入目标 App,在其进程内直接遍历原生 View 树,通过一个 TCP loopback 端口按需把当前前台页面的节点信息(文字 / 资源 id / 类名 / 屏幕坐标 / 可点击等)以 JSON 返回。不使用无障碍服务

一句话:给自动化脚本一个「不开无障碍、也能拿到控件树」的取数通道。


特性

  • 不依赖无障碍(AccessibilityService):目标 App 检测不到你开了无障碍,也不占用系统唯一的无障碍焦点通道。
  • 进程内直读 View 树:数据源就是 App 自己的 WindowManagerGlobal.mViews,比无障碍事件更实时、更完整(含 Dialog / Popup)。
  • 只回当前焦点窗口:自动过滤被覆盖但未销毁的旧 Activity,避免拿到上一个页面的“幽灵节点”。
  • 按需拉取(pull):客户端每次需要时连一次端口取一帧,agent 平时不做任何事,开销低、footprint 小。
  • TCP loopback,无需 root 读取:客户端(另一个普通 App / 电脑 adb)直接连 127.0.0.1:,绕开 unix socket 的 SELinux MLS 限制与「每-App 挂载命名空间」文件隔离。
  • 目标包名 / 端口运行时可配:改 config.prop 即可,无需重编。

工作原理

┌───────────────────────── 目标 App 进程 (untrusted_app) ─────────────────────────┐
│  Zygisk (native module.cpp)                                                     │
│    preAppSpecialize : 读 config.prop 判断是否目标;是→把 agent dex 读进内存      │
│    postAppSpecialize: InMemoryDexClassLoader 加载 agent → NodeAgent.start()      │
│                                                                                 │
│  agent (dex, 反射)                                                              │
│    ServerSocket 127.0.0.1:  ← accept 一次                                 │
│    → 主线程遍历「当前有窗口焦点」的 View 树 → JSON → 写回 socket → close          │
└─────────────────────────────────────────────────────────────────────────────┘
                    ▲  连接一次取一帧
                    │  TCP loopback(untrusted_app 间标准放行)
┌───────────────────┴───────────────────┐
│  你的客户端:另一个 App / 电脑 adb      │
└───────────────────────────────────────┘

要点:

  • Zygisk 在 preAppSpecialize 判断进程;非目标进程立刻 DLCLOSE,零残留。
  • getModuleDir() 的 fd 只在 specialize 前有效,所以 config 与 dex 都在 preAppSpecialize 读入内存postAppSpecialize(ART 就绪)再加载。
  • postAppSpecialize 时宿主 Application 尚未创建,用系统类加载器作父加载器即可(agent 只依赖框架类 + 反射)。
  • View 访问必须在主线程,agent 用主线程 Handler.post + 超时取回结果。

依赖

  • 已 root 且启用 Zygisk 的设备(Magisk 内置 Zygisk,或 APatch/KernelSU 配 Zygisk Next)。
  • 构建机:Android NDK(含 CMake 工具链)+ Android SDKd8android.jar)。

构建

export ANDROID_NDK=~/Library/Android/sdk/ndk/27.0.12077973
export ANDROID_SDK=~/Library/Android/sdk
./build.sh
# 产物:dist/zygisk_nodeinfo.zip

build.sh 会自动拉取官方 zygisk.hpp、用 d8 编 agent dex、用 CMake 编 .so、打包成 Magisk 模块 zip。默认只编 arm64-v8a,需要 32 位在脚本里加 armeabi-v7a


配置

编辑 `mo

项目描述

不开无障碍:用 Zygisk 从目标进程内部直读 View 树的自动化取数方案

相关仓库与替代方案

根据分类、Topic 和编程语言匹配的相似项目。

oversecured
oversecured GitHub avatar

Samsung_Vulnerabilities

Oversecured discloses a report of 176 vulnerabilities discovered in Samsung preinstalled apps between 2022 and 2025, with 140 detailed, all fixed in collaboration with Samsung.

Java
310
wxxsfxyzm
wxxsfxyzm GitHub avatar

MiuiBackGestureHook

An LSPosed module that hooks MIUI SystemUI back gestures using modern Xposed API 102 for research and customization.

Java
86
SangLuoCN
SangLuoCN GitHub avatar

OneStep4

OneStep4.0 is a multi-window desktop container for Android that requires root or system-level privileges, enabling a main window with several side windows for efficient app multitasking.

Java
84