ridhoae303/android-frida-hooks

GitHub: ridhoae303/android-frida-hooks

一套用于 Android 设备指纹伪装和基本完整性绕过的 Frida 脚本,帮助安全研究人员测试应用的防篡改检测能力。

Stars: 11 | Forks: 0

# Android Frida Hooks 一些用于 Android 设备伪装、基本完整性绕过以及测试应用如何检测篡改的 Frida 脚本。没什么花哨的,只是我用来学习和测试的东西。 这些脚本仅供**教育和安全研究使用**。请勿在您不拥有或未获得明确测试许可的应用上运行。违规后果自负。 [![社交横幅](https://static.pigsec.cn/wp-content/uploads/repos/cas/73/73c8212e3d8e4db8f2400c8d6a18b5eb26f6a85de137e6a79525132621ffbd1e.jpg)](https://github.com/ridhoae303/android-frida-hooks) ## 包含内容 两种不同的方法,一个目标:在不太明显的情况下调整应用所看到的内容。 | | 4.1.0 (全面隐蔽) | 5.0.0-lean | |---|---|---| | **理念** | Hook 一切,阻止 native 访问,深度隐藏 | 仅 Hook 必要内容,保持安静 | | **Java hooks** | 30+ 种方法(签名、Build、SSL、电话、文件 I/O、进程列表、shell 命令等) | ~20 种方法(标识符、属性、完整性、文件隐藏、/proc 过滤) | | **Native hooks** | 选择性 Hook open、fopen、dlopen、property_get | 无 | | **Proc 过滤** | 是 — Java 扩展 + native 选择性 | 是 — 仅 Java 扩展(maps、status、tcp、tasks、fd) | | **Mount/mem 信号** | 无 mount 拦截;通过 /proc 清理减少内存信号 | 无 native 交互;因 hook 较少,内存信号较低 | | **检测面** | Hook 数量较多,但覆盖更深,OS 噪声更少 | Hook 数量较少,ArtMethod 修改更少,logcat 更干净 | | **最适用于** | 具有严格 root/内存检测的应用 | 主要检查设备 ID 和基本完整性的应用 | | **Duck Detector 结果** | 切断了大量信号;mount 信号消失;TEE/内存信号依然存在 | 信号更少,但仍有残留 | ### 4.1.0 — "全面隐蔽" 试图在不触发常见 OS 层面异常的情况下尽可能全面地覆盖。Hook 用于签名、安装程序、电话、系统属性的 Java 方法,加上**选择性**的 native libc 函数,以阻止与 Frida 相关的文件访问,同时不触碰 `/proc/mountinfo` 或 `/proc/mounts`。扩展的 Java 层面 `/proc` 过滤将 Frida 从 maps、smaps、status、tcp、task 线程和 fd 列表中隐藏起来。Native 属性伪装与 Java 值同步,以避免一致性警告。 当应用严格进行 root 检查、扫描自身内存,或试图通过进程列表、端口连接或线程名检测 Frida 时,请使用此版本。 ### 5.0.0-lean — "干净且极简" 剥离了所有非绝对必要的功能。没有 native hooks,没有 Build 字段修改,默认没有签名替换。保留核心的设备 ID 伪装、系统属性覆盖、root 文件隐藏、轻量级防杀、Play Integrity 重定向,以及仅针对 Java 的扩展 `/proc` 清理(maps、smaps、status、tcp、task 线程、fd)。现在还包含 Xposed stub、MAC 地址伪装、文件列表隐藏和签名检查绕过——所有这些依然完全不涉及 native。 这个版本更干净。更少的 hooks,更少的噪声,单靠 ArtMethod 枚举更难被扫描器发现。Duck Detector 仍然能抓到更深层次的东西(SELinux、TEE 认证),但内存占用要小得多。 ## 两个版本的共同特性 - IMEI、Android ID、电话号码生成(Luhn 校验有效的 IMEI、随机十六进制 ID、印尼手机号前缀) - 所有生成的值都可以在脚本运行时通过 RPC 进行更改 - Play Integrity / DroidGuard token 伪造(实验性) - SafetyNet 认证 hook(返回 null) - 进程列表过滤,隐藏与 Frida 相关的条目 - 拦截调试器检测(`isDebuggerConnected()` 永远返回 false) - 隐藏 Root 二进制文件检查 - 将安装程序包伪装为 Google Play - 将 `ro.debuggable`、`ro.secure`、`ro.build.tags` 设置为发布版本的值 ## 两个版本都做不到的事 - **SELinux 异常** — Duck Detector 探测 `/proc/self/attr/current` 并检查上下文有效性。Userspace hooks 无法隐藏这一点。 - **TEE 认证** — 如果应用使用硬件支持的密钥认证,再多的 Frida hooks 也无法伪造干净的证书链。你需要一个正规的 keybox 和兼容的设备。 - **Mount namespace 检测** — 如果你的 Frida server 运行在不同的 mount namespace 中,检测器就会发现它。具有适当隐藏设置的 Magisk/KSU 对此有帮助。 - **内存跳板扫描** — 即使是 4.1.0 也只能阻止读取 `/proc/self/maps`。直接扫描内存以寻找类似 hook 的重定向(跳板、GOT 更改)的检测器依然会发现它们。 ## 使用场景 - 测试应用对不同设备指纹的反应 - 逆向工程检查 IMEI、Android ID 或 SIM 数据的应用 - 练习权衡不同策略(覆盖率 vs 隐蔽性)的 Frida 脚本 - 了解像 Duck Detector 这样的扫描器到底在寻找什么 - 在受控实验室环境中试验 Play Integrity 检查 ## 用法 ``` # 附加到运行中的 app frida -U com.target.app -l script.js # 重新 spawn frida -U -f com.target.app -l script.js ``` 对于 gadget 模式,请打包脚本并配置 libfrida-gadget.config.so。 ## RPC 快速参考 ``` rpc.exports.setImei("358901234567890"); rpc.exports.setAndroidId("a1b2c3d4e5f67890"); rpc.exports.setPhone("08123456789"); rpc.exports.setModel("SM-G998B"); rpc.exports.setManufacturer("samsung"); rpc.exports.setOperator("Telkomsel"); rpc.exports.version(); // "5.0.0-lean" or "4.1.0" rpc.exports.reload(); // re-apply hooks ``` ## 优化结果的建议 - 结合 Magisk DenyList + Shamiko + Hide My Applist 来隐藏 root 和可疑应用 - 如果可以避免,请不要以 root 身份运行 Frida server — 使用具有适当权限的非 root 进程 - 在生产测试中保持关闭调试日志(var DEBUG = false) - 如果应用崩溃,请先尝试禁用防杀 hooks - 尝试这两个版本,看看哪一个能为你的目标触发更少的信号 ## 许可证

License

## 作者

标签:Android, Docker支持, DSL, Frida, JS文件枚举, 云资产清单, 安全测试, 攻击性安全, 数据可视化, 绕过检测, 自定义脚本, 设备伪造, 逆向工程