# Frida Tutorial 3 {{#include ../../../banners/hacktricks-training.md}} --- **To jest podsumowanie posta**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) ## Rozwiązanie 1 Na podstawie [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) **Złap funkcję _exit()** i **funkcję deszyfrującą**, aby wydrukować flagę w konsoli frida, gdy naciśniesz weryfikację: ```javascript Java.perform(function () { send("Starting hooks OWASP uncrackable1...") function getString(data) { var ret = "" for (var i = 0; i < data.length; i++) { ret += "#" + data[i].toString() } return ret } var aes_decrypt = Java.use("sg.vantagepoint.a.a") aes_decrypt.a.overload("[B", "[B").implementation = function (var_0, var_1) { send( "sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding" ) send("Key : " + getString(var_0)) send("Encrypted : " + getString(var_1)) var ret = this.a.overload("[B", "[B").call(this, var_0, var_1) send("Decrypted : " + getString(ret)) var flag = "" for (var i = 0; i < ret.length; i++) { flag += String.fromCharCode(ret[i]) } send("Decrypted flag: " + flag) return ret //[B } var sysexit = Java.use("java.lang.System") sysexit.exit.overload("int").implementation = function (var_0) { send("java.lang.System.exit(I)V // We avoid exiting the application :)") } send("Hooks installed.") }) ``` ## Rozwiązanie 2 Based in [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1) **Hook rootchecks** i funkcję deszyfrującą, aby wydrukować flagę w konsoli frida, gdy naciśniesz weryfikację: ```javascript Java.perform(function () { send("Starting hooks OWASP uncrackable1...") function getString(data) { var ret = "" for (var i = 0; i < data.length; i++) { ret += "#" + data[i].toString() } return ret } var aes_decrypt = Java.use("sg.vantagepoint.a.a") aes_decrypt.a.overload("[B", "[B").implementation = function (var_0, var_1) { send( "sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding" ) send("Key : " + getString(var_0)) send("Encrypted : " + getString(var_1)) var ret = this.a.overload("[B", "[B").call(this, var_0, var_1) send("Decrypted : " + getString(ret)) var flag = "" for (var i = 0; i < ret.length; i++) { flag += String.fromCharCode(ret[i]) } send("Decrypted flag: " + flag) return ret //[B } var rootcheck1 = Java.use("sg.vantagepoint.a.c") rootcheck1.a.overload().implementation = function () { send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()") return false } var rootcheck2 = Java.use("sg.vantagepoint.a.c") rootcheck2.b.overload().implementation = function () { send("sg.vantagepoint.a.c.b()Z Root check 2 HIT! test-keys") return false } var rootcheck3 = Java.use("sg.vantagepoint.a.c") rootcheck3.c.overload().implementation = function () { send("sg.vantagepoint.a.c.c()Z Root check 3 HIT! Root packages") return false } var debugcheck = Java.use("sg.vantagepoint.a.b") debugcheck.a.overload("android.content.Context").implementation = function ( var_0 ) { send("sg.vantagepoint.a.b.a(Landroid/content/Context;)Z Debug check HIT! ") return false } send("Hooks installed.") }) ``` --- ## Rozwiązanie 3 – `frida-trace` (Frida ≥ 16) Jeśli nie chcesz ręcznie pisać hooków, możesz pozwolić **Frida** wygenerować dla Ciebie szkielet Java, a następnie je edytować: ```bash # Spawn the application and automatically trace the Java method we care about aadb shell "am force-stop owasp.mstg.uncrackable1" frida-trace -U -f owasp.mstg.uncrackable1 \ -j 'sg.vantagepoint.a.a.a("[B","[B")[B' \ -j 'sg.vantagepoint.a.c!*' \ --output ./trace # The first run will create ./trace/scripts/sg/vantagepoint/a/a/a__B_B_B.js # Edit that file and add the logic that prints the decrypted flag or # returns a constant for the root-checks, then: frida -U -f owasp.mstg.uncrackable1 -l ./trace/_loader.js --no-pause ``` Z Frida 16+ generowany stub już używa nowoczesnej składni szablonów **ES6** i będzie kompilowany z wbudowanym *QuickJS* runtime – nie musisz już używać `frida-compile`. --- ## Rozwiązanie 4 – Jedna linia z Objection (2024) Jeśli masz zainstalowane **Objection >1.12**, możesz zrzucić flagę za pomocą jednego polecenia (Objection wewnętrznie opakowuje Frida): ```bash objection -g owasp.mstg.uncrackable1 explore \ --startup-command "android hooking watch class sg.vantagepoint.a.a method a \n && android hooking set return_value false sg.vantagepoint.a.c * \n && android hooking invoke sg.vantagepoint.a.a a '[B' '[B'" ``` * `watch class` wypisuje tekst jawny zwrócony przez rutynę AES * `set return_value false` zmusza każdą kontrolę root / debuggera do zgłaszania *false* * `invoke` pozwala na bezpośrednie wywołanie metody bez naciskania **Verify**. > UWAGA: W Androidzie 14 (API 34) musisz uruchomić Objection/Frida w trybie *spawn* (`-f`), ponieważ *attach* jest zablokowane przez ograniczenia **seccomp-bpf** wprowadzone w październiku 2024. --- ## Nowoczesne notatki Androida (2023 - 2025) * **libsu 5.x** i **Zygisk** dobrze ukrywają *su*; jednak kontrole oparte na Javie w Poziomie 1 nadal zawodzą, jeśli plik `/system/bin/su` istnieje. Upewnij się, że włączono **denylist** lub po prostu podłącz `java.io.File.exists()` za pomocą Frida. * Frida 16.1 naprawiła awarię w **Android 12/13** spowodowaną alokatorami *Scudo* firmy Google. Jeśli zobaczysz `Abort message: 'missing SHADOW_OFFSET'`, zaktualizuj Frida (lub użyj wstępnie zbudowanej wersji 17.0 nightly). * Ponieważ Play Integrity zastąpiło SafetyNet w 2023 roku, niektóre nowsze aplikacje wywołują API **com.google.android.gms.tasks.Task**. Poziom 1 tego nie robi, ale ta sama strategia podłączania pokazana tutaj działa – podłącz `com.google.android.gms.safetynet.SafetyNetClient` i zwróć sfałszowany *EvaluationType*. ## Odniesienia * Ogłoszenie wydania Frida – "Frida 16.0 (2023-04-02): poprawki niezawodności Androida 12/13 i przegląd API spawn" * Objection 1.12 – "Tryb tylko spawn dla Androida 14" (slajdy z prezentacji BlackHat USA 2024) {{#include ../../../banners/hacktricks-training.md}}