Frida 教程 1
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://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
源代码: https://github.com/t0thkr1s/frida-demo
Python
Frida 允许你在正在运行的应用的函数中 insert JavaScript code。但你可以使用 python 来 call 这些 hooks,甚至可以 interact 与这些 hooks。
下面是一个简单的 python 脚本,可用于本教程中提出的所有示例:
#hooking.py
import frida, sys
with open(sys.argv[1], 'r') as f:
jscode = f.read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()
调用脚本:
python hooking.py <hookN.js>
了解如何使用 python 与 frida 配合非常有用,但在这些示例中,你也可以直接使用 command line frida tools 来调用 Frida:
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
Hook 1 - Boolean Bypass
在这里你可以看到如何 hook 一个 boolean 方法 (checkPin) 来自类:infosecadventures.fridademo.utils.PinUtil
//hook1.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")
var MainActivity = Java.use("infosecadventures.fridademo.utils.PinUtil")
MainActivity.checkPin.implementation = function (pin) {
console.log("[ + ] PIN check successfully bypassed!")
return true
}
})
python hooking.py hook1.js
Mirar: La funcion recibe como parametro un String, no hace falta overload?
Hook 2 - Function Bruteforce
Non-Static Function
如果你想调用一个类的 non-static function,你 first need a instance。然后,你可以使用该 instance 来调用该函数。
为此,你可以 find and existing instance 并使用它:
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
Java.choose("infosecadventures.fridademo.utils.PinUtil", {
onMatch: function (instance) {
console.log("[ * ] Instance found in memory: " + instance)
for (var i = 1000; i < 9999; i++) {
if (instance.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
break
}
}
},
onComplete: function () {},
})
})
在这种情况下这不起作用,因为没有任何实例并且该函数是静态的
静态函数
如果函数是静态的,你可以直接调用它:
//hook2.js
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
var PinUtil = Java.use("infosecadventures.fridademo.utils.PinUtil")
for (var i = 1000; i < 9999; i++) {
if (PinUtil.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
}
}
})
Hook 3 - 检索参数和返回值
你可以 hook 一个函数并让它 打印 传入参数 的值以及 返回值 的值:
//hook3.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")
var EncryptionUtil = Java.use(
"infosecadventures.fridademo.utils.EncryptionUtil"
)
EncryptionUtil.encrypt.implementation = function (key, value) {
console.log("Key: " + key)
console.log("Value: " + value)
var encrypted_ret = this.encrypt(key, value) //Call the original function
console.log("Encrypted value: " + encrypted_ret)
return encrypted_ret
}
})
Hooking on recent Android versions (14/15/16)
- 自 Frida 17.1.x+ 起,Android 14–16 上的 Java hooking 已恢复稳定(ART quick entrypoint offsets 已修复)。如果在 Android 14+ 上
Java.choose返回空,升级 frida-server/gadget 和 CLI/Python 包到 >=17.1.5。 - 含有早期 anti-debug 检查的应用通常会在
attach之前崩溃。使用 spawn 以便在onCreate之前加载 hooks:
frida -U -f infosecadventures.fridademo -l hook1.js --no-pause
- 当存在多个重载时,明确选择目标:
var Cls = Java.use("com.example.Class")
Cls.doThing.overload('java.lang.String', 'int').implementation = function(s, i) {
return this.doThing(s, i)
}
使用 Zygisk Gadget 进行更隐蔽的注入
某些应用会检测 ptrace 或 frida-server。Magisk/Zygisk 模块可以在 Zygote 内加载 frida-gadget,因此不会有进程被 ptraced:
- 安装一个 Zygisk gadget 模块(例如
zygisk-gadget)并重启。 - 配置目标包和可选的延迟以绕过启动检查:
adb shell "su -c 'echo infosecadventures.fridademo,5000 > /data/local/tmp/re.zyg.fri/target_packages'"
- 启动应用并附加到设备名:
frida -U -n Gadget -l hook3.js
因为 gadget 被 Zygote 注入,APK 的完整性检查保持不变,基本的 ptrace/Frida 字符串检测通常会失败。
重要
在本教程中你使用方法名和 .implementation 来 hook 方法。但是如果存在 多个同名方法,你将需要 指定你要 hook 的方法,并 指明参数的类型。
你可以在 the next tutorial 中看到。
References
- Frida News (Android 14–16 fixes & Frida 17.x releases)
- zygisk-gadget – Zygisk module that loads frida-gadget
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 来分享黑客技巧。


