frida使用汇总

2025/02/27 sec 共 4198 字,约 12 分钟

安装

# 安装最新版
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-toolsPython
4.1 - 4.312.6.13  
4.412.7.0  
5.0 - 5.112.8.1  
6.0 - 6.0.112.9.75.1.03.8
7.0 - 7.112.9.8  
8.0 - 8.112.10.4  
912.11.7
16.1.10
16.6.6
8.1.3
12.0.0
最新
3.8+
1012.12.0  
1112.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库

  1. 准备工具和环境:安装Apktool、dex2c(如需要)、frida-gadget库等工具。
  2. 反编译目标APK:使用Apktool对目标APK进行反编译。
  3. 修改Smali代码:在首启activity或application的onCreate方法中植入调用Frida库的Smali代码,即System.loadLibrary("frida-gadget")
  4. 添加frida-gadget库:根据目标设备的CPU架构和Frida版本,从Frida的官方发布页面下载对应的frida-gadget.so文件,放置到反编译后的APK的so目录下。
  5. 配置frida-gadget:修改frida-gadget的配置文件libfrida-gadget.config.so,指定hook脚本文件的路径(如libjs.so)。
  6. 添加hook脚本文件:将hook的js代码文件(如libjs.so)放置到APK的assets目录或其他合适的位置。
  7. 重新编译APK:使用Apktool重新编译APK,并签名。
  8. 安装和测试:将修改后的APK安装到设备上,打开应用,验证Frida是否成功加载并执行hook操作。

二、基于so层通过添加依赖库方式调用Frida库

  1. 准备工具和环境:安装Apktool、dex2c(如需要)、frida-gadget库、LIEF或patchelf等工具。
  2. 反编译目标APK:使用Apktool对目标APK进行反编译。
  3. 找到目标so文件:确定应用启动时调用的so文件。
  4. 修改so依赖库:使用LIEF或patchelf等工具,将frida-gadget.so添加为该so文件的依赖库。例如,使用patchelf命令patchelf --add-needed frida-gadget.so apk.so
  5. 添加frida-gadget库:根据目标设备的CPU架构和Frida版本,从Frida的官方发布页面下载对应的frida-gadget.so文件,放置到反编译后的APK的so目录下。
  6. 配置frida-gadget:修改frida-gadget的配置文件libfrida-gadget.config.so,指定hook脚本文件的路径(如libjs.so)。
  7. 添加hook脚本文件:将hook的js代码文件(如libjs.so)放置到APK的assets目录或其他合适的位置。
  8. 重新编译APK:使用Apktool重新编译APK,并签名。
  9. 安装和测试:将修改后的APK安装到设备上,打开应用,验证Frida是否成功加载并执行hook操作。

最终重打包后的App安装包的文件目录形式如下:

app.apk
└── lib
    └── arm64-v8a
        ├── libfrida-gadget.so
        ├── libfrida-gadget.config.so
        └── libjs.so

文档信息

Search

    Table of Contents

    目录