起因
玩 Android 的人多少都折腾过 Root、刷机、装 Xposed 模块。折腾久了,自然会想知道:我的设备现在到底暴露了多少痕迹?哪些检测手段能发现我?
市面上有 Momo 这样的检测工具,后来用一些比较新的检测器,发现它们给出的结果全是谜语——“Abnormal Environment”。。。哪里不 normal 了?
我不喜欢猜谜游戏,所以就自己写了一个。这就是 Duck Detector 的来历
它能检测什么
Duck Detector 目前覆盖了 15 个以上的检测维度,大致分为几类:
Root 与权限提升
- Su 二进制文件扫描(覆盖 20+ 常见路径)
- Magisk / KernelSU / APatch 守护进程检测
- SELinux 状态检查(Java + Native 双重验证)
框架注入
- Zygisk 注入检测:FD Trap、SoList 链表分析、atexit 回调、smaps 页面篡改等 7 种方法
- LSPosed/Xposed 检测:类加载、内存扫描、堆残留、栈分析、Logcat 泄漏等 15 种方法
硬件与启动链
- TEE 可信执行环境真实性验证(20+ 子检测项,包括 Key Attestation、Binder 时序分析、StrongBox 验证等)
- Bootloader 解锁状态与 Verified Boot 状态
- Samsung Knox 保修位检测
系统完整性
- Mount 异常检测(overlayfs、bind mount、命名空间异常)
- 内核修改与自定义 ROM 识别
- 系统属性伪装检测
- Play Integrity Fix 模块检测
- 审计日志篡改检测
技术选型
Kotlin + C++ 混合架构
纯 Java/Kotlin 层的检测很容易被 Hook 绑架,也会被 Java 束手束脚,所以思来想去最后扩展了 Native 部分。
Duck Detector 采用混合架构:用 Kotlin 做业务编排和 UI,能在 Java 层搞定的就在 Java 层写;搞不定的就用 C++ 通过 JNI 来 syscall 或进行其他检测。
并行检测
所有检测器通过 Kotlin Flow 异步执行,UI 实时展示每个检测器的进度和结果。TEE 检测中的 20 多个子项也是并行跑的——Key Attestation 和网络 CRL 验证都比较耗时,串行跑体验会很差。
UI
Jetpack Compose + Material 3,支持明暗主题。检测结果用三态展示:安全、警告、危险。每个检测器都有独立的结果卡片,展开后可以看到具体的检测方法和命中项。
目前支持 11 种语言:中文、英文、日语、韩语、俄语、泰语、越南语、印尼语、土耳其语、阿拉伯语。(Made by ChatGPT & Claude)
一些设计原则
不打谜语:检测到什么就说什么,哪个方法命中了、影响是什么,全部摊开讲。我不喜欢猜测游戏。
网络请求需要用户同意:CRL 证书吊销验证是唯一需要联网的功能,首次使用会弹出授权对话框,不同意就跳过。
最后
Duck Detector 对我来说既是一个实用工具,也是一个持续学习 Android 安全机制的过程。每次 Magisk 或 LSPosed 更新隐藏策略,都意味着检测方法需要跟进——这种攻防博弈本身就很有意思。
如果你也在折腾 Android,欢迎试试:duck.eltavine.me