Как читать память в куче с Фридой?
Я пытаюсь прочитать память в куче, используя 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, чтобы перечислить все поля и их значения.