用于 Android 应用反汇编、重组、逆向工程和审计的取证分析
BogusMips 使用 Rust 编写,可用于分析你的 Android 应用能被反汇编到什么程度。它允许你打开应用的 *.apk 或 *.xapk 文件,查看你的应用能被反汇编到什么程度。

*.apk 或 *.xapk。classes*.dex 文件的每个类,按 Java 包分组并反汇编为 smali。resources.arsc 被解码回其编译来源的 res/values*/*.xml 文件(字符串、颜色、尺寸、样式、属性、数组、复数等),外加包含所有资源 ID 的 public.xml。.smali;生成的资源文件导出为 XML;XAPK 中包含的 APK 导出为 .apk。AndroidManifest.xml、res/**/*.xml)会被解码。资源引用会解析为名称(@string/app_name、@android:style/Theme),属性值会解析为其符号名称(protectionLevel="signature")。AndroidManifest.xml、resources.arsc 值)以及捕获的 HTTP/HTTPS 网络流量向 AI 代理提问。可配置为 Grok (xAI)、Gemini (Google)、Claude (Anthropic)、OpenAI (ChatGPT),或任何自定义的 OpenAI 兼容端点(例如 Ollama、OpenRouter)。该代理内置工具(search_package、list_nodes、read_node、list_network_flows、inspect_network_flow),可自主搜索和读取类、资源以及捕获的网络流量。
Network 视图(⇧⌘N)是一个精简的、类似 Postman 的流量嗅探器。它会启动一个 Android 模拟器(AVD),将客户机的流量路由通过内置的中间人代理,安装已打开的 APK/XAPK,启动它,并实时捕获其 HTTP 和 HTTPS 请求。捕获的请求显示在左侧列表中;选择一个请求会在编辑器中显示其完整的请求/响应(标头和正文,美化 / 原始 / 十六进制),并在信息面板中显示时序和连接详细信息。

完整的 HTTPS 解密需要可 root 的模拟器镜像(google_apis / aosp_atd,而非 google_apis_playstore),因为代理的 CA 必须作为系统信任锚安装。启动时,BogusMips 会启用 adb root,并将其生成的 CA(一个短时效、按会话生成的 CA,以 PEM 格式)安装到系统和 Conscrypt(APEX)信任存储中。在 Android 14+(API 34+)上,这些存储位于按进程隔离的挂载命名空间中,因此 CA 会被放入一个 overlay 目录——用 system_security_cacerts_file SELinux 上下文重新标记(文件和目录都要标记,否则应用会被拒绝访问)——并通过 nsenter 在每个进程的挂载命名空间中 bind-mount 覆盖到这些存储之上。目标应用在此之后才被安装并启动,因此它会重新 fork,其系统信任存储的 HTTPS 流量即可被解密。按主机生成的叶子证书是短时效的,且在证书链中不包含 CA,以满足强制实施 398 天最大证书有效期的客户端。
注意事项——哪些无法解密:
ERR_CERT_AUTHORITY_INVALID;它们的流量能到达代理,但 TLS 握手会被拒绝。许多混合应用(Cordova/Capacitor/Ionic)在 WebView 中渲染,也属于这一类。*.google.com 的流量),它们还额外要求证书透明度(Certificate Transparency)。哪些可以解密:使用 Android 系统信任存储的应用——HttpURLConnection、OkHttp/Retrofit、Conscrypt 以及大多数原生网络栈。(已在运行的缓存系统进程不会被重新 fork,因此它们可能持续显示信任锚错误,直到重启;这不影响被启动的目标应用。)
自定义 Frida 与 CodeShare 脚本。 在 Network 视图的 Frida scripts 下,你可以添加任意数量的 Frida 脚本,并针对一次捕获会话,通过 frida-gadget(wrap.<package> / LD_PRELOAD)单独切换要注入哪些脚本:
dzonerzy/aesinfo)、CLI 语法(frida --codeshare dzonerzy/aesinfo)或 URL(https://codeshare.frida.re/@dzonerzy/aesinfo/)指定——从 CodeShare API 获取并缓存到 ~/.cache/bogusmips/codeshare/。.js 脚本文件(手动输入或通过文件选择按钮选取)以及直接的 https:// 脚本 URL。Loading…、Armed、✔ Working (N) 或 ✖ Error)会显示每个已启用脚本是否已加载并正在应用内执行,而通过 console.log(...) 或 send(...) 输出的内容会在捕获期间从 logcat 流式传输到可折叠的 Log 视图中。你配置的脚本列表和启用状态会保存到 ~/.config/bogusmips/frida.json。限制:此功能使用 frida 的 Java instrumentation,因此需要 frida 支持的 Android 镜像——全新的预览版 API 级别(例如 API 37)尚不被 frida 支持,将无法工作;请使用 API 34/35 的可 root 镜像。固定的 frida 版本可通过 BOGUSMIPS_FRIDA_VERSION 环境变量覆盖。由于 gadget 是通过 LD_PRELOAD 注入的,无法挂起应用,因此 hook 会在启动后片刻才生效(frida 无法更早地安全触碰 ART)——所以那些在应用启动极早期运行的检查仍可能抢先执行,无法被可靠绕过;要击败这些检查需要 frida 的 spawn-gating(frida-server)而非 gadget。它也无法击败在原生代码中实现的检查、带有自身混淆/重复检测器的应用,或诸如 Play Integrity API 之类的服务端证明。
所有解析器(ZIP、DEX、smali 反汇编器、二进制 XML、资源表)均在本仓库中实现。它们遵循 Android 的行为而非规范,因此那些能破坏其他工具的伎俩仍能正常打开。例如:畸形的额外字段、伪造的加密标志、CRC 不匹配以及虚假的压缩方法。此类伎俩会被报告为警告。
Android 框架资源的名称来自 media/android/framework-resources.txt,该文件由 Android SDK 通过 tools/gen_framework_resources.py 生成(AOSP,Apache License 2.0)。
UI 使用 Hack 字体,该字体已嵌入二进制文件中(media/fonts,参见其许可证)。
需要 Rust 1.85 或更高版本。
cargo run # debug build
cargo run --release -- app.apk # optimized build, opening a file directly
cargo test
BOGUSMIPS_TEST_APK=path/to/app.apk cargo test --release # also render every node of a real package
开发者工具:
# Write the smali of every class (apktool layout), e.g. to diff against `apktool d -r`
cargo run --release --example dump_smali -- app.apk out-dir
# Write the res/values*/*.xml generated from resources.arsc, e.g. to diff against `apktool d`
cargo run --release --example dump_resources -- app.apk out-dir
# Beautify a file as the content view does (format detected from the name, or given)
cargo run --release --example beautify_file -- in.min.js out.js [json|xml|html|css|js]
# Search a package's contents like the Search view, with timings
cargo run --release --example search_package -- app.apk "getString" [--regex] [--case] [--word]
# Open packages and inspect every node, reporting timings and decode errors
cargo run --release --example inspect_all -- app.apk other.xapk
# Capture an app's live HTTP/HTTPS traffic through the MITM proxy (headless)
cargo run --example net_capture -- app.xapk <AVD-name> [seconds] [--codeshare dzonerzy/aesinfo] [--script path/to/hook.js]