Comments 6
Что вы имеете в виду под отправкой внутрь игры? В документации описано как передавать данные в скрипт, который вы внедрили. Здесь описано как искать информацию в памяти (функция Memory.scan).
Я имел в виду передачу данных внутрь JVM игры, прокинуть строку во внедренный скрипт проблемы нет.
Как раз про использование Memory.scan я и говорил. Документация есть, но чего-то мне не хватает для полного осознания как пользоваться этой функцией. Например я пробовал так:
Среди модулей естественно есть и сам exe игры. Если заставить её сканировать всю область памяти процесса поиск останавливается и выводит ошибку доступа к защищенному сегменту памяти.
Поиск такой-же строки через ArtMoney вполне её находит и позволяет менять.
З.Ы. Вчера также подсказали, что использовать String не самая лучшая идея — сборщик мусора может перенести её в другую область памяти, хотя у меня такого не случалось.
Как раз про использование Memory.scan я и говорил. Документация есть, но чего-то мне не хватает для полного осознания как пользоваться этой функцией. Например я пробовал так:
//Создаем строку в памяти и делаем паттерн для поиска
var p = Memory.allocAnsiString("DEMO");
var pattern = p.toMatchPattern();
var modules = Process.enumerateModulesSync();
//Проходимся по блокам памяти каждого модуля
for(var a in modules){
//сканируем память модуля на соответствие паттерну
Memory.scan(modules[a].base, modules[a].size, pattern, {
onMatch: function (address, size) {
console.log("something found"); //Ура, нашли, выводим
console.log(address);
},
onComplete: function () {
console.log("Memory scan complete");
},
onError: function (reason) {
console.log(reason); //что-то пошло не так
}
});
}
Среди модулей естественно есть и сам exe игры. Если заставить её сканировать всю область памяти процесса поиск останавливается и выводит ошибку доступа к защищенному сегменту памяти.
Поиск такой-же строки через ArtMoney вполне её находит и позволяет менять.
З.Ы. Вчера также подсказали, что использовать String не самая лучшая идея — сборщик мусора может перенести её в другую область памяти, хотя у меня такого не случалось.
Из первого, что приходит в голову — а там точно ANSI, а не UTF?
У фриды на выбор есть Memory.allocUtf8String(str), Memory.allocUtf16String(str), Memory.allocAnsiString(str), может, стоит попробовать 1 из них?
Еще можно попробовать для проверки найти набор байт(взять из того же artmoney/cheatengine).
Еще тупой вопрос — а точно этот адрес принадлежит главному модулю?
Ну и если есть какой-никакой скилл в реверсе, можно попробовать найти адреса нужных функций и перехватывать их, вместо поиска строк.
У фриды на выбор есть Memory.allocUtf8String(str), Memory.allocUtf16String(str), Memory.allocAnsiString(str), может, стоит попробовать 1 из них?
Еще можно попробовать для проверки найти набор байт(взять из того же artmoney/cheatengine).
Еще тупой вопрос — а точно этот адрес принадлежит главному модулю?
Ну и если есть какой-никакой скилл в реверсе, можно попробовать найти адреса нужных функций и перехватывать их, вместо поиска строк.
Тестировал и на Utf вариантах. ArtMoney все-таки находит при выборе 1байтной кодировки, возможно из-за того, что латиница.
Среди перечисляемых адресов есть главный модуль, и туда попадает диапазон памяти, внутри которого ArtMoney нашел строку.
Насчет функций была мысль, скилла в реверсе мало, но HexRays в IDA что-то все-таки смог выдать. Возникала мысль даже прокинуть из Frida свою функцию прямо в JVM, т.к. аргументы функции RegisterNative известны, но мне не хватает опыта.
Среди перечисляемых адресов есть главный модуль, и туда попадает диапазон памяти, внутри которого ArtMoney нашел строку.
Насчет функций была мысль, скилла в реверсе мало, но HexRays в IDA что-то все-таки смог выдать. Возникала мысль даже прокинуть из Frida свою функцию прямо в JVM, т.к. аргументы функции RegisterNative известны, но мне не хватает опыта.
var func=new NativeFunction(ptr(«0xFFFFFF»), 'void', ['int']); //адрес функции, тип возвращаемого значения, типы аргументов
func(123);
Так можно вызывать нативные функции. Что до явовских — не в курсе, не пробовал.
Что до поиска адресов, что получится, если искать паттерн в байтах вместо строки?
func(123);
Так можно вызывать нативные функции. Что до явовских — не в курсе, не пробовал.
Что до поиска адресов, что получится, если искать паттерн в байтах вместо строки?
Как я понял, поиск строк нужен чтобы передать данные в игру. И если решится как передавать данные, то необходимость в поиске строк отпадет сама собой.
Насчет передачи данных в игру, я бы попробовал поискать метод в jvm, которая позовляет выполнить метод (invoke), а затем с помощью него вызывать ваш java код и передавать в него необходимые данные.
Насчет передачи данных в игру, я бы попробовал поискать метод в jvm, которая позовляет выполнить метод (invoke), а затем с помощью него вызывать ваш java код и передавать в него необходимые данные.
Sign up to leave a comment.
Добавляем в игру мультиплеер с помощью Node.JS и Frida. Часть 1