0
点赞
收藏
分享

微信扫一扫

frida rpc远程调用

在觉 2021-09-30 阅读 189

我们在逆向过程中,经常碰到这样的场景。
分析某个算法的时候,算法强度很大,做了很多骚操作,让你看了反编译的代码就直接回收站处理。
面对高强度算法,这时候我们的选择一般是

  1. 硬钢(适合大佬和时间充足的选手)
  2. firda rpc 远程调用
  3. xposed rpc 远程调用
  4. unicorn 模拟执行

后续陆续更新上面提到4种方法。
这篇文章主要介绍frida rpc调用的简单实现

做frida rpc视频 文章初衷


某粉丝大佬后天私信我,2月就想做了 但是太懒 4月才开始做 后续大佬们想看啥视频也可以私信我 我统计一下比较多的 有时间就录

开始正文

大家好,我是王铁头 一个乙方安全公司搬砖的菜鸡
持续更新移动安全,iot安全,编译原理相关原创视频文章

更多frida rpc调用

  1. rpc 调用java类方法 (静态java方法)
  2. rpc 调用native类方法 (静态native方法)
  3. rpc 调用实例方法(对象的java方法和 对象的native方法)
  4. rpc 调用so层函数

视频演示: https://space.bilibili.com/430241559

原理图

rpc远程调用效果图

在尝试过几种frida rpc的框架后,我找到了很简单的一种实现方法,从启动环境到架设到外网直接访问调用,整个过程不要两分钟。首先看下效果图。



这里做一个演示 调用一个加密方法 输入参数 字符串111



这里也可以直接执行命令行 返回一样的结果

在真机上 输入同样的参数 返回一样的结果



注意!
注意!
注意!
在自动化测试的场景下 可以写个脚本 打到批量测试的目的
比如像下面这样 写个脚本批量去跑


这里之所以说简单,是因为使用简单,除了安装环境麻烦之外,在安装好环境后,每次使用的时候,基本不用做啥重复性操作,编写脚本,启动环境,就ojbk了

注意 这里演示环境是ubuntu 但是实测windows和ubuntu都是可以的。操作过程基本没什么区别

适用场景

frida远程调用不仅可以调用 java层的函数,也可以调用so层的函数。
但是,frida并不太稳定。frida rpc也不太稳定。有一些比较坑爹的问题。
也并不太适用于工业级,比如frida并不适用于 在一些高并发,多线程的场景。

frida rpc 的前提条件就是,手机里面正在运行要注入的app, 更适合一些测试场景,比如协助一些渗透同事做一些数据的加解密。
或者一些规模比较小的工业级调用

frida 远程调用demo

假设 我们遇到的apk是这样子的:


可以看到上面的app 有2个加密按钮 我们这次要用frida 远程调用的 也是这两个功能函数

  1. AES加密
  2. 菜鸡加密

目标函数

上图是要远程调用的目标函数 函数声明如下

public static byte[] aes_dec(String str_dec)
public String caiji_enc(String str_data, int n_conunt) 

frida 远程调用实现

frida rpc 远程调用算法是我们经常用的一种算法调用的手段,也有现成的一些解决方案,甚至有人已经写出了专门的框架来节省我们的时间,让我们不至于手动去每次搭建环境都费时费力。

1. 普通青年实现frida rpc

frida + flask + nps
在这个方案里:

  1. frida 实现调用具体实现
  2. flask提供网页访问相关接口
  3. nps内网穿透 直接把内网映射到公网,让接口可以在外网直接被访问。

这种方法可以是可以,可是比较麻烦,一套流程下来,可能20分钟往上了。
而且nps这东西想要实现内网穿透,要么你自己有服务器,要么还得搞谷歌云的服务器,费时费力。
这个方法后续会写篇文章介绍

2. 优秀青年实现frida rpc

arida + 花生壳
实现步骤:

  1. 编写frida js注入 脚本 (耗时95秒)
  2. 修改配置文件 (耗时10秒)
  3. 启动环境 (耗时10秒)
  4. 直接访问 配置好的公网地址 (耗时5秒)
    这篇文章主要讲利用 arida + 花生壳 实现frida rpc

0 前提 关于arida框架 和 花生壳

arida

git地址[https://github.com/lateautumn4lin/arida]
看雪文章[[https://bbs.pediy.com/thread-262643.htm]
缺点:

  1. 安装比较麻烦。git文档比较感人,我按文档安装失败多次。
    建议观看视频 一步步来 我老王在安装环境的时候 反反复复搞了2-3天 踩了很多坑
    视频演示:https://space.bilibili.com/430241559

  2. 参数支持 string 和 int,事实上大部分时间也用不到别的类型。特殊类型我们直接在注入的脚本里写就好了 不影响使用。

优点:

  1. 使用简单 一条命令就可以自动注入 会自动搭建http相关环境

花生壳

优点:

  1. 使用简单。瞬间完成内网穿透

缺点:

  1. http访问需要交6块大洋(巨款)的认证费。

第一步 frida rpc 编写js注入脚本

要注入的方法如下

public static byte[] aes_dec(String str_dec)
public String caiji_enc(String str_data, int n_conunt) 

注入代码如下:

//rpc函数  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;
}

//rpc函数 菜鸡加密 arida支持int参数 但是要配置
function test_caiji(str_data, str_ret) 
{
  var str_ret = null;
    
  Java.perform(function () 
  { 
        console.log("===========>caiji");
        //获取内存中已有对象 主动调用
        Java.choose("com.wangtietou.test_rpc_all.Test_Enc_Dec", 
        {
          //匹配到对象执行的回调函数
          onMatch: function (instance) 
          {
            var n_cnt = parseInt(str_cnt);
            str_ret = instance.caiji_enc(str_data, n_cnt);
          },
          //搜索完成后执行的回调函数
          onComplete: function () 
          {
          }
        });

    console.log("caiji 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, 
  testCaiji: test_caiji
}  

这里 把写好的文件 命名为wtt.js

第2步 frida rpc 修改配置文件

arida代码目录下有个config.py 如图所示


修改配置信息:



这里修改下配置文件 可以同时注入多个app
这里要注入几个app就写几个配置信息

#INJECTION_APPS 这里面只写要启动的app 其他建议注释掉
INJECTION_APPS = [
    {
        "name": "移动安全王铁头",  
        "path": "wtt",
        "package_name": "com.wangtietou.test_rpc_all"
    }
]

修改好之后,把之前写好的注入脚本文件放到 apps目录就可以了



第3步 启动环境

启动环境比较简单

  1. 启动frida_server
  2. 进入arida目录 启动conda 环境
    执行 uvicorn main:app --reload 命令
    如图所示:



    完成这步之后 如果不需要映射到公网的同学 到这里就可以了
    直接访问 http://127.0.0.1:8000/docs
    如图




第四步 访问花生壳配置的公网地址

花生壳配置比较简单





启动花生壳客户端


这时候 就可以在公网访问搭建在我们内网的 frida rpc了




bingo 大功告成
更详细的安装环境和 frida 调用 java层so层 静态方法,对象方法,so层函数的具体步骤可以看视频。
视频演示:https://space.bilibili.com/430241559
持续更新移动安全,iot安全,编译原理相关原创视频文章

举报

相关推荐

0 条评论