Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。
frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。
frida上层接口支持js、python、c等。
Frida官方github地址为:frida官方github地址
PS:虽然百度一下会发现frida教程有不少,但是涉及到native层的教程基本很少,然后对每一句Hook代码解释一下的更是少之又少,所以我还是厚着脸皮从自己的角度写了这一篇!!!
0|1二、Frida安装
1 、安装python3.7并配置好环境变量(官方推荐python3以上版本至少为3.7),python安装包官方下载地址:https://www.python.org/downloads/。
2 、安装frida模块,命令为pip install frida
(配置了多个python版本环境的可以使用命令python -m pip install frida
防止用pip install frida
命令报错)。
3、安装frida-tools模块,命令同上,pip install frida-tools
或者python -m pip install frida-tools
。
4、下载运行在目标机上的frida-sever端,官方下载地址:https://github.com/frida/frida/releases,下载时要选择对应的版本下载,例如我的机器为arm32为架构,就选择frida-server-12.8.14-android-arm.xz
下载。(可以在adb使用命令cat /proc/cpuinfo
查询)
5、将第四步下载好的文件解压,然后通过命令adb push 你的电脑是存放位置 /data/local/tmp
将文件传输到手机中,然后通过adb shell
进入手机端,给文件赋权777,并于root权限启动。
6、做完以上几步后,新开一个命令行输入命令frida-ps -U
查看手机进程,如果出现以下结果,则frida安装成功。
0|1三、Frida Hook Java层
1、编写一个小demo用来hook,该demo关键部分代码如下:
2、现在我们将该apk安装好,运行看一下未Hook前的显示字符串!!!
3、现在来编写Hook的Python脚本,脚本代码如下:
4、现在python脚本编写完毕,我们来执行该脚本,首先手机端执行frida,然后通过命令adb forward tcp:27043 tcp:27043
和adb forward tcp:27042 tcp:27042
来转发这两个端口,接着在手机上运行该应用程序,在命令行中执行脚本,最后点击应用的按钮,即可看到字符串已经被替换成我们要替换的了!!!
0|1四、Frida Hook Native层
4.1、Hook native层返回值为int类型的demo
1、还是先写一个小demo,下面贴一下关键代码(很简单c语言代码就不再解释了,至于native层函数怎么编写,由于本篇主要不是讲怎么编写so函数,就不过多叙述了,实在不会的可以看一下我的一篇博客,我觉得写得还是挺详细的,博客编写native层函数链接:https://www.cnblogs.com/aWxvdmVseXc0/p/11564809.html)和未Hook前截图:
代码:
2、接下来我们来写python hook脚本,我们需要hook native层这个函数,达到返回值修改为0的效果。写到这里需要说明一下关于so文件当中的函数,分为导出函数和未导出函数两种,导出函数打开IDA后能够在导出表中找到的函数就是导出函数,未导出函数则在导出表中寻找不到,一般来说静态编写的native函数都能在导出表中寻找到,而动态加载的则无法在导出表中发现!!!
代码如下:(跟上面hook java层重复的代码不在注释详讲了!!!)
3、最后在手机端执行frida-server,转发端口,开启应用,执行脚本,点击按钮,即可看到返回值已经被修改成了0,效果图如下:
4.2、Hook native层返回值为String类型的demo
1、上面已经写了怎么Hook修改native层函数返回值为int类型的情况,使用replace()
函数直接修改即可,但是返回情况为字符串则不一样,在c语言中,返回值为字符串其实是返回了一个char *
(字符串指针),所以简单的替换是无法取效果的,具体怎么修改返回值,接着看下面,下面还是贴上demo的关键代码和未Hook前截图:
代码如下:
未Hook前运行截图:
2、接下来是python Hook脚本(只解释与上面有差异的代码),Hook的函数具体函数名还是使用IDA去寻找
python代码:
3、运行脚本后,点击按钮,我们可以看到字符串已经被替换成了tamper
,如下所示:
4、关于为导出函数的Hook,大体上差不多,差别在于需要通过ida找到偏移值计算地址,而不是像导出函数这么方便罢了,但原理都是差不多的,就不在细说了!!!