frida介绍
GitHub: https://github.com/frida/frida
官方文档:https://frida.re/docs/home/
Frida是一款基于Python
和JavaScript
的Hook
与调试框架,Java
层到 Native
层的 Hook
无所不能,主要使用动态二进制插桩技术,可以插入代码到原生App的内存空间中,动态地去监视和修改行为,可以运行在Android、iOS、Linux、Windows、OSX
等各个平台上。
- 静态二进制插桩(Static Binary Instrumentation):在程序执行前插入额外的代码和数据,生成一个永久改变的可执行文件。
- 动态二进制插桩(Dynamic Binary Instrumentation):在程序运行时实时地插入额外代码和数据,对可执行文件没有任何永久改变。
优点和特性:
- 跨平台:Frida 支持多个操作系统和架构,包括 Windows、macOS、Linux、Android、iOS 和 ARM、x86、x86-64 等。
- 易于使用:Frida 的 API 简单易用,开发者可以使用 Python、JavaScript 等脚本语言编写自己的插件或脚本,并快速进行动态分析和修改应用程序。
- 动态分析:Frida 可以在应用程序运行时对代码进行动态分析和修改,包括函数调用拦截、参数修改、数据读写等操作。
- 内存访问:Frida 可以直接访问应用程序的内存空间,可以读取和修改内存中的数据,可以对加密算法等进行动态修改。
- 模块注入:Frida 可以在运行中的应用程序中注入自己的代码,可以对应用程序进行动态修改,例如修改应用程序行为、跳过授权检查等。
- 反调试:Frida 可以对应用程序进行反调试,保护应用程序免受调试和分析。
安装PC端(客户控制端)
# 更新证书
sudo /Applications/Python\ 3.7/Install\ Certificates.command
# 安装frida
pip3 install frida
# 安装frida工具包
pip3 install frida-tools
安装服务端(手机设备端)
到 https://github.com/frida/frida/releases/latest 下载符合架构的版本,可以通过adb shell getprop ro.product.cpu.abi
查看系统架构。
我这里网易mumu是x64的(注意:需要下载的是server
版本)
# 下载
wget https://github.com/frida/frida/releases/download/16.0.11/frida-server-16.0.11-android-x86_64.xz
# 解压到当前目录
xz -d frida-server-16.0.11-android-x86_64.xz
# 传到设备中
adb push frida-server-16.0.11-android-x86_64 /data/local/tmp/frida-server
# 添加可执行权限并执行
adb shell 'chmod +x /data/local/tmp/frida-server'
启动&&连接
# 转发frida服务端口
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
# 启动frida server 【不能直接 adb shell xxx,不然设备内部会卡】
adb shell
/data/local/tmp/frida-server
验证是否连接成功,可通过如下命令来确认
# 列出设备
frida-ls-devices
Id Type Name OS
------------- ------ --------------------- --------------
local local d4m1tsdeMBP Mac OS X 10.16
emulator-5554 usb Android Emulator 5554 Android 6.0.1
socket remote Local Socket Android 6.0.1
# 列出进程
## -U 连接usb设备
frida-ps -U
## -D 通过设备ID连接
frida-ps -D emulator-5554
附录
frida参数说明
usage: frida [options] target
-h, --help 显示帮助信息并退出
-D ID, --device ID 连接到具有给定 ID 的设备
-U, --usb 连接到 USB 设备
-R, --remote 连接到远程 frida-server
-H HOST, --host HOST 连接到 HOST 上的远程 frida-server
--certificate CERTIFICATE 与 HOST 使用 TLS 通信,期望 CERTIFICATE
--origin ORIGIN 连接到设置了“Origin”头的远程服务器
--token TOKEN 使用 TOKEN 对 HOST 进行身份验证
--keepalive-interval INTERVAL 设置保持连接的间隔时间(以秒为单位),或者设置为 0 表示禁用(默认值为 -1,根据传输自动选择)
--p2p 建立与目标的对等连接
--stun-server ADDRESS 设置 STUN 服务器 ADDRESS 以用于 --p2p
--relay address,username,password,turn-{udp,tcp,tls} 添加用于 --p2p 的中继
-f TARGET, --file TARGET 派生FILE
-F, --attach-frontmost 附加到前台应用程序
-n NAME, --attach-name NAME 附加到 NAME
-N IDENTIFIER, --attach-identifier IDENTIFIER 附加到 IDENTIFIER
-p PID, --attach-pid PID 附加到 PID
-W PATTERN, --await PATTERN 等待生成匹配 PATTERN 的进程
--stdio {inherit,pipe} 生成时的 stdio 行为(默认为“inherit”)
--aux option 在生成时设置 aux 选项,例如“uid=(int)42”(支持的类型为:string、bool、int)
--realm {native,emulated} 要附加的领域
--runtime {qjs,v8} 要使用的脚本运行时
--debug 启用与 Node.js 兼容的脚本调试器
--squelch-crash 如果启用,将不会将崩溃报告转储到控制台
-O FILE, --options-file FILE 包含其他命令行选项的文本文件
--version 显示程序的版本号并退出
-l SCRIPT, --load SCRIPT 加载 SCRIPT
-P PARAMETERS_JSON, --parameters PARAMETERS_JSON JSON 格式的参数,与 Gadget 相同
-C USER_CMODULE, --cmodule USER_CMODULE 加载 CMODULE
--toolchain {any,internal,external} 编译源代码时要使用的 CModule 工具链
-c CODESHARE_URI, --codeshare CODESHARE_URI 加载 CODESHARE_URI
-e CODE, --eval CODE 评估 CODE
-q:安静模式(无提示符)并在-l和-e后退出
-t TIMEOUT,--timeout TIMEOUT:在安静模式下等待终止的秒数
--pause:在生成程序后保留主线程暂停
-o LOGFILE,--output LOGFILE:输出到日志文件
--eternalize:退出前使脚本永久存在
--exit-on-error:遇到脚本中任何异常后以代码1退出
--kill-on-exit:当Frida退出时杀死生成的程序
--auto-perform:将输入的代码用Java.perform包装
--auto-reload:启用提供的脚本和C模块的自动重新加载(默认情况下打开,将来可能需要)
--no-auto-reload:禁用提供的脚本和C模块的自动重新加载
frida-tools
frida
加载js脚本
$ frida -U -l dump_dex.js -f <packagename>
启动后,会有一个交互界面,这个交互界面是可以直接编写javascript
脚本的,如console.log(1);
输入%
会提示一些自带的命令,如resume、help
等。
frida-ls-devices
列举出连接的设备列表
$ frida-ls-devices
frida-ps
这是一个用于列出进程的命令行工具,在与远程系统交互时非常有用。
通过USB将Frida连接到iPad并列出正在运行的进程
$ frida-ps -U
列出正在运行的应用程序
$ frida-ps -Ua
列出已安装的应用程序
$ frida-ps -Uai
将Frida连接到特定设备
$ frida-ps -D 0216027d1d6d3a03
frida-trace
frida trace是一种用于动态跟踪函数调用的工具。
$ frida-trace -U -f <packagename> -i "*decrypt*" --decorate
attach和spawn的区别
spawn
适用于启动新进程并注入Frida代码,而 attach
适用于在已经运行的进程上注入Frida代码。此外,spawn
不需要目标进程的 PID,而 attach
则需要目标进程的 PID。