【问题标题】:Frida - Function to dump/inspect objectFrida - 转储/检查对象的功能
【发布时间】:2020-02-17 00:29:05
【问题描述】:

我正在尝试使用 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
        ],
     },
    },
  ]
}

我尝试了几种不同的方法,但我一直遇到很多错误和问题。在我深入挖掘之前,是否有人知道一些现有的实现可以为我节省很多时间?我在 Google 上进行了广泛搜索,但只能找到转储类方法和字段名称的脚本,没有可以智能查看值的脚本,包括需要 _name 访问、静态成员、递归转储等的极端情况……

谢谢!

【问题讨论】:

  • 任意对象的Json序列化并不是一件容易的事。您可以使用 Frida 自己实现它,但我的建议是利用对象所在的 Java 环境:使用类加载器加载包含 Json 序列化代码的 Jackson 或 GS​​ON 库并使用这些类. (注意:要加载 Android 的 jar 文件,您必须将它们转换为 dex)。

标签: javascript java android frida


【解决方案1】:

如果您在内存中加载了 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2022-09-26
    • 2019-07-27
    相关资源
    最近更新 更多