Duck Detector — 我为什么要写一个环境检测工具

发表于 2025-02-10 20:00 786 字 4 min read

从一个简单的想法开始,到一个拥有 15+ 检测器、支持 11 种语言的 Android 安全检测应用。聊聊 Duck Detector 的由来、设计思路和一些技术细节。

起因

玩 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

© 2025 - 2026 Eltavine @Eltavine
Powered by theme astro-koharu · Inspired by Shoka