Frida + AndroidAsync 实现 RPC

Posted 奋飞安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Frida + AndroidAsync 实现 RPC相关的知识,希望对你有一定的参考价值。


一、目标

我们之前在 某段子App签名计算方法(一) 这篇教程里面使用 python的Flask库启动一个web Server 来实现App函数的RPC调用。

今天我们介绍一个新盆友,androidAsync, 用AndroidAsync来启动web Server,这样frida就直接搞定,不需要再请Python来帮忙了。

二、步骤

AndroidAsync

AndroidAsync的详细介绍大家可以自行谷歌,反正就是一个比较帅的网络库了。

它的老家在这里 https://github.com/koush/AndroidAsync

把它搞下来,然后编译成jar包再转成dex,frida可以调用了。准备工作就ok了

来个栗子

我们以昨天的 某资讯App signature签名分析 (一) 为例

先把web服务跑起来

  • 把androidAsync.dex拷贝到手机里面

adb push androidAsync.dex /data/local/tmp/
  • 在 android.app.Application.attach 的时候启动WebServer

//Java.openClassFile("/data/local/tmp/androidAsync.dex").load();

var ApplicationCls = Java.use("android.app.Application");
ApplicationCls.attach.implementation = function () {
try {
var AsyncHttpServer = Java.use("com.koushikdutta.async.http.server.AsyncHttpServer");
var androidAsync = AsyncHttpServer.$new();
androidAsync.get("/", RequestTestCallback.$new());
androidAsync.listen(8181);
console.log("reg webServer Ok");
} catch (e) {
console.error("reg webServer Error!!!, e:" + e);
}

this.attach.apply(this, arguments);
};

代码就不用解释了,牛X的代码自己会说话。

在8181端口启动了WebServer,然后注册了一个测试用的 RequestTestCallback

  • 挂上心爱的Frida,试一把

打开浏览器 http://127.0.0.1:8181 木反应?

哦,晕了,这是在手机里监听8181,不是在电脑上,所以应该是访问手机的ip, http://192.168.2.113:8181/

还是木反应?看看日志,并没有 reg webServer Ok 或者 reg webServer Error!!!

原来我们用的Frida attach 模式,可能并没有跑到 android.app.Application.attach 这个函数。

这就好办了,设置一个开关变量,直接在签名函数 signInternal 里面启动服务

var bRunServer = 0;

var SignUtilCls = Java.use("com.yxdxxx.news.util.sign.SignUtil");
SignUtilCls.signInternal.implementation = function(a,b){
if( bRunServer == 0){
bRunServer = 1;
runWebServer();
}

var rc = this.signInternal(a,b);
console.log("inStr = " + b);
console.log(">>> rc = " + rc);
return rc;
}

好了这次可以看到启动成功的提示了

[MI NOTE Pro::com.hxxx.yxdxxx]-> reg webServer Ok

主动调用 签名函数

RunServer的时候增加一个 /onenewssign 接口

// androidAsync.get("/onenewssign", OneNewsSignRequestCallback.$new());

OneNewsSignRequestCallback = Java.registerClass({
name: "OneNewsSignRequestCallback",
implements: [HttpServerRequestCallback],
methods: {
onRequest: function (request, response) {
// 主动调用代码直接写这里
var InStr = request.getQuery().getString("instr");
console.log("RPC Str = " + InStr);
var context1 = Java.use('android.app.ActivityThread').currentApplication().getApplicationContext();
console.log(context1);

var SignUtilCls = Java.use("com.yxdxxx.news.util.sign.SignUtil");
var ret = SignUtilCls.signInternal(context1,InStr);
response.send("{\"code\":0,\"message\":\"" + ret + "\"}");
}
}
});

好了直接调用, http://192.168.2.113:8181/onenewssign?instr=yxdxxx5.7.7.21k6lwwmig_1620967068422_166028401 算下和之前结果对不对。

结果并不一样,但是每次传相同的参数,结果都不一样,估计so的算法里面还是加入了随机数。不过应该这个结果是可用的。

三、总结

不知道是 AndroidAsync 不太稳定还是 Frida+AndroidAsync不太稳定,反正我崩了好几回。

凑活用吧,说不定是我手机的问题。多个方法总是好的。

android.content.Context 参数获取有两种方法,一种是用Api获取全局的 Context,还有一种就是 保存 signInternal 函数的参数。

注意:response.send 的返回值必须是 Json

1:ffshow

绝大多数时候,凑合着做完,比完美地半途而废要好。绝大多数时候,决定要做就直接开始,比自认为准备充分了再开始要好。

 手机查看不方便,可以网页看

    http://91fans.com.cn


以上是关于Frida + AndroidAsync 实现 RPC的主要内容,如果未能解决你的问题,请参考以下文章

Java基础知识强化之网络编程笔记24:Android网络通信之 AndroidAsync(基于nio的异步通信库)

如何为 AndroidAsync websockets 设置超时?

AndroidAsync websockets 不工作

带有查询字符串参数的 AndroidAsync socket.io 连接

Frida HOOK微信实现骰子作弊

安卓基于Frida HOOK传感器 实现虚拟运动跑步