FridaBypassKit 实战:在 agentic-awesome-skills 的 apk-reverse 工作流中一键绕过 Android 四大检测
【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills
本指南以 apk-reverse skill 引用的FridaBypassKit参考文档为主线,系统讲解这套面向 Android APK 动态分析的开箱即用 Frida 脚本如何覆盖 Root 检测、SSL Pinning、模拟器检测与反调试四大安全机制的绕过,并结合仓库内配套的 Frida 脚本速查与高级逆向参考,给出可直接落地的部署命令、注入流程与排查策略。读完你将掌握"一脚本四绕过"的完整用法,并清楚它在apk-reverse工作流中与jadx、apktool、frida-trace的配合位置。
一、FridaBypassKit 定位:面向授权测试的通用绕过框架
FridaBypassKit是一套集成了四大绕过能力的 Frida 脚本,其核心价值在于无需针对特定 APP 定制,开箱即用。它主要服务于 APK 动态分析中四个高频障碍场景:
- 应用检测到设备已 Root 而拒绝运行;
- 抓包时 HTTPS 请求看不到明文(证书绑定拦截了中间人代理);
- 应用检测到运行环境是模拟器而拒绝启动;
- 附加 Frida 后应用检测到调试器并崩溃退出。
在仓库中,该文档位于 frida-bypass-kit.md,是apk-reverseskill 的参考资料之一,与 frida-cookbook.md(按场景分类的 Frida 脚本速查)、android-advanced.md(native SO / SSL / 脱壳等高级逆向)、apk-security-checklist.md(OWASP MASTG 检查清单)共同构成 Frida 动态对抗的完整参考链。
需要强调的是,该 skill 的 SKILL.md 在开头即声明AUTHORIZED USE ONLY:本内容仅用于教育目的或经授权的安全评估,操作前必须取得系统所有者的书面许可,任何探测、利用、持久化、数据提取或凭据访问行为都必须先经过显式的授权确认门(确认目标、确认授权范围、展示确切命令并等待确认)。
二、Root 检测绕过:让设备"看起来未 Root"
Root 检测绕过是 FridaBypassKit 的第一项能力,覆盖四个 hook 层次:
- Hook
java.io.File.exists()隐藏 su 二进制:应用常见的 Root 检测逻辑是枚举固定路径下的su、magisk、Superuser等文件是否存在,通过让exists()对这些路径返回false,即可在文件系统层面"隐形"。 - 拦截
Runtime.exec()的 root 检查调用:很多应用通过Runtime.getRuntime().exec("su")或执行which su探测 Root,需要拦截exec调用,命中su/which关键字时直接抛出异常或返回失败。 - 从 PackageManager 隐藏 root 相关包(Magisk、SuperSU 等):应用会检查已安装包列表中是否包含 Magisk、SuperSU 等管理包,需要 hook
PackageManager.getPackageInfo/getInstalledPackages对包名进行过滤。 - 修改系统属性使设备看起来未 root:将
Build.TAGS等标识性系统属性改写成正常 release 设备的取值。
仓库内的 frida-cookbook.md 给出了这套思路的完整可运行实现,核心片段如下:
Java.perform(function() { // File.exists 绕过 var File = Java.use("java.io.File"); var rootPaths = ["su", "Superuser", "magisk", "busybox", "xposed", "/system/xbin/su", "/system/bin/su", "/sbin/su", "/data/local/xbin/su", "/data/local/bin/su"]; File.exists.implementation = function() { var path = this.getAbsolutePath(); for (var i = 0; i < rootPaths.length; i++) { if (path.toLowerCase().indexOf(rootPaths[i].toLowerCase()) !== -1) { console.log("[Root] Blocked: " + path); return false; } } return this.exists(); }; // Runtime.exec 绕过 var Runtime = Java.use("java.lang.Runtime"); Runtime.exec.overload('java.lang.String').implementation = function(cmd) { if (cmd.indexOf("su") !== -1 || cmd.indexOf("which") !== -1) { console.log("[Root] Blocked exec: " + cmd); throw Java.use("java.io.IOException").$new("Permission denied"); } return this.exec(cmd); }; // Build.TAGS 绕过 var Build = Java.use("android.os.Build"); Build.TAGS.value = "release-keys"; });这段实现值得注意的细节:黑名单使用了大小写不敏感的toLowerCase()匹配,覆盖了/system/xbin/su、/sbin/su等历史遗留路径;对Runtime.exec不是返回假结果,而是直接抛出IOException("Permission denied"),更贴近真实"命令不可用"的失败语义。
android-advanced.md 还系统归纳了常见的 Root 检测面与对应绕过手段,可作为自建绕过脚本的检查表:
| 检测方式 | 绕过方法 |
|---|---|
检查/system/app/Superuser.apk | HookFile.exists()返回 false |
检查su命令 | HookRuntime.exec()拦截 su 调用 |
检查/proc/self/mounts | Hook 文件读取,过滤 magisk 相关 |
| SafetyNet / Play Integrity | Magisk Hide / Zygisk + Shamiko(需在系统层配合) |
| 检查 Magisk 包名 | 随机化 Magisk 包名或 Hook PackageManager |
检查/data/adb/ | Hookopendir/access |
此外,部分应用会读取ro.debuggable、ro.secure系统属性判断设备状态,通用做法是同时 hookSystem.getProperty对这两个 key 返回预期值(仓库参考文档中有对应实现思路)。若应用将 Root 检测下沉到 native 层,frida-cookbook.md 中Interceptor.attach(Module.findExportByName("libc.so", "open"), ...)拦截su/magisk关键路径的写法可作补充。
三、SSL Pinning 绕过:让 HTTPS 流量重新可读
SSL Pinning(证书绑定)是抓包路上最大的拦路虎:应用将服务端证书或公钥固定,即使安装了代理的 CA 证书,中间人代理依然无法解密流量。FridaBypassKit 的 SSL 绕过策略是在证书验证链路上做手脚,包括:
- Hook
com.android.org.conscrypt.TrustManagerImpl.verifyChain() - Hook
TrustManagerImpl.checkTrustedRecursive() - 直接绕过证书链验证逻辑
- 返回空证书链以避免校验
- 兼容 OkHttp、Retrofit 及自定义 TrustManager 实现
仓库 frida-cookbook.md 中"通用 SSL Pinning 绕过"章节给出了分层兜底的实现,从三个层面依次尝试:
Java.perform(function() { // OkHttp3 CertificatePinner try { var CertificatePinner = Java.use("okhttp3.CertificatePinner"); CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function() { console.log("[*] SSL Pinning bypassed (OkHttp3)"); }; } catch(e) {} // TrustManagerImpl try { var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl"); TrustManagerImpl.verifyChain.implementation = function(untrustedChain) { console.log("[*] SSL Pinning bypassed (TrustManagerImpl)"); return untrustedChain; }; } catch(e) {} // X509TrustManager try { var X509TrustManager = Java.use("javax.net.ssl.X509TrustManager"); var TrustManager = Java.registerClass({ name: "com.bypass.TrustManager", implements: [X509TrustManager], methods: { checkClientTrusted: function() {}, checkServerTrusted: function() {}, getAcceptedIssuers: function() { return []; } } }); } catch(e) {} // Network Security Config (Android 7+) try { var NetworkSecurityConfig = Java.use("android.security.net.config.NetworkSecurityConfig"); NetworkSecurityConfig.isCleartextTrafficPermitted.implementation = function() { return true; }; } catch(e) {} });这套实现的设计要点:
- 全部用
try/catch包裹:目标应用未集成某一层(例如没用到 OkHttp 的CertificatePinner,或系统不是 conscrypt 实现)时静默跳过,不会因单个类缺失导致整个脚本报错,这正是"通用、免定制"的关键。 verifyChain直接返回untrustedChain:不调用原校验逻辑,把"未信任的证书链"直接当作合法链返回。Java.registerClass注册空实现的 X509TrustManager:兜底checkServerTrusted场景,覆盖使用自研 SSL 上下文的应用。- Android 7+ 的 Network Security Config:顺带放行明文流量,兼容旧式 HTTP 混合内容场景。
android-advanced.md 补充了各主流框架的绕过落点对照,可用于判断目标应用该 hook 哪里:
| 框架 | 绕过方法 |
|---|---|
| OkHttp3 | HookCertificatePinner.check返回空 |
| Retrofit | 同 OkHttp(底层用 OkHttp) |
| Volley | HookHurlStack的 SSL 工厂 |
| Flutter | Hookdart:io的SecurityContext(需要特殊脚本) |
| React Native | HookOkHttpClientProvider |
| WebView | HookWebViewClient.onReceivedSslError |
在实际抓包场景中,apk-security-checklist.md 给出的通行做法是:先配置系统代理并安装 CA 证书,Android 7+ 若仍看不到明文,再叠加 Frida 的 SSL Pinning 绕过脚本,即"代理 + CA + Frida 三层配合"。
四、模拟器检测绕过:伪造真实设备特征
模拟器检测绕过主要针对应用通过TelephonyManager与Build 属性识别运行环境的行为,FridaBypassKit 的做法包括:
- 伪造 TelephonyManager 返回值
- 返回假的电话号码和运营商名称
- 修改 Build 属性
仓库 frida-cookbook.md 中"模拟器检测绕过"章节给出了完整的设备特征伪造实现:
Java.perform(function() { var Build = Java.use("android.os.Build"); Build.FINGERPRINT.value = "google/walleye/walleye:8.1.0/OPM1.171019.011/4448085:user/release-keys"; Build.MODEL.value = "Pixel 2"; Build.MANUFACTURER.value = "Google"; Build.BRAND.value = "google"; Build.DEVICE.value = "walleye"; Build.PRODUCT.value = "walleye"; Build.HARDWARE.value = "walleye"; // TelephonyManager var TelephonyManager = Java.use("android.telephony.TelephonyManager"); TelephonyManager.getDeviceId.implementation = function() { return "352099001761481"; }; TelephonyManager.getSubscriberId.implementation = function() { return "310260000000000"; }; TelephonyManager.getSimSerialNumber.implementation = function() { return "89014103211118510720"; }; });实现要点:
- Build 属性整体改写:
FINGERPRINT、MODEL、MANUFACTURER、BRAND、DEVICE、PRODUCT、HARDWARE全部统一成同一台"真实设备"(Pixel 2 / walleye)的取值,避免只改MODEL而其他字段仍暴露模拟器特征导致前后矛盾。 - Telephony 返回值固定:设备 ID、Subscriber ID、SIM 序列号全部返回合法格式的假值。
需要留意的兼容性边界:从高版本 Android 起,getDeviceId等部分 Telephony API 对非系统应用已返回受限值,单纯 hook 单个 getter 未必能骗过所有检测;实战中常需同时结合设备 ID、Android ID、传感器列表、/proc/cpuinfo等多项特征统一伪造。运营商名称(如getNetworkOperatorName)同理可通过覆写对应 getter 返回假值,具体以目标应用的实际调用点为准。这一方向也出现在 apk-security-checklist.md 的"代码保护评估"表中——模拟器检测的绕过难度被评估为"低-中"。
五、反调试绕过:让附加与调试检测失效
反调试绕过针对应用主动探测调试器附加的行为,FridaBypassKit 的核心手段:
- Hook
android.os.Debug.isDebuggerConnected() - 阻止调试器检测
- 绕过反调试检查
仓库 frida-cookbook.md 中"反调试绕过"章节给出了 Java 层与 native 层两个层面的实现:
Java.perform(function() { // Debug.isDebuggerConnected var Debug = Java.use("android.os.Debug"); Debug.isDebuggerConnected.implementation = function() { console.log("[AntiDebug] isDebuggerConnected → false"); return false; }; // TracerPid 检测绕过(native 层) var fopen = Module.findExportByName("libc.so", "fopen"); Interceptor.attach(fopen, { onEnter: function(args) { this.path = args[0].readUtf8String(); }, onLeave: function(retval) { if (this.path && this.path.indexOf("/proc/") !== -1 && this.path.indexOf("/status") !== -1) { // 可以进一步 hook fgets 修改 TracerPid } } }); });两点说明:
- Java 层:将
Debug.isDebuggerConnected()直接改写为返回false,覆盖最主流的Debug/Debug.isDebuggerConnected检测路径。 - native 层:部分应用会在 native 代码里读取
/proc/self/status中的TracerPid判断是否被 ptrace 附加。上述片段先拦截libc.so的fopen观察对/proc/self/status的访问,为后续 hookfgets篡改TracerPid留下扩展点——这属于从源码结构可见的"先观测、再定向修改"的渐进式反调试思路。
一个值得注意的实战细节:用frida -U -fspawn 启动应用时,frida-server 本身就会在进程上留下 ptrace 痕迹,如果目标应用的反调试检测很严格,可能需要在脚本中同步处理TracerPid相关检测(native 层),而不是只改 Java 层的isDebuggerConnected。
六、部署与注入:从安装 frida-server 到加载脚本
原文档给出的标准部署流程如下:
# 前置条件 pip install frida-tools adb push frida-server /data/local/tmp/ adb shell chmod 755 /data/local/tmp/frida-server adb shell su -c /data/local/tmp/frida-server & # 注入目标 APP frida -U -f com.example.app -l FridaBypassKit.js结合仓库 SKILL.md 记录的已验证环境,可将这套流程细化如下:
- 安装 PC 端工具:
pip install frida-tools。SKILL.md 中记录本机已验证的版本为frida-ps 17.9.6。frida-server 与 PC 端 frida-tools 必须版本匹配(frida-tools 主版本对应 frida-server 主版本),否则会报版本不兼容错误。 - 推送并启动 frida-server:
adb push frida-server /data/local/tmp/,adb shell chmod 755 /data/local/tmp/frida-server,adb shell su -c /data/local/tmp/frida-server &。注意 frida-server 的架构必须与设备匹配(arm64-v8a/armeabi-v7a/x86_64),否则无法在目标设备上运行。 - 确认连接:
adb devices查看设备在线,frida-ps -U列出 USB 设备上的进程,验证 frida-server 工作正常。 - 注入:
frida -U -f com.example.app -l FridaBypassKit.js。
注入命令的参数语义值得展开:
| 参数 | 含义 | 适用场景 |
|---|---|---|
-U | 使用 USB 连接的设备 | 常规真机 / 模拟器调试 |
-f | spawn 模式,冷启动应用并在入口处注入 | 应用在启动早期就执行 Root / 调试检测时必选 |
-l | 指定加载的 Frida 脚本 | 加载FridaBypassKit.js等 JS 脚本 |
-n | 按进程名 attach 已运行的进程 | 应用已启动、只做后续 hook 时使用 |
--no-pause | spawn 后不自动暂停在入口 | 跳过启动暂停,加快注入速度 |
spawn(-f)与 attach(-n)的选择直接决定绕过效果:若应用在Application.onCreate或首个 Activity 创建时即检测 Root / 模拟器 / 调试器,必须用-f让脚本在应用完全启动前生效;仅做运行期 hook 则可用 attach。原文档建议的"先跑完整 FridaBypassKit,再针对性调整"正是基于这种启动期检测的时序考量。
如果需要在动态分析中快速观察目标调用点,SKILL.md 还记录了frida-trace的用法,例如追踪证书相关调用:frida-trace -U -f com.example.app -j '*!*certificate*',可在注入完整绕过脚本之前先摸清应用校验代码的分布。
七、同类绕过脚本对照(原文档参考清单)
原文档除 FridaBypassKit 外,还整理了一批社区常用的 Frida 绕过脚本,按场景分工如下:
| 项目 | 特点 | 适用定位 |
|---|---|---|
| httptoolkit / frida-interception-and-unpinning | 直接 MitM 所有 HTTPS 流量 | 快速打通 HTTPS 抓包链路 |
| 0xCD4 / SSL-bypass | 通用非定制 SSL 绕过 | 与 FridaBypassKit 的 SSL 模块定位相近的轻量替代 |
| incogbyte / ssl-bypass gist | 绕过常见 SSL pinning 方法 | 针对常见 pinning 实现的快速脚本 |
| Zero3141 / Frida-OkHttp-Bypass | 专门针对 OkHttpCertificatePinner | 目标明确使用 OkHttp 时的定点绕过 |
这份清单在 android-advanced.md 的参考资源章节亦有呼应(包括 FridaBypassKit 与 SSL-bypass 的引用)。选择建议:先用 FridaBypassKit 做全量覆盖,遇到特定框架(如 OkHttp)的漏网场景,再用专项脚本定点补充。
八、与 apk-reverse 工作流的集成策略
原文档给出了 FridaBypassKit 在apk-reverse工作流中的四个触发场景,可直接作为排障决策表:
| 现象 | 启用能力 |
|---|---|
| APP 检测到 root 拒绝运行 | Root Detection Bypass |
| 抓包时 HTTPS 请求看不到明文 | SSL Pinning Bypass |
| APP 检测到模拟器拒绝运行 | Emulator Detection Bypass |
| 附加 Frida 后 APP 崩溃 | Debug Detection Bypass |
推荐组合策略:先跑完整 FridaBypassKit,再针对具体 APP 做针对性调整——一次性注入全部四大绕过,观察目标应用在哪个环节仍然生效,再定点精调。
从 SKILL.md 的推荐工作流看,FridaBypassKit 属于"第 5 步:动态 Hook"阶段的常备工具,其前置链路是:
- Triage:
jadx -d jadx_out app.apk导出 Java 代码,apktool d app.apk -o apktool_out导出 smali 与资源,先看AndroidManifest.xml、主包名、四大组件与lib/目录是否含.so。 - Java 逻辑观察:在
jadx_out中定位登录、签名、风控、证书校验相关类,常见关键词如root、certificate、trust、okhttp、retrofit、webview。 - Smali 与资源层确认:
jadx结果不完整或需要实际 patch 时切到apktool_out查看smali*/、res/values/strings.xml,优先 patchandroid:exported、调试标记、root 检测返回值、证书校验分支。 - 重建与安装:
apktool b apktool_out -o rebuilt.apk重建,必要时补充zipalign/apksigner对齐与签名。 - 动态 Hook(本主题落点):用
frida -U -f注入 FridaBypassKit 或专项脚本;原则是先 Hook Java 层,再看是否需要 native Hook;先打印参数与返回值,再决定是否主动修改返回值。 - Native
.so分流:若证书校验 / 风控逻辑在.so中,Java 层 hook 无效,应切换到ida-reverse/radare2或使用 native 层Interceptor.attach。
同时,apk-security-checklist.md 的"Frida Hook 优先目标"表可作为注入后验证的目标清单:登录认证(LoginActivity.login())、签名生成(*Sign*/*sign*/*encrypt*)、SSL Pinning(CertificatePinner.check)、Root 检测(*root*/*su*/*magisk*)、加密操作(javax.crypto.Cipher)、Token 存储(SharedPreferences.getString)、网络请求(OkHttpClient.newCall)。
九、边界与安全约束
使用 FridaBypassKit 及任何绕过脚本前必须明确边界:
- 授权范围:仅用于自己拥有或被明确授权测试的应用,禁止对未授权目标执行探测、注入、修改或数据提取。
- 确认门流程:SKILL.md 规定,在执行任何探测目标的行为前,必须依次确认目标、确认书面授权与允许范围、展示确切命令并解释预期效果、等待会话内明确确认;未获确认时仅保持只读并提供防御性建议,优先使用沙箱、一次性虚拟机或受控实验环境。
- 副作用:注入与重打包会篡改目标应用的运行行为,可能导致崩溃、数据异常或触发服务端风控;高混淆、加壳或带 VMP 虚拟化保护的应用可能同时抵抗静态分析与动态注入,届时需先进入脱壳与 native 分析环节。
参考与延伸阅读
- frida-bypass-kit.md:本主题原始参考文档(FridaBypassKit 四大绕过能力)
- frida-cookbook.md:按场景分类的 Frida 实战脚本速查(绕过、加密、网络、脱壳等完整 JS 实现)
- android-advanced.md:native SO 分析、SSL 各框架绕过表、Root 检测面、加固脱壳、Flutter/React Native 逆向
- apk-security-checklist.md:基于 OWASP MASTG 的静态 / 动态 / 网络 / 存储安全检查清单
- SKILL.md:
apk-reverseskill 的完整工作流、已验证工具版本(jadx 1.5.5、apktool 3.0.2、frida-ps 17.9.6)与授权边界说明
【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考