- 「连接」页点「启动服务」——服务端可能已停(
:8788没有监听)。 - 从未部署过(或换过设备)时,先点「部署内置二进制并启动」。
- 仍失败点「自检」,按输出逐项检查:root 是否
uid=0、/data/local/tmp/ggmcp/ggmcp是否存在且有可执行权限、进程是否在跑、8788 是否监听。 - 命令行排查:
adb shell su -c 'sh /data/local/tmp/ggmcp/ggmcp_ctl.sh status',或直接看ggmcp.log。
旧的服务端进程还占着二进制文件。当前版本部署时会先停服再写入;如果你用的是老版本或手工 adb push,先点「停止服务」(或 su -c 'pkill -x ggmcp')再部署。
点「查看日志」看 ggmcp.log 末尾内容。常见原因:
- 二进制架构不匹配(例如把 arm64 的二进制推到了 x86_64 模拟器)——重新用「部署内置二进制并启动」,应用会按 ABI 自动选;
- 二进制被截断(传输中断),重新部署一次;
- 端口被占用:
su -c 'netstat -tlnp | grep 8788'。
- 确认设备确实已 root(Magisk / KernelSU / 模拟器自带
su)。 - Magisk 里给本应用授权(可在 Magisk → 超级用户里手动允许),再回到应用重试。
- 部分机型需要关闭「Magisk Hide / Zygisk 隐藏」对本应用的隐藏,否则
su请求会被静默拒绝。 - 应用会逐个探测常见
su路径(/system/bin/su、/debug_ramdisk/su、/data/adb/ksu/bin/su等),并在「测试 root」输出里显示探测记录,便于判断是路径问题还是授权问题。
- 需要先点「写入控制/自启脚本」;脚本会写到
/data/adb/service.d/ggmcp.sh(Magisk / KernelSU 的启动目录)。 - 确认目录存在且有执行权限:
su -c 'ls -l /data/adb/service.d/'。 - 脚本里有
sleep 20,开机后要等一会儿服务才起来。 - 部分系统会在开机后清理
/data/local/tmp,此时二进制会被删掉,需要重新部署(可以把二进制放到/data/adb/下改用自启脚本的路径)。
- 区域问题:
anonymous在现代 Android 上几乎是空的,默认all才是全扫。 - 类型问题:金币可能是
dword也可能是float/double,先试auto。 - 数值确实不在内存里:可能是加密值(用 Xor 加密搜索)、可能是服务器下发(本地只是显示),或数值显示与实际存储差了倍数/单位。
- 数值会变:用两步搜索(搜旧值 → 让值变化 → refine)。
- 换更精确的类型(
auto→dword)。 - 用两步 refine 缩小。
- 换区域(
all→heap)。 - 用「结果」页的「分析结果」看值分组和地址相邻关系,挑更像结构体的地址。
- 「工具」页调小
searchCandidateMax(内存紧张时)。
说明该地址只是副本或被每帧重算 —— 用「冻结」按住,或者去改真正的数据源(结合「指针扫描」与「计算偏移」找静态地址)。
| 模式 | 条件 | 说明 |
|---|---|---|
kernel |
安装 KPatch-Next 且加载了 MemoryDriver_IOCTLhook.kpm |
走内核 ioctl 通道,速度快、痕迹小 |
processvm |
内核通道不可用 | 用 process_vm_readv 系统调用 |
memfile |
前两者都不可用 | 读 /proc/<pid>/mem,兼容性最好、速度最慢 |
三种模式功能一致,只是性能与隐蔽性不同;看到 memfile 不代表出错。
冻结是“按固定间隔持续写入”,间隔越小越耗电。验证完及时「解冻全部」,或把 freezeIntervalMs 调大(如 200ms)。
上游 v2.9.13 调整了工具命名,导致两个名字对应的实现不一致:
- 读 GG 数据文件的实现,在上游源码里叫
gg_read_gg_file(未登记在工具列表中,只有 handler); - 工具列表里登记的
gg_list_gg_files,在上游源码里没有对应的 handler。
因此:
| 服务端来源 | 「读GG文件」按钮 | 「列GG数据文件」按钮 |
|---|---|---|
| APK 内置二进制(v2.9.x 快照) | 报未知工具 | 可用 |
用本仓库 server/ 源码重新编译 |
可用 | 报未知工具 |
处理办法:用能用的那个按钮;或在「工具 → RAW 调用」里手动填可用的工具名(gg_read_gg_file 或 gg_list_gg_files)。等上游把两者对齐后即可同时可用。
- 确认 GG 修改器正在运行(绑定会检查进程存活);
- 改版 GG 的随机包名也能被识别(靠
/data/data/*/files/GG-*目录特征),但如果 GG 已被完全卸载/冻结则无法绑定; - 如果设备上装了多个 GG,可在
gg_bind_gg里用package参数指定。
脚本必须自己把结果写出去,例如:
local f = io.open("/sdcard/ggmcp/myresult.out.txt", "w")
f:write(tostring(gg.getResultsCount()))
f:close()写入位置要和应用「读脚本输出」读取的 <脚本名>.out.txt 一致(默认目录 /sdcard/ggmcp/);另外脚本要真正在 GG 里执行过。
旧版本在后台线程切页时会出现该问题;当前版本切页会先清焦点、收起键盘、滚回顶部,已修复。若仍遇到,请附日志提 Issue。
系统的电池优化会杀掉后台进程,导致长请求中断:
- 在系统设置里把本应用加入「不优化/允许后台运行」白名单;
- 在最近任务里给应用加锁;
- 长搜索建议缩短范围(先
heap),或分多次 refine。
内置 arm64-v8a(真机)与 x86_64(模拟器 / x86 设备)两种服务端二进制。不支持 32 位(服务端使用了 64 位地址常量,无法编译 32 位目标);其它架构请自行提供 64 位 ggmcp 并用「导入二进制文件…」。
不会。应用只与本机 127.0.0.1:8788 通信(或你手动填写的局域网地址),没有统计、没有广告、没有第三方 SDK。日志只保存在应用内存中,随时可清空。
不能。部署服务端、读写其它进程内存、暂停进程都需要 root。没有 root 时应用可以安装和打开,但核心功能不可用。
应用 minSdk 26、targetSdk 34,在更高版本 Android 上通常可正常运行;界面为手机竖屏设计,平板可用但布局不会自适应放大。若遇到问题请提 Issue 并注明系统版本。
服务端本身是 Linux/Android 的 Go 程序(依赖 /proc 与内核通道),不能直接在 Windows/macOS/iOS 上运行。电脑端可以用 adb forward tcp:8788 tcp:8788 后直接用 curl 或 MCP 客户端操作手机上的服务(见 TOOLS.md)。
请按 CONTRIBUTING.md 收集信息后提交 Issue,务必附上「日志」页的调用记录与「自检」输出。
server/ 是上游项目的逐字快照,功能与协议问题请提到上游仓库。