安卓hook之frida安装入门
frida是一个使用动态二进制插桩技术的跨平台工具,最早在测试安卓APP项目时接触到的。网上关于frida的教程很多,大多数人(至少我)可能只会用到百分之几的功能。本文仅重点介绍(还原)安装frida的过程。
我的测试环境:win10 64位;python3.8.0(官方推荐python3.x,我测试时2.8版本没成功也没折腾多版本python切换就直接卸载安装3.8了);夜神模拟器安卓7.1。
一、在win10上安装frida客户端
可去官网看frida支持的python版本 https://pypi.org/project/frida/#files
主要命令
pip install frida
pip install frida-tools
记住在windows系统下的firda版本,然后去下载对应版本的frida-server
二、下载frida-server服务端
下载地址https://github.com/frida/frida/releases 注意: frida版本要与frida-server版本一致
三、在安卓模拟器上安装frida-server服务端
使用夜神adb操作模拟器,可以参考这个地址 https://blog.csdn.net/test_leader/article/details/115491496
1、在模拟器的安卓上打开所有开发者调试相关开关
2、找到夜神安卓目录下的nox_adb.exe进行连接,不会找的可以用windows的搜索后打开所在目录。
打开cmd命令行切换到当前目录(也可以在该文件夹空白的地方按住shift键+鼠标右键,然后选择在此处打开命令行/Powershell)
nox_adb.exe connect 127.0.0.1:62001
3、把下载的frida-server文件(我下的是frida-server-15.1.17-android-x86.xz)解压后复制到第2步的nox_adb.exe所在文件夹里面重命名为firda-server(注意这个文件没有后缀),然后使用adb命令进行相关安装操作。
推送frida-server这个文件到模拟器的tmp目录
adb push frida-server /data/local/tmp/
推送完成后依次执行adb命令,修改权限并执行frida-server程序
adb shell
cd /data/local/tmp/
chmod 777 frida-server
./frida-server &
执行完上面操作后,可以新打开一个cmd窗口执行frida-ps -U命令查看是否能显示模拟器上的安卓进程
如果出现失败可能就是frida-server版本出问题了,还有需要root权限,建议使用夜神模拟器。
4、关于端口转发
转发Android tcp端口到本地(新版本的frida可能不需要端口转发,老版本的需要转发,为以防万一建议还是执行下这2行命令)
), 电脑上运行如下命令 :
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
5、关于模拟器重启后或执行python脚本异常报错
frida.TransportError: error receiving data: 远程主机强迫关闭了一个现有的连接。
需要在模拟器中运行frida server程序(如果还是不行,建议先重启模拟器后再重新执行命令打开frida服务端)
adb shell
cd /data/local/tmp/
./frida-server &
四、执行一个python脚本来hook
我是实现了hook目标app的md5函数,只要目标app调用了md5就可以打印出来。如果你测试的app有源码或能反编译的话可以通过hook相关验签函数来实现app签名或逻辑校验绕过等功能(比如app有时会有强制更新,可以通过直接将app判断强制更新的函数hook后改成不更新或非强制更新)
下面是我测试时的代码,仅供学习使用,不能在不同app之间通用,我hook的是com.xxx.test.ec.util.Md5Util这个方法,这个需要根据app的实际方法来,我是通过jadx反编译后复制出来的类名。
# -*- coding: utf-8 -*- # 导入 frida, sys 库 import frida, sys #md5--hook- jscode = """ Java.perform(function(){ <!-- 获取 MD5Util 这个类的对象 --> var utils = Java.use("com.xxx.test.ec.util.Md5Util"); <!-- 调用 ToMd5 这个,这个方法的参数有1个 --> utils.md5.overload('java.lang.String').implementation = function(a){ send("Hook Start..."); send("传入参数: " +a); <!-- 获取 ToMD5 这个方法执行的结果,并打印到控制台上 --> var res= this.md5(a); send("ToMD5 方法返回值: " +res); return res; } }); """ # 这下面的代码的作用就是为了执行上面 JS 代码,输出 JS 中 send() 方法中的内容 def message(message, data): if message["type"] == 'send': print("[*] {0}".format(message['payload'])) else: print(message) # 获取这个 APK 的进程 #process = frida.get_remote_device().attach('com.xxx.test:pushcore') #process = frida.get_usb_device().attach(3281) process = frida.get_remote_device().attach('这里填目标app的名字') # 加载 JS 代码 script = process.create_script(jscode) script.on("message", message) print('[*] Running CTF') script.load() sys.stdin.read()
其他参考来源:
frida基础详解 https://www.secpulse.com/archives/132082.html
frida初级到高级 https://blog.csdn.net/cqcre/article/details/106798576
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/android-hook-frida-base/
微信赞赏支付宝赞赏
发表评论