Frida中构造Java String[]字符串数组作为方法参数的问题
Frida 调用入参为String数组的Java方法实现
直接创建String数组(等价new String[]{"TEST"}的最简写法)
不需要绕路用ArrayList做转换,Frida内置的Java.array()API就是专门用来创建Java数组的,直接写就能得到符合要求的String[]实例:
// 对应Java代码:String[] importantArr = new String[]{"TEST"}; const importantArr = Java.array('java.lang.String', ["TEST"]); // 直接传入参数调用目标方法即可,重载匹配不会出错 // 假设你已经拿到了coolFunction所在类的实例targetInstance targetInstance.coolFunction.overload('long', '[Ljava.lang.String;').call(targetInstance, 4, importantArr);
如果需要创建其他类型的Java数组,只要替换Java.array()第一个参数的类型名即可:
- 基础类型数组:比如int数组写
Java.array('int', [1,2,3]) - 自定义类数组:比如包名为com.demo.Test的类数组写
Java.array('com.demo.Test', [testInstance1, testInstance2])
之前两种尝试方案的错误原因与修正
如果你确实需要从ArrayList转换得到String[],可以参考下面的修正写法,之前报错都是因为Frida重载匹配、参数类型不符合要求导致的。
方案1(toArray传入空数组)报错原因
你没有明确指定toArray的重载版本,Frida无法自动匹配参数类型,修正后代码:
const ArrayList = Java.use("java.util.ArrayList"); const arrList = ArrayList.$new(); arrList.add("TEST"); // 先获取String数组的类定义,创建长度为0的空数组 const StringArrayClass = Java.use("[Ljava.lang.String;"); const emptyStrArr = StringArrayClass.$new(0); // 显式指定调用参数为Object[]的toArray重载 const strArr = arrList.toArray.overload('[Ljava.lang.Object;').call(arrList, emptyStrArr);
方案2(强转Object数组)报错原因
两个问题:一是没有显式指定无参的toArray重载,二是Java.cast第二个参数需要传Java类对象,不能直接传类名字符串,修正后代码:
const ArrayList = Java.use("java.util.ArrayList"); const arrList = ArrayList.$new(); arrList.add("TEST"); // 显式调用无参toArray重载 const objArr = arrList.toArray.overload().call(arrList); // 传入String数组类对象做类型转换 const StringArrayClass = Java.use("[Ljava.lang.String;"); const strArr = Java.cast(objArr, StringArrayClass);
提示:除非业务逻辑本身需要处理ArrayList,否则创建Java数组优先用
Java.array(),写法最简洁,也不会出现重载匹配错误。
内容的提问来源于stack exchange,提问作者user19358595
相关产品推荐
相关产品推荐

