安装
# 安装最新版
pip install --upgrade frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install frida==16.6.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
旧设备低系统使用frida
- 设备:Redmi3S ,安卓6.0.1,已ROOT。
这种旧手机肯定需要安装老版本的frida,同样的Python也可能需要安装较早版本,为避免影响其他Python的正常使用,推荐在电脑上安装pyenv
,方便随意切换Python版本,参考:使用pyenv创建多版本Python环境
先找到支持安卓6.0.1的frida版本:12.9.7
Android版本 | Frida版本 | frida-tools | Python |
---|---|---|---|
4.1 - 4.3 | 12.6.13 | ||
4.4 | 12.7.0 | ||
5.0 - 5.1 | 12.8.1 | ||
6.0 - 6.0.1 | 12.9.7 | 5.1.0 | 3.8 |
7.0 - 7.1 | 12.9.8 | ||
8.0 - 8.1 | 12.10.4 | ||
9 | 12.11.7 16.1.10 16.6.6 | 8.1.3 12.0.0 最新 | 3.8+ |
10 | 12.12.0 | ||
11 | 12.12.2 |
在较新的Python下是无法直接通过pip install的方式安装frida的,会报错:
PyPI no longer supports the XMLRPC package_releases method. Use JSON or Simple API instead.
只能通过离线包进行安装,到 Links for frida 找到对应的版本,适合Windows10且Python3.X的包就只有:frida-12.9.7-py3.8-win-amd64.egg
而且可以看出,我们需要使用Python3.8,通过:
pyenv install -l | findstr 3.8
可以查询出最大可用的版本是3.8.10,安装:
pyenv install 3.8.10
安装成功后要切换Python到这个版本,发现使用pyenv global 3.8.10
并不能成功切换。但是在使用 pyenv versions
查看本地安装的版本的时候,能够看出当前版本是在文件%USERPROFILE%\.python-version
文件里指定的,只需要打开编辑该文件,修改为3.8.10
即可。然后再次执行 pyenv versions
查看当前版本已经正确切换了。
egg
包是早期的Python离线安装包,新的whl
格式的包。安装egg包需要使用easy_install
,需要安装三方工具库:setuptools
。
较新的setuptools
安装后不会生成easy_install
,需要安装一个较老的版本,这里选择 setuptools==50.3.2
是因为该版本已知会生成 easy_install
。
pip install setuptools==50.3.2
安装成功后安装egg包:
easy_install frida-12.9.7-py3.8-win-amd64.egg
之后就可以安装12.9.7版本的frida了:
pip install frida==12.9.7 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install frida-tools==5.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
注意frida-tools
一定要在后面安装且必须指定相应的版本,如果不填版本默认会安装成最新版本的frida。
后续在手机安装frida-server
及脚本就都一样了。
App内置frida免root方案
该方案通过将Frida-gadget
库和hook脚本文件内置到APK中,使得应用在启动时自动加载Frida-gadget
,并执行内置的hook脚本,从而实现免root环境下的动态分析和hook操作。其核心在于通过特定方式将Frida-gadget
和脚本文件嵌入到APK的资源文件中,并在应用启动时加载。该方案会修改apk源文件,包括添加新的so文件、修改Smali代码或调整so依赖库等
适用场景:需要将hook方案分享分发给他人使用且无root权限,该方案可以将hook逻辑内置到APK中,方便他人直接使用。
工具:Apktool、dex2c(可选)、frida-gadget库、LIEF或patchelf(如需要)、Python环境(如需要)、签名工具等。
兼容性效果测试:在Android9.0系统上验证可行,6.0系统不行,华为mate30不行。
libfrida-gadget.config.so
{
"interaction":{
"type":"script",
"path":"libjs.so"
}
}
libjs.so
/**
* Frida Hook Script - Hook 所有 Activity 的 onCreate 方法
*
* 功能:
* 1. 监测所有 Activity 的启动,打印日志。
* 2. 通过 Toast 提示当前启动的 Activity 名称。
* 3. 采用 Java.scheduleOnMainThread 确保 UI 线程执行 Toast 显示。
* 4. 增强错误处理,防止 Hook 过程中异常导致崩溃。
*/
if (Java.available) {
Java.perform(function () {
console.log("Hooking any Activity...");
try {
var Activity = Java.use("android.app.Activity");
var StringCls = Java.use("java.lang.String");
var Toast = Java.use("android.widget.Toast");
var ActivityThread = Java.use("android.app.ActivityThread");
var context = ActivityThread.currentApplication().getApplicationContext();
Activity.onCreate.overload("android.os.Bundle").implementation = function (bundle) {
var activityClassName = this.getClass().getName();
console.log(activityClassName + " onCreate hooked!");
this.onCreate(bundle);
Java.scheduleOnMainThread(function () {
var message = StringCls.format(StringCls.$new("Frida Hook成功! 通过so注入方式\n当前Activity: %s"), activityClassName);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
});
};
} catch (e) {
console.log("Hook 过程中出现异常: " + e);
}
});
} else {
console.log("Java environment not available!");
}
实施步骤
一、基于JAVA层Smali代码调用Frida库
- 准备工具和环境:安装Apktool、dex2c(如需要)、frida-gadget库等工具。
- 反编译目标APK:使用Apktool对目标APK进行反编译。
- 修改Smali代码:在首启activity或application的onCreate方法中植入调用Frida库的Smali代码,即
System.loadLibrary("frida-gadget")
。 - 添加frida-gadget库:根据目标设备的CPU架构和Frida版本,从Frida的官方发布页面下载对应的frida-gadget.so文件,放置到反编译后的APK的so目录下。
- 配置frida-gadget:修改frida-gadget的配置文件
libfrida-gadget.config.so
,指定hook脚本文件的路径(如libjs.so)。 - 添加hook脚本文件:将hook的js代码文件(如libjs.so)放置到APK的assets目录或其他合适的位置。
- 重新编译APK:使用Apktool重新编译APK,并签名。
- 安装和测试:将修改后的APK安装到设备上,打开应用,验证Frida是否成功加载并执行hook操作。
二、基于so层通过添加依赖库方式调用Frida库
- 准备工具和环境:安装Apktool、dex2c(如需要)、frida-gadget库、LIEF或patchelf等工具。
- 反编译目标APK:使用Apktool对目标APK进行反编译。
- 找到目标so文件:确定应用启动时调用的so文件。
- 修改so依赖库:使用LIEF或patchelf等工具,将frida-gadget.so添加为该so文件的依赖库。例如,使用patchelf命令
patchelf --add-needed frida-gadget.so apk.so
。 - 添加frida-gadget库:根据目标设备的CPU架构和Frida版本,从Frida的官方发布页面下载对应的frida-gadget.so文件,放置到反编译后的APK的so目录下。
- 配置frida-gadget:修改frida-gadget的配置文件
libfrida-gadget.config.so
,指定hook脚本文件的路径(如libjs.so)。 - 添加hook脚本文件:将hook的js代码文件(如libjs.so)放置到APK的assets目录或其他合适的位置。
- 重新编译APK:使用Apktool重新编译APK,并签名。
- 安装和测试:将修改后的APK安装到设备上,打开应用,验证Frida是否成功加载并执行hook操作。
最终重打包后的App安装包的文件目录形式如下:
app.apk
└── lib
└── arm64-v8a
├── libfrida-gadget.so
├── libfrida-gadget.config.so
└── libjs.so
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/sec/frida.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)