Frida - функция для сброса / проверки объекта - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь написать функцию с использованием 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, члены stati c, рекурсивный дамп и т. Д. c ...

Спасибо!

1 Ответ

0 голосов
/ 19 февраля 2020

Если у вас есть библиотека JSON, загруженная в память (или вы можете загрузить ее динамически с / 1001 *), вы можете вызвать десериализацию и передать экземпляр 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);

...