A CLI application that automatically prepares Android APK files for HTTPS inspection
Inspecting a mobile app's HTTPS traffic using a proxy is probably the easiest way to figure out how it works. However, with the Network Security Configuration introduced in Android 7 and app developers trying to prevent MITM attacks using certificate pinning, getting an app to work with an HTTPS proxy has become quite tedious.
apk-mitm automates the entire process. All you have to do is give it an APK file and
- decode the APK file using Apktool
- replace the app's Network Security Configuration to allow user-added certificates
- modify the source code to disable various certificate pinning implementations
- encode the patched APK file using Apktool
- sign the patched APK file using uber-apk-signer
You can also use
apk-mitm to patch apps using Android App Bundle and rooting your phone is not required.
If you have an up-to-date version of Node.js (14+) and Java (8+), you can install
apk-mitm by running:
$ npm install -g apk-mitm
Once installed, you can run this command to patch an app:
$ apk-mitm <path-to-apk>
So, if your APK file is called
example.apk, you'd run:
$ apk-mitm example.apk ✔ Decoding APK file ✔ Modifying app manifest ✔ Replacing network security config ✔ Disabling certificate pinning ✔ Encoding patched APK file ✔ Signing patched APK file Done! Patched APK: ./example-patched.apk
You can now install the
example-patched.apk file on your Android device and use a proxy like Charles or mitmproxy to look at the app's traffic.
Patching App Bundles
You can also patch apps using Android App Bundle with
apk-mitm by providing it with a
*.xapk file (for example from APKPure) or a
*.apks file (which you can export yourself using SAI). If you're doing this on Linux, make sure that both
unzip are installed.
Making manual changes
Sometimes you'll need to make manual changes to an app in order to get it to work. In these cases the
--wait option is what you need. Enabling it will make
apk-mitm wait before re-enconding the app, allowing you to make changes to the files in the temporary directory.
If you want to experiment with different changes to an APK, then using
--wait is probably not the most convenient option as it forces you to start from scratch every time you use it. In this case you might want to take a look at APKLab. It's an Android reverse engineering workbench built on top of VS Code that comes with
apk-mitm support and should allow you to iterate much more quickly.
Allowing specific certificates
On some devices (like Android TVs) you might not be able to add a new certificate to the system's root certificates. In those cases you can still add your proxy's certificate directly to the app's Network Security Config since that will work on any device. You can accomplish this by running
apk-mitm with the
--certificate flag set to the path of the certificate (
.der file) used by your proxy.
If the app uses Google Maps and the map is broken after patching, then the app's API key is probably restricted to the developer's certificate. You'll have to create your own API key without restrictions and run
--waitoption to be able to replace the
com.google.android.geo.API_KEYvalue in the app's
apk-mitmcrashes while decoding or encoding the issue is probably related to Apktool. Check their issues on GitHub to find possible workarounds. If you happen to find an Apktool version that's not affected by the issue, you can instruct
apk-mitmto use it by specifying the path of its JAR file through the
- Connor Tumbleson for making an awesome APK decompiler
- Patrick Favre-Bulle for making a very simple tool for signing APKs
- Ryan Welton for inspiring most of the certificate pinning removal code
MIT © Niklas Higi