用 Frida 修改软件为你所用
Frida是一个强大的设备操作工具,它允许我们分析、修改和与运行中的应用程序交互。Frida通过在目标进程中创建一个线程,并通过这个线程执行一些启动代码来实现交互功能。这种交互被称为“代理”,它允许我们添加JavaScript代码,实时控制应用程序的行为。
1. 重要功能介绍:Interceptor
Frida中最重要的功能之一是采集器——Interceptor。它允许我们观察、修改内部函数的输入和输出,以及跟踪它们的行为。例如,对于一个类似于此的进程:
你可以使用Frida采集器监控函数调用,更改函数参数值,并返回一个修改后的结果。下面是一个例子:
2. 例子:实时修改say_hello函数
在下面的示例中,应用程序会在终端打印一个数字:
原始say_hello函数:
// Frida JavaScript script to intercept `say_hello`
Interceptor.attach(Module.getExportByName(null, "say_hello"), {
onEnter: function (log, args, state) { },
onLeave: function (log, retval, state) { }
});
输出结果
ubuntu@tryhackme:~$ ./main
Hello, 1!
Hello, 1!
Hello, 1!
Hello, 1!
Hello, 1!
我们想将这个数字改成1337。
添加调用事件处理器
首先,运行 frida-trace
来为每个调用的函数创建处理器:
frida-trace ./main -i '*'
完成后,你会看到一个 handlers 目录,包含每个函数调用对应的JavaScript文件。采用say_hello() 函数,对应的处理器是一个调用文件,它位于 handlers/libhello.so/say_hello.js 。
修改处理器代码
在每次调用前后操作数据:
Interceptor.attach(Module.findExportByName(null, "say_hello"), {
onEnter: function (args) {
var originalArgument = args[0].toInt32();
console.log("Original argument: " + originalArgument);
args[0] = ptr(1337);
},
onLeave: function (retval) {
console.log("Returned value: " + retval.toInt32());
}
});
这个脚本将参数值改为1337,并记录原参数和返回值。
重试结果
重新运行程序:
ubuntu@tryhackme:~$ frida-trace ./main -i 'say*'
Hello, 1337!
Original argument: 1
Returned value: 1337
3. 结论
Frida是一个极具力的分析和操作工具,选择它,你就为分析和应用优化带来了方便和新想法。不管是进行精磨分析,还是实现优化,Frida都是你不可或缺的助手。