Как читать память в куче с Фридой?

Я пытаюсь прочитать память в куче, используя 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 ответа

Решение

Я думаю, вам просто нужно разыграть найденный вами экземпляр. 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')

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

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

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

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

Другие вопросы по тегам