使用 Frida 重载函数时从列表中删除元素
remove element from list while overload function with Frida
我用 Frida 调试了一个 android 应用程序,我重载了 return java.util.List<SomeObject>
的函数
我想从 List 中删除函数为 return 的第一个元素。
请问我该怎么做?
Java.perform(function x() {
var my_class = Java.use("a.b");
my_class.c.overload().implementation = function () {
var s= this.c(); // THE FUNCTION RETURN java.util.List<SomeObject>
//HERE I WANT TO REMOVE THE FIRST ELEMENT IN S
return s;
};
});
这里是c
函数:
public List<SomeObject> c() {
return this.c;
}
首先您必须将变量 s
转换为 java.util.List
,然后您可以在其上调用方法或将其用作参数,例如创建一个新列表。
如果列表 c()
returns 可变,则以下代码有效:
let s = this.c();
let list = Java.cast(s, Java.use("java.util.List"));
list.remove(0);
return list;
如果返回的列表是不可变的,则需要创建一个新的可变数组并删除第一个元素:
let s = this.c();
let list = Java.cast(s, Java.use("java.util.List"));
let newList = Java.use("java.util.ArrayList").$new(list);
newList.remove(0);
return newList;
可变列表例如ArrayList
、LinkedList
。不可变的是例如由 List.of(...)
Arrays.asList(...)
创建,通过用 Collections.unmodifiableList()
包装列表或通常由 stream/lambda 表达式创建。
我用 Frida 调试了一个 android 应用程序,我重载了 return java.util.List<SomeObject>
我想从 List 中删除函数为 return 的第一个元素。
请问我该怎么做?
Java.perform(function x() {
var my_class = Java.use("a.b");
my_class.c.overload().implementation = function () {
var s= this.c(); // THE FUNCTION RETURN java.util.List<SomeObject>
//HERE I WANT TO REMOVE THE FIRST ELEMENT IN S
return s;
};
});
这里是c
函数:
public List<SomeObject> c() {
return this.c;
}
首先您必须将变量 s
转换为 java.util.List
,然后您可以在其上调用方法或将其用作参数,例如创建一个新列表。
如果列表 c()
returns 可变,则以下代码有效:
let s = this.c();
let list = Java.cast(s, Java.use("java.util.List"));
list.remove(0);
return list;
如果返回的列表是不可变的,则需要创建一个新的可变数组并删除第一个元素:
let s = this.c();
let list = Java.cast(s, Java.use("java.util.List"));
let newList = Java.use("java.util.ArrayList").$new(list);
newList.remove(0);
return newList;
可变列表例如ArrayList
、LinkedList
。不可变的是例如由 List.of(...)
Arrays.asList(...)
创建,通过用 Collections.unmodifiableList()
包装列表或通常由 stream/lambda 表达式创建。