
🤖 一款自动准备Android APK文件以进行HTTPS检查的CLI应用程序
一款自动为 Android APK 文件准备 HTTPS 检测的 CLI 应用程序
使用代理检查移动应用的 HTTPS 流量,可能是了解其工作原理的最简单方法。然而,随着 Android 7 引入的网络安全配置以及应用开发者试图通过证书固定来防止中间人攻击,让应用与 HTTPS 代理协同工作变得相当繁琐。
apk-mitm 实现了整个流程的自动化。你只需提供一个 APK 文件,apk-mitm 就会:
你也可以使用 apk-mitm 修补 Android App Bundle 应用,无需 root 手机。
要修改应用的常规行为以绕过证书固定等安全功能,要么在运行应用之前修改其源代码,要么在应用运行时进行“钩子(hooking)”以拦截函数调用。
apk-mitm 目前采用前一种方法:首先使用 Apktool“反汇编”应用,修改若干文件,然后(再次使用 Apktool)重新组合。
这种方法的好处是不需要 root 设备,但也有几个缺点。最大的问题是,应用本来就不是设计用来被反汇编的。Apktool 尽力实现这一点,但尤其是对于大型复杂的应用,常常会遇到问题。
此方法的另一个问题是,某些证书固定的方式(例如在原生二进制文件中执行的检查,如 Flutter 等框架的情况)很难甚至无法绕过。因此,对于更棘手的应用,尝试其他方法可能更有效。
具体来说,我想推荐 mitmproxy 的 android-unpinner 项目 以及 HTTP Toolkit 的底层 frida-interception-and-unpinning 脚本。它们的方法使用 Frida 在运行时应用补丁,这种方法更强大,但同时也意味着在没有 root 设备的情况下可能无法使用或更难使用。
如果你安装了最新版本的 Node.js(14+)和 Java(8+),可以通过运行以下命令安装 apk-mitm:
npm install -g apk-mitm
安装后,你可以运行以下命令来修补应用:
apk-mitm <path-to-apk>
修补名为 example.apk 的 APK 文件可能如下所示:
$ apk-mitm example.apk
✔ 解码 APK 文件
✔ 修改应用清单
✔ 替换网络安全配置
✔ 禁用证书固定
✔ 编码修补后的 APK 文件
✔ 签名修补后的 APK 文件
完成! 修补后的 APK: ./example-patched.apk
现在,你可以将 example-patched.apk 文件安装到 Android 设备上,并使用 Charles 或 mitmproxy 等代理查看应用的流量。
你也可以使用 apk-mitm 修补 Android App Bundle 应用,只需提供一个 *.xapk 文件(例如来自 APKPure)或 *.apks 文件(你可以使用 SAI 自行导出)。如果在 Linux 上进行此操作,请确保已安装 zip 和 unzip。
有时你需要对应用进行手动修改才能使其正常工作。在这些情况下,--wait 选项正是你需要的。启用该选项后,apk-mitm 会在重新编码应用前等待,让你能够修改临时目录中的文件。
如果你希望对 APK 尝试不同的修改,那么使用 --wait 可能不是最方便的选择,因为它会迫使你每次使用时从头开始。在这种情况下,你可能想看看 APKLab。这是一个基于 VS Code 构建的 Android 逆向工程工作台,内置了 apk-mitm 支持,应该能让你更快地迭代。
在某些设备(如 Android TV)上,你可能无法向系统的根证书中添加新证书。在这种情况下,你仍然可以将代理的证书直接添加到应用的网络安全配置中,因为这在任何设备上都能生效。你可以通过使用 --certificate 标志并指定代理使用的证书(.pem 或 .der 文件)路径来实现这一点。
如果应用使用了 Google Maps,并且在修补后地图显示异常,那么应用的 API 密钥可能被限制为仅可与开发者的证书一起使用。你需要创建自己的无限制 API 密钥,然后使用 --wait 选项运行 apk-mitm,以便替换应用 AndroidManifest.xml 文件中的 com.google.android.geo.API_KEY 值。
如果 apk-mitm 在解码或编码时崩溃,问题很可能与 Apktool 有关。查看 其 GitHub 上的问题列表 以寻找可能的解决方案。如果你碰巧找到不受该问题影响的 Apktool 版本,可以通过 --apktool 选项指定其 JAR 文件的路径,从而让 apk-mitm 使用该版本。
MIT © Niklas Higi