首页 › App 反作弊
一段话概括:像 KKPoker 这样手机优先的扑克 App,靠的是分层的完整性栈,而非单一检查。它验证设备环境(这是真实、未改动的手机吗?),验证运行时的自身代码(二进制是否被篡改?),并长期观察账号如何对局。机器人和自动化工具通常至少会触发其中一层——因为在手机上启用自动化所需的工具,正是这些检查所要寻找的痕迹。
这是一篇面向研究的讲解,说明现代手机扑克 App 中完整性系统通常是怎么构建的。它对整个品类是通用的——同样的原理在主流 App 优先牌室中都会出现——而且写作目的是解释机制,而非提供绕过指南。涉及 KKPoker 时,也仅将其作为 App 优先产品的例子,而非桌面客户端。
为什么"手机"改变了威胁模型
在桌面扑克中,经典机器人位于客户端外部。它截取屏幕、推理牌面、驱动鼠标。扑克客户端往往无法直接看到机器人;检测在很大程度上依赖事后对对局模式的分析。
手机 App 把这一点反转了。在一台锁定的手机上,并不存在方便的"外部"。要实现自动化,攻击者通常必须做以下三件事之一:在模拟器而非真实手机上运行 App;root 或越狱设备以获得自动化所需的权限;或重打包 / Hook App 以注入控制。每一种都会以 App 可测量的方式改变环境。因此,手机端的威胁模型与其说是"在牌谱里找出机器人",不如说是"在一手牌发出之前就识别被篡改的环境"。
第一层——环境与设备检查
完整性栈首先要确立的是它正运行在什么之上。问题很具体:
- 这是模拟器吗?模拟器会留下指纹——合成的硬件标识、缺失的传感器、默认设备名、可辨认的 CPU 与 GPU 字符串,以及与物理芯片不同的时序特征。
- 设备是否已 root 或越狱?存在 root 管理工具、su 二进制、可写系统分区或已知 root 框架,都是常规 App 沙盒可被绕过的强信号。
- 是否存在 Hook 框架?用于挂钩运行中 App 的插桩工具,会留下可被枚举的可加载模块与进程痕迹。
现代 App 不会全部手工实现这些。平台验证服务让 App 能向操作系统厂商询问设备与 App 是否处于已知良好状态,由厂商签名背书,而非设备自报。这把信任边界从(可能已被攻陷的)设备移到了平台上,而平台要伪造困难得多。
为什么单一检查永远不够
任何单项环境检查都可能被足够有动机的攻击者攻破——模拟器指纹可以打补丁,root 可以隐藏。设计假设是每一层都会泄露。其强度来自叠加多个相互独立的检查,使得通过其中一项的环境仍会败在另一项上,并把残余的不确定性送入服务端审查。
第二层——运行时验证与篡改检测
通过环境检查还不够;App 还必须确信它就是它自己。运行时验证要问的是:正在运行的代码,是否就是当初签名并发布的那份代码?
- 代码签名与完整性校验——App 检查其安装包签名是否与原始发布者一致,关键代码段是否未被改动。
- 反 Hook 与反调试——App 监视是否有调试器附着到其进程,是否有函数 Hook 重定向了它自身的调用,这两者都是读取或改写 App 内行为的经典手段。
- 重打包检测——被破解或修改的版本(用不同密钥重签名、替换资源)会在与预期签名比对时校验失败。
对自动化作者而言,这是最棘手的一层。要稳定地驱动一个手机 App,通常意味着修改它——注入无障碍 Hook、给某个方法打补丁,或者重打包客户端。而这些恰恰是验证机制要浮现出来的目标。一个靠从外部读取并驱动正版、未改动 App 的自动化,在手机上比在桌面上难做得多,正因为平台沙盒不会把这种访问权授予普通 App。
第三层——行为遥测
环境检查与验证守护的是边界。行为遥测则防御一切越过边界的东西——包括用另一台设备上的外部求解器辅助的真人,这种情况在设备端完全不留篡改痕迹。
行为系统会对正常真人怎么打牌建模,并标记偏差:
| 信号 | 像真人的样子 | 像自动化的样子 |
|---|---|---|
| 操作时机 | 多变、依情境而定的停顿 | 恒定或精确得可疑的间隔 |
| 决策质量与耗时 | 更难的位置耗时更长 | 复杂位置仍快速且近乎最优 |
| 下注尺度 | 取整、偶有不一致 | 求解器级精度并被完全重复 |
| 对局节奏 | 有休息、疲劳、状态漂移 | 长时间、节拍般、无疲劳 |
| 输入几何 | 自然的触摸抖动 | 每次相同的点击坐标 |
这些信号单独都不是定论——很多强力真人也打得快、下注精确。遥测产出的是风险分,而非裁决。高风险账号会被送去人工审查,并与已采集的环境和验证信号关联。一种过得去的求解器对局模式,出现在被标记的模拟器、且二进制被篡改的环境上,与同样模式出现在干净、已通过验证的手机上,是两种截然不同的情形。
服务端审查把这一切串起来
三层都向上汇集的原因在于,决定性逻辑位于服务端,App 无法把它打补丁打掉。牌是在服务端发的;客户端只负责渲染。这意味着机器人能读到真人所见,却看不到未展示给它的底牌,也无法改写结果。服务端关联还能抓住任何单台设备都暴露不了的模式——共享资金、同步的对局,或在"互不相关"账号间出现的不可能的结果分布。
这对 KKPoker 上的机器人意味着什么
把各层合起来看:在 App 优先的扑克产品上做自动化既昂贵又高风险。模拟器和 root 设备是响亮的信号;重打包客户端通不过验证;机器般规律的对局在遥测中清晰可见;而无论如何,牌都握在服务端手里。熟练的操作者仍可尝试,第二块屏幕上的外部求解器也能避开设备端检查——但它接下来必须在有真人参与的情况下击败行为审查。在俱乐部 App 上,更可靠的获利方式往往根本不涉及求解器,而是涉及人:那些藏在俱乐部与联盟结构里的串通与筹码流动风险。