Frida apk hook
Frida简介
frida是一款基于python + javascript 的hook框架,可运行在android、ios、linux、windows、macos等各平台,主要使用动态二进制插桩技术。frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。frida上层接口支持js、python、c等。
Frida安装
安装python3
pip安装frida模块
1
pip install frida
pip安装frida-tools模块
1
pip install frida-tools
下载运行在目标机器上的服务端:官方地址,要根据目标机器cpu架构选择。可以在
/proc/cpuinfo
中查看cpu信息。adb连接手机
在手机上运行该服务端程序并进行端口映射
1
2
3
4
5
6adb push frida-server-14.2.14-android-x86 /data/local/tmp
adb forward tcp:27042 tcp:27042
adb shell
cd /data/local/tmp
chmod +x frida-server-14.2.14-android-x86
./frida-server-14.2.14-android-x86本机执行命令
frida-ps -U
进行测试,若成功打印手机端的进程则表示安装成功。
Frida hook Java层
以攻防世界的Ph0en1x-100为例,jeb查看Java代码找到关键判断:
用getSecret()分别处理getFlag()和encrypt(sInput)后将两个值比较,sInput是输入,只需要让getFlag()和encrypt(sInput)的值相同即可,ida查看so文件发现encrypt()函数只是将输入字符串的每一位ascii码-1,而getFlag()函数没有输入,故返回值不变,可以通过hook得到返回值。
尝试修改getSecret()的返回值为”qaq”,脚本:
1 | import frida,sys #导入模块 |
先在手机端运行app,之后在本地执行python脚本,之后在手机端输入框随便输入:
执行了两次getSecret()
函数,发送了两次消息回调了两次on_message()
,而两次getSecret()
的返回值都被修改成了”qaq”,所以无论输入什么值都可以通过判断。
Frida hook Native层
还说用这个程序,我们尝试hook Native层的getFlag()
函数打印出返回值。需要说明一下关于so文件当中的函数,分为导出函数和未导出函数两种,导出函数打开IDA后能够在导出表中找到的函数就是导出函数,未导出函数则在导出表中寻找不到,一般来说静态编写的native函数都能在导出表中寻找到,而动态加载的则无法在导出表中发现。
python脚本:
1 | import frida,sys |
先在手机端运行app,之后在本地执行python脚本,之后在手机端输入框随便输入:
可以看到js代码把字符串的值发回给python,之后python打印出来了。