frida travel

frida [java.lang.Object 构造

背景

在学习frida的过程中,遇到一个比较有趣的函数,需要对其进行hook,函数如下:

1
2
3
public static void foo(Object[] data){
......
}

其中data 可以传多个不同类型的数据,比如true,1233,string等,我需要对其进行调用

调用

由于参数是一个array,使用frida的Java.array(data,class)进行调用,但是当我传递
var array = Java.array(‘java.lang.Object’,[aClass.$new(),true,123])的时候,frida 就报错了

1
2
3
4
5
6
Error: invalid argument value
at frida/node_modules/frida-java-bridge/lib/env.js:166
at frida/node_modules/frida-java-bridge/lib/class-factory.js:106
at /test.js:36
at ye (frida/node_modules/frida-java-bridge/lib/class-factory.js:574)
at frida/node_modules/frida-java-bridge/lib/class-factory.js:557

搜了一堆资料之后,偶然发现了Integer这个类,突然想到在java中,基本类型是不继承Object类的,所以123,true
这些值是不能存在于数组中的。知道了问题的根源后,其实解决方案也很好做,只要使用继承自Object的类就行了
于是就有了如下的代码

1
2
3
var array = Java.array('java.lang.Object',[aClass.$new(),aClass.$new()])
array[1]= Java.cast(Boolean.$new(true), Objectx);
this.Check(array);

总结

frida 的大部分hook代码都用js编写,除了要了解js的语法之外,frida自带的api功能也很强大,但是自己对这块用的太少了,看到大佬们的代码,发现真的好多都没看懂


如果觉得我的文章对你有帮助,可以扫描以下微信二维码提供赞赏,您的支持是对我的认可。