Frida Tutorial 1
Reading time: 5 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 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 允许你在运行的应用程序的函数内部插入 JavaScript 代码。但是你可以使用python来调用钩子,甚至与钩子进行交互。
这是一个简单的 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 一起使用是有用的,但对于这些示例,您也可以直接使用命令行 Frida 工具调用 Frida:
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
Hook 1 - 布尔绕过
在这里你可以看到如何hook一个布尔方法 (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
查看:该函数接收一个字符串作为参数,不需要重载吗?
Hook 2 - 函数暴力破解
非静态函数
如果您想调用类的非静态函数,您首先需要一个该类的实例。然后,您可以使用该实例来调用该函数。
为此,您可以找到一个现有的实例并使用它:
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 - 检索参数和返回值
您可以挂钩一个函数并使其打印传递的参数的值和返回值的值:
//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
}
})
重要
在本教程中,您使用方法名称和 .implementation 钩住了方法。但是如果有 多个同名方法,您需要 指定要钩住的方法,指明参数类型。
您可以在 下一个教程 中看到这一点。
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。