我正在尝试使用Frida编写一个函数,该函数接受一个Java对象实例作为参数,并返回一个JS对象,其中包含Java对象字段的所有值和类型,可能会以递归方式返回。
例如,如果我们有这样的东西:
public class Person {
private String fullName;
private int age;
private List hobbies,
public Person(String fullName, int age, List hobbies) {
...
}
public void hello() {
...
}
}我希望能够(在Frida JS脚本中)运行如下内容
Java.use("Person").hello.implementation = function() {
console.log(JSON.stringify(dumpObject(this, 2))); // dump recursively 2 levels deep
this.hello();
}然后看到类似这样的内容:
{
"instance":"0x1234",
"type":"Person",
"fields' [
{
"name":"fullName",
"declaredType":"java.lang.String",
"actualType":"java.lang.String",
"value":"John Smith",
},
{
"name":"age",
"declaredType":"int",
"actualType":"int",
"value":25,
},
{
"name":"hobbies",
"declaredType":"java.util.List",
"actualType":"java.util.ArrayList",
"value":{
"instance":"0x4567",
"type":"java.util.ArrayList",
"fields": [
... all the fields of this ArrayList instance, 2 levels deep
],
},
},
]
}我尝试了几种不同的方法,但我总是遇到很多错误和问题。在我深入研究之前,有没有人知道一些现有的实现可以节省我相当多的时间?我在谷歌上搜索了很多,但只能找到转储类方法和字段名的脚本,没有智能地查看值的脚本,包括需要_name访问的情况、静态成员、递归转储等……
谢谢!
发布于 2020-02-19 22:48:41
如果您已经将JSON库加载到内存中(或者您可以使用Module.load动态加载它),那么您可以调用反序列化并传递Java实例。
如果你想用Frida来做这件事,你可以使用Java类API来枚举字段和方法,下面是一个样板。
var BreakException = {};
function describeJavaClass(klass) {
var limit = 100;
Java.enumerateLoadedClassesSync().forEach(klass => {
if (--limit < 0) throw BreakException;
var instances = [];
Java.choose(klass, {
onComplete: function () {
if (instances.length != 0)
console.log(JSON.stringify(instances, null, 2));
},
onMatch: function (instance) {
var _class = instance.class;
var c = {
instance: instance,
class: klass,
methods: [],
fields: {}
};
_class.getDeclaredFields().forEach(f => {
var _field = f.toString().split('.').pop();
var val = instance[_field].value;
c.fields[f] = val ? val.toString() : val;
instances.push(c);
});
_class.getDeclaredMethods().forEach(method => {
c.methods.push(method.toString());
});
}
});
});
}
Java.perform(describeJavaClass);https://stackoverflow.com/questions/60254578
复制相似问题