Hook改变程序执行流程的一种技术 在函数/方法被调用前,通过HOOK技术,先得到该函数/方法的控制权,实现该函数/方法的逻辑改写。常用的Hook框架有xposed和frida。xposed是Java语言开发的,只能hook应用层(Java),开发经常需要重启设备,开发效率低,与安卓能无缝对接。frida是C语言开发的, 能Hook 安卓 iOS windows 应用层 native层,可以使用JS和Python代码完成Hook,不需要重启设备,开发效率高。与安卓的数据类型转换麻烦。
Frida是一款轻量级HOOK框架, 可以在Windows、macOS、GNU/Linux、iOS、Android、QNX平台上使用。Frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。可以通过C、Node.js, Python, Swift, NET, Qml等语言进行开发。
准备一台root的安卓 或 安卓模拟器(推荐夜神模拟器)
python 版本 3.7
python 模块 Frida、Frida-tools
Frida官方文档: https://www.frida.re/docs/javascript-api
pip install frida
pip install frida-tools
我自己上传的资源:Frida-server-12.8.10-android-arm64.xz
下载后将资源推送到手机 /data/local/tmp/ 目录下
adb push frida-server-12.8.10-android-arm64 /data/local/tmp/
进入到手机
adb shell
切换root用户
su root
进入到对应目录
cd /data/local/tmp
修改文件权限
chmod 777 frida-server-12.8.10-android-arm64
启动服务
./frida-server-12.8.10-android-arm64
frida-ps -U
输出如图就成功了
windows运行 端口转发到PC
adb forward tcp:27043 tcp:27043
adb forward tcp:27042 tcp:27042
如何使用Frida在调用函数时检查它们,修改其参数以及对目标进程内部的函数进行自定义调用。
#include
#include
void
f (int n)
{
printf ("Number: %d\n", n);
}
int
main (int argc,
char * argv[])
{
int i = 0;
printf ("f() is at %p\n", f);
while (1)
{
f (i++);
sleep (1);
}
}
$ gcc -Wall hello.c -o hello
f()
(0x400544
在以下示例中)的地址:f() is at 0x400544
Number: 0
Number: 1
Number: 2
…
以下脚本显示了如何在目标进程中挂接对函数的调用,以及如何输出函数参数。创建一个hook.py
包含以下内容的文件:
from __future__ import print_function
import frida
import sys
session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
send(args[0].toInt32());
}
});
""" % int(sys.argv[1], 16))
def on_message(message, data):
print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()
运行脚本
$ python hook.py 0x400544
输出
{
u'type': u'send', u'payload': 531}
{
u'type': u'send', u'payload': 532}
…
我们要修改传递给目标进程内部函数的参数。创建modify.py
具有以下内容的文件:
import frida
import sys
session = frida.attach("hello")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter: function(args) {
args[0] = ptr("1337");
}
});
""" % int(sys.argv[1], 16))
script.load()
sys.stdin.read()
针对hello
进程(应该仍在运行)运行此命令:
$ python modify.py 0x400544
此时,运行的终端hello process
应停止计数并始终报告1337
,直到您单击Ctrl-D
脱离它为止。
Number: 1281
Number: 1282
Number: 1337
Number: 1337
Number: 1337
Number: 1337
Number: 1296
Number: 1297
Number: 1298
…
使用Frida在目标进程内部调用函数。创建call.py
包含以下内容的文件 :
import frida
import sys
session = frida.attach("hello")
script = session.create_script("""
var f = new NativeFunction(ptr("%s"), 'void', ['int']);
f(1911);
f(1911);
f(1911);
""" % int(sys.argv[1], 16))
script.load()
运行脚本
$ python call.py 0x400544
注意正在运行的终端hello
Number: 1879
Number: 1911
Number: 1911
Number: 1911
Number: 1880
…
下一讲将使用Frida做个案例