使用 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;

可变列表例如ArrayListLinkedList。不可变的是例如由 List.of(...) Arrays.asList(...) 创建,通过用 Collections.unmodifiableList() 包装列表或通常由 stream/lambda 表达式创建。