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

这是文章的摘要: 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。但你可以使用 pythoncall 这些 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/gadgetCLI/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 进行更隐蔽的注入

某些应用会检测 ptracefrida-server。Magisk/Zygisk 模块可以在 Zygote 内加载 frida-gadget,因此不会有进程被 ptraced:

  1. 安装一个 Zygisk gadget 模块(例如 zygisk-gadget)并重启。
  2. 配置目标包和可选的延迟以绕过启动检查:
adb shell "su -c 'echo infosecadventures.fridademo,5000 > /data/local/tmp/re.zyg.fri/target_packages'"
  1. 启动应用并附加到设备名:
frida -U -n Gadget -l hook3.js

因为 gadget 被 Zygote 注入,APK 的完整性检查保持不变,基本的 ptrace/Frida 字符串检测通常会失败。

重要

在本教程中你使用方法名和 .implementation 来 hook 方法。但是如果存在 多个同名方法,你将需要 指定你要 hook 的方法,并 指明参数的类型

你可以在 the next tutorial 中看到。

References

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