Frida + AndroidAsync 实现 RPC

简介: Frida + AndroidAsync 实现 RPC

一、目标


我们在之前的教程里面使用 python的Flask库启动一个web Server 来实现App函数的RPC调用。


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


二、步骤

AndroidAsync


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

它的老家在这里  github.com/koush/Andro…


把它搞下来,然后编译成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



19.png


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


TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号:  奋飞安全,最新技术干货实时推送



相关文章
|
5月前
|
Go
Golang简易版RPC实现
Golang简易版RPC实现
34 0
|
12月前
|
网络协议 算法
gRPC源码分析(一):gRPC的系统调用过程
- 分析PB生成的对应文件 - 运行server - 运行client
95 0
|
openCL 编译器 Linux
交叉编译和 RPC
交叉编译和 RPC
|
安全 网络协议 NoSQL
JDWP调试接口RCE
JDWP调试接口RCE
1185 0
|
XML JSON 网络协议
Python RPC | 连载 01 - RPC
Python RPC | 连载 01 - RPC
Python RPC | 连载 01 - RPC
|
API
超实用的 gRPC 客户端调试工具
超实用的 gRPC 客户端调试工具
713 0
超实用的 gRPC 客户端调试工具
|
存储 测试技术 Go
撸了一个可调试 gRPC 的 GUI 客户端
写完 gRPC 接口后是如何测试的?往往有以下几个方法:
|
开发工具 Android开发 Python
【Android 逆向】Frida 框架 ( 安装 frida 12.7.5 | 安装 frida-tools 5.1.0 | PC 端 frida 与 安卓模拟器端 frida-server )
【Android 逆向】Frida 框架 ( 安装 frida 12.7.5 | 安装 frida-tools 5.1.0 | PC 端 frida 与 安卓模拟器端 frida-server )
309 0
【Android 逆向】Frida 框架 ( 安装 frida 12.7.5 | 安装 frida-tools 5.1.0 | PC 端 frida 与 安卓模拟器端 frida-server )
|
JSON Unix Go
使用 grpcurl 通过命令行访问 gRPC 服务
使用 grpcurl 通过命令行访问 gRPC 服务
1510 0
【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 客户端开发 )
【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 客户端开发 )
198 0