Flutter
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Flutter is Google’s cross-platform UI toolkit wat ontwikkelaars toelaat om ’n enkele Dart-kodebasis te skryf wat die Engine (native C/C++) omskakel na platform-spesifieke masjienkode vir Android & iOS. Die Engine bundel ’n Dart VM, BoringSSL, Skia, ens., en word gestuur as die gedeelde biblioteek libflutter.so (Android) of Flutter.framework (iOS). Alle werklike netwerkverkeer (DNS, sockets, TLS) gebeur binne hierdie biblioteek, nie in die gewone Java/Kotlin Swift/Obj-C-lae nie. Daardie gesiloede ontwerp is waarom die gewone Java-vlak Frida-hooks op Flutter-apps misluk.
Intercepteer HTTPS-verkeer in Flutter
Dit is ’n samevatting van hierdie blog post.
Waarom HTTPS-intersepsie moeilik is in Flutter
- SSL/TLS-verifikasie lê twee lae laer in BoringSSL, so Java SSL‐pinning-bypass-metodes raak dit nie.
- BoringSSL gebruik sy eie CA-store binne libflutter.so; die invoer van jou Burp/ZAP CA in Android se stelselwinkel verander niks.
- Simbole in libflutter.so is gestrip & vermink, wat die sertifikaat-verifikasie-funksie vir dinamiese gereedskap wegsteek.
Maak ’n vingerafdruk van die presiese Flutter-stapel
Om die weergawe te ken laat jou toe om die regte binaries te herbou of patroon-te pas.
| Step | Command / File | Outcome |
|---|---|---|
| Get snapshot hash | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Map hash → Engine | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Pull dependent commits | 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– ’n enkeletrueis genoeg om die hele sertifikaatkettingkontrole te omseil. - Dieselfde funksie bestaan op elke CPU-argitektuur; net die opkodes verskil.
Option A – Binary patching with reFlutter
- Clone die presiese Engine- en Dart-bronne vir die app se Flutter-weergawe.
- Regex-patch twee hotspots:
- In
ssl_x509.cc, forceerreturn 1; - (Optional) In
socket_android.cc, hard-code ’n proxy ("10.0.2.2:8080").
- Re-kompileer libflutter.so, plaas dit terug in die APK/IPA, teken, installeer.
- Pre-patched builds vir algemene weergawes word in die reFlutter GitHub-releases verskaf om ure se build-tyd te bespaar.
### Option B – Live hooking with Frida (the “hard-core” path) Omdat die simbool gestript is, patroon-scan jy die gelaaide module vir sy eerste bytes, en verander dan die return-waarde op die vlug.
// 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"); }
});
I don’t have the file contents. Please paste the full markdown from src/mobile-pentesting/android-app-pentesting/flutter.md (or upload it). I will then translate the English text to Afrikaans, preserving all code, tags, links, paths and the specified words unchanged.
frida -U -f com.example.app -l bypass.js
Porting wenke
- Vir arm64-v8a of armv7, gryp die eerste ~32 bytes van die funksie uit Ghidra, omskep dit na ’n spasie-geskeide hex-string, en vervang
sig. - Hou een patroon per Flutter-release, stoor patrone in ’n cheat-sheet vir vinnige hergebruik.
Dwing verkeer deur jou proxy
Flutter self ignoreer toestel se proxy-instellings. Maklikste opsies:
- Android Studio emulator: Instellings ▶ Proxy → handmatig.
- Fisiese toestel: evil Wi-Fi AP + DNS spoofing, of Magisk-module wat
/etc/hostswysig.
Vinnige Flutter TLS-bypass werksvloei (Frida Codeshare + system CA)
As jy net ’n gepinde Flutter API hoef te observeer, is dit dikwels vinniger om ’n rooted/writable AVD, ’n system-trusted proxy CA, en ’n drop-in Frida script te kombineer as om libflutter.so te reverse-engineer:
-
Installeer jou proxy CA in die system store. Volg Install Burp Certificate om Burp se DER-sertifikaat te hash/hernoem en dit in
/system/etc/security/cacerts/te push (skryfbare/systembenodig). -
Plaas ’n ooreenstemmende
frida-serverbinary en voer dit as root uit sodat dit aan die Flutter-proses kan koppel:
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 &'"
- Installeer die host-side tooling en enumerate die target package.
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Spawn die Flutter app met die Codeshare hook wat BoringSSL pin checks neutraliseer.
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
Die Codeshare script oorlaai die Flutter TLS verifier sodat elke sertifikaat (insluitend Burp se dinamies gegenereerde sertifikate) aanvaar word, wat public-key pin comparisons omseil.
- Roeteer verkeer deur jou proxy. Konfigureer die emulator Wi‑Fi proxy GUI of dwing dit af via
adb shell settings put global http_proxy 10.0.2.2:8080; as direkte routering misluk, val terug opadb reverse tcp:8080 tcp:8080of ’n host-only VPN.
Sodra die CA op die OS-laag vertrou word en Frida Flutter se pinning-logika neerslaan, herwin Burp/mitmproxy volle sigbaarheid vir API fuzzing (BOLA, token tampering, ens.) sonder om die APK te repak.
Offset-based hook of BoringSSL verification (no signature scan)
Wanneer patroon-gebaseerde skripte oor argitekture faal (bv. x86_64 vs ARM), hook direk die BoringSSL chain verifier deur absolute adres binne libflutter.so. Workflow:
- Haal die regte-ABI biblioteek uit die APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/en kies die een wat by die toestel pas (bv.lib/x86_64/libflutter.so). - Analiseer in Ghidra/IDA en lokaliseer die verifier:
- Bron: BoringSSL ssl_x509.cc funksie
ssl_crypto_x509_session_verify_cert_chain(3 args, returns bool). - In gestripte builds, soek vir die string
"ssl_client"en ondersoek XREFs; identifiseer die funksie wat drie pointer-agtige args neem en ’n boolean teruggee. - Bereken die runtime offset: neem die funksieadres wat deur Ghidra getoon word en trek die image base wat tydens analise gebruik is af om die relatiewe offset (RVA) te kry. Example:
0x02184644 - 0x00100000 = 0x02084644. - Hook tydens runtime by base + offset en forceer sukses:
// 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);
Aantekeninge
- Herbereken die offset vir elke teiken-bou en CPU-argitektuur; compiler/codegen-verskille breek hardgekodeerde signatures.
- Hierdie bypass veroorsaak dat BoringSSL enige chain aanvaar, wat HTTPS MITM moontlik maak ongeag pins/CA trust binne Flutter.
- As jy verkeer force-route tydens debugging om TLS-blokkering te bevestig, byvoorbeeld:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…Jy sal steeds die hook hierbo benodig, aangesien verifikasie binne libflutter.so plaasvind, nie in Android se stelsel-trust store nie.
Verwysings
- 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
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

