跳转至

Arida Frida Rpc 工具介绍

前言

本文用于介绍 frida rpc 的其中一个较简单的实现方式,至于为什么简单还写个文章,是因为官方文档过于简洁,网上资料的相对较少或过于麻烦,按照其教程大概率会掉入坑里,所以有了这篇文章。

目前比较流行的 frida rpc 方案及简要说明

  • 平头哥结合 sekiro 之类的实现
    • 优点:手机不用 root,插件修改不用重启手机等,建议查看官方文档说明。
  • xposed 插件之类实现
    • 优点:相对稳定
  • Arida 之类的实现
    • 优点:项目中使用的都是 jspython 的胶水语言,编写快速,两分钟即可搭建。

其实以上的各种实现的优缺点都是相对而言的。

在遇到过于复杂 so 逻辑时,且需要快速开发时,可根据应用场景选择具体某个方式实现即可。

以后会添加平头哥 rpc 的实现方式说明。

1. 前提准备

需要提前做好环境和相关依赖库的配置!
  • arida github 地址,下载其 arida 代码
  • frida github 地址,下载 frida 及对应版本的 frida-server
  • 安装 arida 环境需要的 nodejs 相关支持库
    • python v3.8+,其依赖库在 requirement.txt 中查看
    • nodejs v12+,也需要安装其依赖库

2. 实现步骤

以下为 arida 工具实现 rpc 的具体步骤

2.1. 完成前提准备

这里是对前提准备中的详细说明

1. 前提准备 中的内容提前做好。

推荐使用新建的虚拟环境,以免对原有环境的影响,至于使用 conda,还是 virtualenv-wrapperpipenv 等就看自己使用习惯,不限制。

网上其它的教程一般使用的是 Ubuntu 之类的虚拟机,确实 linux 虚拟机会很方便也会少些坑,我也成功尝试过,不过还是 windowsmac 实机比较香。以下为 windows 实机演示。

requirements.txt 中的 py 依赖库如下:

1
2
3
4
5
6
7
fastapi==0.61.1
loguru==0.5.3
uvicorn==0.11.8
pyexecjs==1.5.1
wincertstore==0.2
win32-setctime==1.0.2
frida==12.11.17

nodejs 依赖库:

npm install @babel/core babel-loader

2.2. 启动 frida_server

启动对应的 fs,记得加上其执行权限。

image-20220504161436570

2.3. 启动被注入的 app

这里以简单的 aes 加密为示例:

image-20220504161946582

2.4. arida 相关配置

2.4.1. 编写 arida 相关脚本

可以根据 arida 的项目目录,然后修改对应的 config.pyapps 目录下的 hook js 脚本即可。

这里不详细讲如何编写 frida hook js 的脚本编写,具体请看 frida 高级 api 食用方法(一) 中的详细介绍

config 配置示例:

# config 中只要配置 INJECTION_APPS 即可
INJECTION_APPS = [
    {
        # 名称标识,随便写
        "name": "测试简单的 aes 功能",
        # frida js hook 脚本的名称,需要与 arida 中 apps 的 hook 脚本名称一致
        "path": "my_aes_hook",
        # 需要 hook 目标 app 的包名
        "package_name": "com.wangtietou.test_rpc_all"
    }
]

hook js 脚本内容:

// rpc 函数 aes 加密(frida js hook aes 的脚本示例) 
function test_aes(str_data) 
{
  var str_ret = null;

  Java.perform(function () 
  {
    console.log("===========>aes");

    // 获取类
    var obj = Java.use('com.wangtietou.test_rpc_all.Test_Enc_Dec');

    // 调用类方法 因为这里是静态方法 所以可以直接调用
    var bytes_ret = obj.aes_enc(str_data);

    // 返回值是 byte[] 这里转换成 string
    str_ret = toHexString(bytes_ret);
    console.log("aes result: " + str_ret);
  });
  return str_ret;
}

// 功能函数: byte[] 转 hexString
function toHexString(arrBytes) {
    var str = "";
    for (var i = 0; i < arrBytes.length; i++) {
        var tmp;
        var num = arrBytes[i];
        if (num < 0) {
            tmp = (255 + num + 1).toString(16);
        } else {
            tmp = num.toString(16);
        }
        if (tmp.length == 1) {
            tmp = "0" + tmp;
        }
        str += tmp;
    }
    return str;
}

// 要导出 被远程调用的接口 这里要写一个配置
rpc.exports = {
  testAes: test_aes
}

hook js 的脚本名称要与 config 中的 path 值一致!

2.4.2. 启动 arida

进入 arida 安装目录,并启动 arida

1
2
3
4
# 进入对应的虚拟环境
workon arida
# 进入 arida 目录中,然后启动 arida
uvicorn main:app --reload

image-20220504163821106

2.4.3. 测试 arida 运行结果

可以看出 aridarpc 结果和 2.3. 启动被注入的 app 的图中的结果一致。

image-20220504163755547

3. 总结

  • 其实如果整体过程没有遇到坑的话,整体搭建耗时不用 2 分钟。
  • 可以尝试用 rpc 实现其它的 appso 实现,这里不再赘述,不是本文考虑的问题,可以看看我的 app 逆向专题。

评论

回到页面顶部