Frida Tutorial 3
Reading time: 6 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
这是帖子摘要: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk
解决方案 1
基于 https://joshspicer.com/android-frida-1
Hook _exit() 函数和 decrypt function 以便在你按下验证时在 frida 控制台打印标志:
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.")
})
解决方案 2
基于 https://joshspicer.com/android-frida-1
Hook rootchecks 并解密函数,以便在您按下验证时在 frida 控制台中打印标志:
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.")
})
解决方案 3 – frida-trace
(Frida ≥ 16)
如果您不想手动编写钩子,可以让 Frida 为您生成 Java 存根,然后进行编辑:
# 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
使用 Frida 16+ 生成的存根已经使用现代的 ES6 模板语法,并将与内置的 QuickJS 运行时编译 – 您不再需要 frida-compile
。
解决方案 4 – 使用 Objection 的单行命令 (2024)
如果您安装了 Objection >1.12,您可以通过单个命令转储标志(Objection 在内部包装了 Frida):
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
打印 AES 例程返回的明文set return_value false
强制每个 root / debugger 检查报告 falseinvoke
允许你直接调用方法而无需按 Verify。
注意:在 Android 14 (API 34) 上,你必须以 spawn 模式运行 Objection/Frida (
-f
),因为 attach 被 2024 年 10 月引入的 seccomp-bpf 限制阻止。
现代 Android 备注 (2023 - 2025)
- libsu 5.x 和 Zygisk 隐藏 su 相当好;然而,如果文件
/system/bin/su
存在,Level 1 中基于 Java 的检查仍然会失败。确保启用 denylist 或者简单地用 Frida 钩住java.io.File.exists()
。 - Frida 16.1 修复了 Android 12/13 上由 Google 的 Scudo 分配器引起的崩溃。如果你看到
Abort message: 'missing SHADOW_OFFSET'
,请升级 Frida(或使用预构建的 17.0 夜间版)。 - 因为 Play Integrity 在 2023 年取代了 SafetyNet,一些较新的应用调用 com.google.android.gms.tasks.Task API。Level 1 不这样做,但这里展示的相同钩住策略有效 – 钩住
com.google.android.gms.safetynet.SafetyNetClient
并返回伪造的 EvaluationType。
参考
- Frida 发布公告 – "Frida 16.0 (2023-04-02): Android 12/13 可靠性修复 & spawn API 彻底改造"
- Objection 1.12 – "仅 spawn 模式适用于 Android 14" (BlackHat USA 2024 演讲幻灯片)
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。