首页
社区
课程
招聘
[求助]frida-rpc怎么调用名字相同的方法
发表于: 2020-3-16 23:42 8690

[求助]frida-rpc怎么调用名字相同的方法

2020-3-16 23:42
8690

刚接触frida,今天看到了frida可以远程调用算法,遇到一个问题,还望大佬们指点一下。
需要调用的这个类中的函数名字都一样。
图片描述
我需要调用的是第三个

com.xxx.lib.http.MakeUrlClient.b(android.content.Context,java.lang.String,java.lang.String[],java.lang.String[],java.lang.String[],java.lang.String[],int,int)

我的js是这样写的

rpc.exports = {
        sign:function(path,key1,value1,key2,value2){
            var result;
            Java.perform(function(){
                var Makeurl = Java.use("com.xxx.lib.http.MakeUrlClient");
                var context = Java.use('android.app.ActivityThread').currentApplication().getApplicationContext();
                console.log(context);
                console.log(Makeurl);
                result=Makeurl.b(context,path,key1,value1,key2,value2,0,1);
                return result;
            });
        }
    }

可是result一直是None,想知道是我调用的方法有问题吗?应该怎么写?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-3-16 23:44 被nws0507编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
  
最后于 2020-3-17 01:13 被endlif编辑 ,原因:
2020-3-17 01:12
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
不知道
2020-3-17 04:05
0
雪    币: 506
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4

return写在Java.perform的回调里了 所以函数sign没有返回值, 要改的话是这样:

sign: function(path,key1,value1,key2,value2) {
    var result = undefined;
    Java.perform(function() {
        var Makeurl = Java.use("com.xxx.lib.http.MakeUrlClient");
        var context = Java.use('android.app.ActivityThread').currentApplication().getApplicationContext();
        console.log(context);
        console.log(Makeurl);
        result = Makeurl.b(context,path,key1,value1,key2,value2,0,1);
    });
    while(result === undefined);
    return result;
}

不过推荐使用Promise:

sign: function(path,key1,value1,key2,value2) {
    return new Promise(resolve => {
        Java.perform(() => {
            var Makeurl = Java.use("com.xxx.lib.http.MakeUrlClient");
            var context = Java.use('android.app.ActivityThread').currentApplication().getApplicationContext();
            console.log(context);
            console.log(Makeurl);
            result = Makeurl.b(context,path,key1,value1,key2,value2,0,1);
            resolve(result);
        });
    })
}

外部使用await sign(...) 或 sign(...).then(...)
要使用await, 箭头函数等语法的话需要使用frida-compile, 或者配置frida使用v8引擎.

2020-3-17 06:01
0
雪    币: 2559
活跃值: (509)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
fatykrch return写在Java.perform的回调里了 所以函数sign没有返回值, 要改的话是这样: sign: function(path,key1,value1,key2,value2 ...
谢谢大佬 我用的python调用,试了你的第一种方法,但是result一直是undefined,是因为Makeurl.b这个方法没有调用成功吗,我一直纠结是不是调用方式错了,没遇见过这种相同名字的方法调用
2020-3-17 12:32
0
雪    币: 506
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
6

frida本身应该可以自动判断, 转换参数并调用对应函数的, 实在想指定哪个同名函数可以试试函数.overload(参数类型)(参数), 在这里应该是Makeurl.b.overload('android.content.Context','java.lang.String','java.lang.String[]','java.lang.String[]','java.lang.String[]','java.lang.String[]','int','int')(context,path,key1,value1,key2,value2,0,1)

 

如果像下面这样写 不会输出undefined或者什么错误信息的话可能还是我的方法写错了, 你再试试用别的方式把result传出去, 比如send之类的

try {
    result = Makeurl.b(context,path,key1,value1,key2,value2,0,1);
    console.log(result);
}
catch(e) {
    console.log(e.stack);
}
最后于 2020-3-17 16:36 被fatykrch编辑 ,原因:
2020-3-17 16:11
0
雪    币: 506
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
7
也有可能因为key1,value1,key2,value2都是`java.lang.String[]`类型的, 传给Makeurl.b之前需要用Java.array转换一下.
2020-3-17 16:42
0
雪    币: 2559
活跃值: (509)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8

很感谢大佬,我打印了下错误,最开始报错Error: b: cannot call instance method without an instance
后来我指定了一下Makeurl.b.overload('android.content.Context', 'java.lang.String', '[Ljava.lang.String;', '[Ljava.lang.String;', '[Ljava.lang.String;', '[Ljava.lang.String;', 'int', 'int')(context,path,key1,value1,key2,value2,0,1)
结果报这个错误TypeError: cannot read property '$handle' of undefined
用楼下大佬说的Java.choose解决了

最后于 2020-3-17 20:55 被nws0507编辑 ,原因:
2020-3-17 20:17
0
雪    币: 53
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
Makeurl.b不是静态方法,需要有对象才能调用,先用Java.choose找个对象吧(
或者看看构造函数$new一个
或者从其它用到Makeurl的地方下hook偷一个(
2020-3-17 20:31
0
雪    币: 2559
活跃值: (509)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
okeNer Makeurl.b不是静态方法,需要有对象才能调用,先用Java.choose找个对象吧( 或者看看构造函数$new一个 或者从其它用到Makeurl的地方下hook偷一个(
谢谢老哥指点了,用Java.choose解决了
2020-3-17 20:54
0
雪    币: 233
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
nws0507 谢谢老哥指点了,用Java.choose解决了
博主,java choose怎么使用啊
2020-8-5 13:37
0
雪    币: 2559
活跃值: (509)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
你可以看看文档 我也是一知半解  
2020-8-6 00:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13

您好,我也遇到你的这个问题。需要远程调用的函数有多个重载,但是我不知道怎么弄这个重载。不管重载直接远程调用这个函数成功了,但是函数的返回值不正确。想请教一下你的这个具体是怎么弄,能不能把成功的代码发出来参考一下。

我的是这样的

var val = null

rpc.exports = {
    myfunc: function(x){
        Java.perform(function () {
            console.log("脚本加载");
            console.log("original arg:" + x );
            
            var p = Java.use("c.c.l");   //找到一个类的对象
            console.log("找到一个p实例"+ p);
        
            val = p.a(x).toString();    
            //这个函数a 有多个重载。我想调用的是这个: public static String a(String arg5) { };
            //由于是静态函数,在这里直接用类来调用这个函数,但是获取的返回值是错误的。
            //我想问一下如果要写重载,这个重载应该怎么写
            console.log("return val:" + val);           
        });
        return val;
    }
}


2020-8-25 14:54
0
雪    币: 81
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
八月新风 您好,我也遇到你的这个问题。需要远程调用的函数有多个重载,但是我不知道怎么弄这个重载。不管重载直接远程调用这个函数成功了,但是函数的返回值不正确。想请教一下你的这个具体是怎么弄,能不能把成功的代码发出 ...
看看你的参数类型正确不,重载就是看参数类型,string 参数,你传进去一个int就会出错。
2020-8-25 16:13
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
Kris777 看看你的参数类型正确不,重载就是看参数类型,string 参数,你传进去一个int就会出错。

您好,我传入的参数是string类型的,我并没有处理重载,好像frida会自动根据参数类型匹配函数,然后调用。

我在js脚本中查看我传入的参数是一个string类型的,说明我的参数并没有错。

但是我hook了需要调用的函数,发现在函数里面这个参数不是我传入的字符串。

可以看到,在正常调用a 函数的时候,函数的参数是一个字符串 “S_P@[”,正常的返回值为 “alarm”

但是通过rpc调用的时候,却不是字符串了 而是一个string的类,导致函数输出失败,函数的输出和输入一致,还是 “S_P@[”。

大致就是这么个问题


2020-8-26 10:22
0
游客
登录 | 注册 方可回帖
返回
//