Frida Tutorial 3
Reading time: 6 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
 
Este Ă© um resumo do post: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk
Solução 1
Baseado em https://joshspicer.com/android-frida-1
Hook a função _exit() e função de descriptografia para que imprima a flag no console do frida quando vocĂȘ pressionar verificar:
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.")
})
Solução 2
Baseado em https://joshspicer.com/android-frida-1
Hook rootchecks e função de descriptografia para que imprima a flag no console do frida quando vocĂȘ pressionar verificar:
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.")
})
Solução 3 â frida-trace (Frida â„ 16)
Se vocĂȘ nĂŁo quiser escrever hooks manualmente, pode deixar o Frida gerar os stubs Java para vocĂȘ e depois editĂĄ-los:
# 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
Com o Frida 16+, o stub gerado jĂĄ utiliza a sintaxe moderna de template ES6 e serĂĄ compilado com o runtime QuickJS embutido â vocĂȘ nĂŁo precisa mais do frida-compile.
Solução 4 â Um comando com Objection (2024)
Se vocĂȘ tiver Objection >1.12 instalado, pode despejar a flag com um Ășnico comando (Objection envolve o Frida internamente):
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 classimprime o texto em claro retornado pela rotina AESset return_value falseforça cada verificação de root / debugger a relatar falseinvokepermite que vocĂȘ chame o mĂ©todo diretamente sem pressionar Verify.
NOTA: No Android 14 (API 34) vocĂȘ deve executar Objection/Frida em modo spawn (
-f) porque attach estå bloqueado por restriçÔes de seccomp-bpf introduzidas em outubro de 2024.
Notas sobre Android Moderno (2023 - 2025)
- libsu 5.x e Zygisk escondem su muito bem; no entanto, as verificaçÔes baseadas em Java no NĂvel 1 ainda falham se o arquivo 
/system/bin/suexistir. Certifique-se de habilitar denylist ou simplesmente hookjava.io.File.exists()com Frida. - Frida 16.1 corrigiu uma falha no Android 12/13 causada pelo alocador Scudo do Google. Se vocĂȘ ver 
Abort message: 'missing SHADOW_OFFSET', atualize o Frida (ou use a versĂŁo noturna prĂ©-compilada 17.0). - Como o Play Integrity substituiu o SafetyNet em 2023, alguns aplicativos mais novos chamam a API com.google.android.gms.tasks.Task. O NĂvel 1 NĂO faz isso, mas a mesma estratĂ©gia de hooking mostrada aqui funciona â hook 
com.google.android.gms.safetynet.SafetyNetCliente retorne um EvaluationType forjado. 
ReferĂȘncias
- AnĂșncio de lançamento do Frida â "Frida 16.0 (2023-04-02): correçÔes de confiabilidade do Android 12/13 e reformulação da API spawn"
 - Objection 1.12 â "Modo apenas spawn para Android 14" (slides da palestra BlackHat USA 2024)
 
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
 
HackTricks