Flutter
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Flutter is Google’s cross-platform UI toolkit that lets developers write a single Dart code-base which the Engine (native C/C++) turns into platform-specific machine code for Android & iOS. The Engine bundles a Dart VM, BoringSSL, Skia, etc., and ships as the shared library libflutter.so (Android) or Flutter.framework (iOS). All actual networking (DNS, sockets, TLS) happens inside this library, not in the usual Java/Kotlin Swift/Obj-C layers. That siloed design is why the usual Java-level Frida hooks fail on Flutter apps.
Intercepting HTTPS traffic in Flutter
This is a summary of this blog post.
Why HTTPS interception is tricky in Flutter
- SSL/TLS verification lives two layers down in BoringSSL, so Java SSL‐pinning bypasses don’t touch it.
- BoringSSL uses its own CA store inside libflutter.so; importing your Burp/ZAP CA into Android’s system store changes nothing.
- Symbols in libflutter.so are stripped & mangled, hiding the certificate-verification function from dynamic tools.
Fingerprint the exact Flutter stack
Knowing the version lets you re-build or pattern-match the right binaries.
| Step | Command / File | Outcome |
|---|---|---|
| Отримати snapshot hash | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Зіставити хеш → Engine | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Отримати залежні комміти | DEPS file in that engine commit | • dart_revision → Dart v2 · 19 · 6• dart_boringssl_rev → BoringSSL 87f316d7… |
Find get_snapshot_hash.py here.
Target: ssl_crypto_x509_session_verify_cert_chain()
- Located in
ssl_x509.ccinside BoringSSL. - Returns
bool– a singletrueis enough to bypass the whole certificate chain check. - Same function exists on every CPU arch; only the opcodes differ.
Option A – Binary patching with reFlutter
- Clone the exact Engine & Dart sources for the app’s Flutter version.
- Regex-patch two hotspots:
- In
ssl_x509.cc, forcereturn 1; - (Optional) In
socket_android.cc, hard-code a proxy ("10.0.2.2:8080").
- Re-compile libflutter.so, drop it back into the APK/IPA, sign, install.
- Pre-patched builds for common versions are shipped in the reFlutter GitHub releases to save hours of build time.
### Option B – Live hooking with Frida (the “hard-core” path) Because the symbol is stripped, you pattern-scan the loaded module for its first bytes, then change the return value on the fly.
// attach & locate libflutter.so
var flutter = Process.getModuleByName("libflutter.so");
// x86-64 pattern of the first 16 bytes of ssl_crypto_x509_session_verify_cert_chain
var sig = "55 41 57 41 56 41 55 41 54 53 48 83 EC 38 C6 02";
Memory.scan(flutter.base, flutter.size, sig, {
onMatch: function (addr) {
console.log("[+] found verifier at " + addr);
Interceptor.attach(addr, {
onLeave: function (retval) { retval.replace(0x1); } // always 'true'
});
},
onComplete: function () { console.log("scan done"); }
});
Будь ласка, вставте вміст файлу src/mobile-pentesting/android-app-pentesting/flutter.md або надайте текст, який потрібно перекласти. Я перекладу відповідний англійський текст на українську, зберігаючи розмітку, посилання, теги, шляхи та код незмінними.
frida -U -f com.example.app -l bypass.js
Поради щодо портування
- Для arm64-v8a or armv7, grab the first ~32 bytes of the function from Ghidra, convert to a space-separated hex string, and replace
sig. - Keep one pattern per Flutter release, store them in a cheat-sheet for fast reuse.
Примусове спрямування трафіку через ваш proxy
Flutter itself ignores device proxy settings. Easiest options:
- Android Studio emulator: Settings ▶ Proxy → manual.
- Physical device: evil Wi-Fi AP + DNS spoofing, or Magisk module editing
/etc/hosts.
Швидкий workflow обходу TLS у Flutter (Frida Codeshare + system CA)
When you only need to observe a pinned Flutter API, combining a rooted/writable AVD, a system-trusted proxy CA, and a drop-in Frida script is often faster than reverse-engineering libflutter.so:
-
Install your proxy CA in the system store. Follow Install Burp Certificate to hash/rename Burp’s DER certificate and push it into
/system/etc/security/cacerts/(writable/systemrequired). -
Drop a matching
frida-serverbinary and run it as root so it can attach to the Flutter process:
adb push frida-server-17.0.5-android-x86_64 /data/local/tmp/frida-server
adb shell "su -c 'chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &'"
- Встановіть інструменти на хості та перелічте інформацію про цільовий пакет.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Запустіть Flutter app з Codeshare hook, який нейтралізує BoringSSL pin checks.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
The Codeshare script overrides the Flutter TLS verifier so every certificate (including Burp’s dynamically generated ones) is accepted, side-stepping public-key pin comparisons.
- Маршрутизувати трафік через ваш проксі. Налаштуйте GUI проксі для Wi‑Fi емулятора або застосуйте через
adb shell settings put global http_proxy 10.0.2.2:8080; якщо пряма маршрутизація не спрацьовує, використайтеadb reverse tcp:8080 tcp:8080або host-only VPN.
Once the CA is trusted at the OS layer and Frida quashes Flutter’s pinning logic, Burp/mitmproxy regains full visibility for API fuzzing (BOLA, token tampering, etc.) without repacking the APK.
Хук на основі офсету для перевірки BoringSSL (no signature scan)
When pattern-based scripts fail across architectures (e.g., x86_64 vs ARM), directly hook the BoringSSL chain verifier by absolute address within libflutter.so. Workflow:
- Витягніть бібліотеку з відповідним ABI з APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/і виберіть ту, що відповідає пристрою (наприклад,lib/x86_64/libflutter.so). - Аналізуйте у Ghidra/IDA та знайдіть верифікатор:
- Джерело: BoringSSL ssl_x509.cc function
ssl_crypto_x509_session_verify_cert_chain(3 args, returns bool). - У stripped збірках використовуйте Search → For Strings →
ssl_client→ XREFs, потім відкривайте кожну згадануFUN_...і обирайте ту, що має 3 аргументи, схожі на вказівники, і повертає boolean. - Обчисліть runtime-офсет: візьміть адресу функції, показану Ghidra, і відніміть image base (наприклад, Ghidra часто показує
0x00100000для PIE Android ELFs). Приклад:0x02184644 - 0x00100000 = 0x02084644. - Хукніть у runtime за base + offset і примусово поверніть успіх:
// frida -U -f com.target.app -l bypass.js --no-pause
const base = Module.findBaseAddress('libflutter.so');
// Example offset from analysis. Recompute per build/arch.
const off = ptr('0x02084644');
const addr = base.add(off);
// ssl_crypto_x509_session_verify_cert_chain: 3 args, bool return
Interceptor.replace(addr, new NativeCallback(function (a, b, c) {
return 1; // true
}, 'int', ['pointer', 'pointer', 'pointer']));
console.log('[+] Hooked BoringSSL verify_cert_chain at', addr);
Примітки
- Сигнатурні скани можуть спрацьовувати на ARM, але пропускати на x86_64 через зміну розташування opcode; цей метод зсуву є незалежним від архітектури, якщо ви перераховуєте RVA.
- Цей обхід змушує BoringSSL приймати будь-який ланцюжок, що дозволяє HTTPS MITM незалежно від pins/CA trust у Flutter.
- Якщо ви примусово маршрутизуєте трафік під час відлагодження, щоб підтвердити блокування TLS, наприклад:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…вам все одно знадобиться hook вище, оскільки перевірка відбувається всередині libflutter.so, а не в Android’s system trust store.
Джерела
- https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail (vercel)
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail (medium)
- PoC Frida hook for Flutter SSL bypass
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


