Как читать память в куче с Фридой? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь прочитать память в куче, используя Frida с сервером, расположенным на Android Virtual Device (эмулируется), но все время получаю память access violation ошибка.

Сначала я ищу экземпляр интересного класса:

Java.performNow(function() {
    Java.choose("com.example.model.interestingObject", {
        onMatch: function(instance) {
            console.log(instance.toString());                   
        }, onComplete: function() {
        }
    });
});

В качестве вывода я получаю (я полагаю) адрес в памяти: com.example.model.interestingObject@d735e35

Но когда я пытаюсь прочитать с этого адреса: Memory.readByteArray(ptr("0xd735e35"), 64); тогда я получаю следующую ошибку:

Error: access violation accessing 0xd735e35
    at frida/runtime/core.js:282
    at /repl18.js:26

Вопрос в том, как я могу прочитать байты с этого адреса? Я очень свежа для Фриды, поэтому, вероятно, что-то не так. Буду рад любой помощи!

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я думаю, вам просто нужно разыграть найденный вами экземпляр @ onMatch

Java.cast(instance,Java.use("com.example.model.interestingObject")).toString()

Все остальное хорошо по документам ;

  • Java.choose(className, callbacks): перечислить живые экземпляры класса className путем сканирования кучи Java, где обратные вызовы - это объект, указывающий:

    • onMatch: функция (экземпляр): вызывается один раз для каждого живого экземпляра, найденного с готовым к использованию экземпляром, точно так же, как если бы вы вызвали Java.cast () с необработанным дескриптором этого конкретного экземпляра. Эта функция может вернуть остановку строки, чтобы досрочно отменить перечисление.

    • onComplete: function (): вызывается при перечислении всех экземпляров

Для печати учеников вы можете использовать Object.getOwnPropertyNames(obj.__proto__).join('\n\t')

0 голосов
/ 11 января 2019

Глядя на функцию Java Object.toString(), вы можете видеть, что значение d735e35 является не адресом, а хеш-кодом объекта:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Поэтому вы смотрите на неправильный адрес памяти, что приводит к access violation, который вы наблюдали.

В целом, для Java / Android вы никогда не должны пытаться получить доступ к памяти напрямую. Вместо этого используйте доступные функции Frida, чтобы перечислить все поля и их значения.

...