我们在逆向过程中,经常碰到这样的场景。
分析某个算法的时候,算法强度很大,做了很多骚操作,让你看了反编译的代码就直接回收站处理。
面对高强度算法,这时候我们的选择一般是
-
硬钢(适合大佬和时间充足的选手)
-
firda rpc 远程调用
-
xposed rpc 远程调用
-
unicorn 模拟执行
后续陆续更新上面提到4种方法。这篇文章主要介绍frida rpc调用的简单实现
做frida rpc视频 文章初衷
某粉丝大佬后天私信我,2月就想做了 但是太懒 4月才开始做 后续大佬们想看啥视频也可以私信我 我统计一下比较多的 有时间就录
开始正文
大家好,我是王铁头 一个乙方安全公司搬砖的菜鸡
持续更新移动安全,iot安全,编译原理相关原创视频文章
视频演示:
原理图
rpc远程调用效果图
在尝试过几种frida rpc的框架后,我找到了很简单的一种实现方法,从启动环境到架设到外网直接访问调用,整个过程不要两分钟。首先看下效果图。
这里做一个演示 调用一个加密方法 输入参数 字符串111
这里也可以直接执行命令行 返回一样的结果
在真机上 输入同样的参数 返回一样的结果
注意!
注意!
注意!
在自动化测试的场景下 可以写个脚本 打到批量测试的目的
比如像下面这样 写个脚本批量去跑
这里之所以说简单,是因为使用简单,除了安装环境麻烦之外,在安装好环境后,每次使用的时候,基本不用做啥重复性操作,编写脚本,启动环境,就ojbk了
注意 这里演示环境是ubuntu 但是实测windows和ubuntu都是可以的。操作过程基本没什么区别
适用场景
frida远程调用不仅可以调用 java层的函数,也可以调用so层的函数。
但是,frida并不太稳定。frida rpc也不太稳定。有一些比较坑爹的问题。
也并不太适用于工业级,比如frida并不适用于 在一些高并发,多线程的场景。
frida rpc 的前提条件就是,手机里面正在运行要注入的app, 更适合一些测试场景,比如协助一些渗透同事做一些数据的加解密。
或者一些规模比较小的工业级调用
frida 远程调用demo
假设 我们遇到的apk是这样子的:
可以看到上面的app 有2个加密按钮 我们这次要用frida 远程调用的 也是这两个功能函数
-
AES加密
-
菜鸡加密
目标函数
上图是要远程调用的目标函数 函数声明如下
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
在这个方案里:
-
frida 实现调用具体实现
-
flask提供网页访问相关接口
-
nps内网穿透 直接把内网映射到公网,让接口可以在外网直接被访问。
这种方法可以是可以,可是比较麻烦,一套流程下来,可能20分钟往上了。
而且nps这东西想要实现内网穿透,要么你自己有服务器,要么还得搞谷歌云的服务器,费时费力。
这个方法后续会写篇文章介绍
2. 优秀青年实现frida rpc
arida + 花生壳
实现步骤:
-
编写frida js注入 脚本 (耗时95秒)
-
修改配置文件 (耗时10秒)
-
启动环境 (耗时10秒)
-
直接访问 配置好的公网地址 (耗时5秒)
这篇文章主要讲利用 arida + 花生壳 实现frida rpc
0 前提 关于arida框架 和 花生壳
arida
git地址[https://github.com/lateautumn4lin/arida]
看雪文章[[https://bbs.pediy.com/thread-262643.htm]
缺点:
-
安装比较麻烦。git文档比较感人,我按文档安装失败多次。
建议观看视频 一步步来 我老王在安装环境的时候 反反复复搞了2-3天 踩了很多坑 -
参数支持 string 和 int,事实上大部分时间也用不到别的类型。特殊类型我们直接在注入的脚本里写就好了 不影响使用。
优点:
-
使用简单 一条命令就可以自动注入 会自动搭建http相关环境
花生壳
优点:
-
使用简单。瞬间完成内网穿透
缺点:
-
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_cnt)
{
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步 启动环境
启动环境比较简单
-
启动frida_server
-
进入arida目录 启动conda 环境
执行 uvicorn main:app --reload 命令
如图所示:frida rpc远程调用启动
完成这步之后 如果不需要映射到公网的同学 到这里就可以了
直接访问 http://127.0.0.1:8000/docs
如图frida rpc内网 frida 远程调用网页访问 算法调用返回结果
第四步 访问花生壳配置的公网地址
花生壳配置比较简单
启动花生壳客户端
这时候 就可以在公网访问搭建在我们内网的 frida rpc了
bingo 大功告成
更详细的安装环境和 frida 调用 java层so层 静态方法,对象方法,so层函数的具体代码可以直接回复 rpc 进行下载。
本文始发于微信公众号(移动安全王铁头):frida rpc远程调用 内网穿透
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论