Frida 将对象转换为字符串列表

4
我可以帮您翻译。以下是翻译结果:

我一直在尝试使用Frida钩取安卓应用程序时打印列表内容,但没有成功。

我想要在Java中钩取的对象如下所示:

import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.List;

public final class Hello extends HelloParent{

    @JsonIgnore
    public final List sampleList;

}

这个公共对象没有getter,所以我必须使用另一个对象(我们称之为“Bye”)的方法(byeMethodB)来监视这个值。
这是我的Frida脚本的样子:
setTimeout(function() {

    Java.perform(function(){
        
        Java.use("Bye").byeMethodA.implementation = function(){

            try{
                //Returns a Hello object
                var helloObject = Java.cast(this.byeMethodB(),Java.use("Hello"))
                printListContent(Java.cast(helloObject.sampleList,Java.use("java.util.List"))))
            }catch(err){
                console.log(err)
            }
        }

    })
},1000)

function printListContent(list){

    var listIter = list.iterator()
    while(listIter.hasNext()){
        console.log(listIter.next())
    }

}

如果不将“helloObject.sampleList”对象转换为列表,输出结果如下:

[object Object]

所以我确定它不是null

如果我使用Java.cast(helloObject.sampleList,Java.use("java.util.List"))进行转换,

我会得到以下错误:

java.util.List

我也尝试过:

Java.cast(helloObject.sampleList,Java.use("java.util.List<>"))

java.util.List<>

我非常确定它是一个字符串

Java.cast(helloObject.sampleList,Java.use("java.util.List<String>"))(我认为这是一个字符串)

java.util.List

Java.cast(helloObject.sampleList,Java.use("java.util.List<java.lang.String>"))

java.util.List<java.lang.String>

Java.cast(helloObject.sampleList,Java.use("[String"))

[LString

Java.cast(helloObject.sampleList,Java.use("[Ljava.lang.String"))

[Ljava.lang.String

进展非常不顺利。希望能得到一些帮助。


2
请不要将控制台输出作为屏幕截图发布。这只是简单的文本,请将相关部分复制粘贴到您的问题中。 - undefined
2个回答

6
在Frida中,访问字段与Java不同。如果在Frida中执行helloObject.sampleList,您将获得描述该字段的JavaScript对象,而不是字段值本身。
如果要获取字段值,您必须执行helloObject.sampleList.value
因此,以下代码应该可以工作:
Java.cast(helloObject.sampleList.value, Java.use("java.util.List"));

泛型只存在于编译时,但Frida在运行时起作用。因此,java.util.List<>和其他带有尖括号的类名永远不起作用。


现在它正常工作了!非常感谢您的指导。 - undefined

1
之前的回答很好,我遇到的一个问题是我必须在转换后的参数上调用toArray()
somehook["getUrlList"].implementation = function () {
    console.log(`UrlModel.getUrlList is called`);
    let result = this["getUrlList"]();
    var stringArray = Java.cast(result, Java.use('java.util.List')).toArray();
    for (var i = 0; i < stringArray.length; i++) {
        console.log('String[' + i + ']: ' + stringArray[i]);
    }
    return result;
};

那么直接使用.size()而不是.length来访问列表,使用.get(i)而不是[i]来访问元素,这样做不起作用吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接