Pull to refresh

Comments 6

Что вы имеете в виду под отправкой внутрь игры? В документации описано как передавать данные в скрипт, который вы внедрили. Здесь описано как искать информацию в памяти (функция Memory.scan).
Я имел в виду передачу данных внутрь JVM игры, прокинуть строку во внедренный скрипт проблемы нет.

Как раз про использование 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).
Еще тупой вопрос — а точно этот адрес принадлежит главному модулю?
Ну и если есть какой-никакой скилл в реверсе, можно попробовать найти адреса нужных функций и перехватывать их, вместо поиска строк.
Тестировал и на Utf вариантах. ArtMoney все-таки находит при выборе 1байтной кодировки, возможно из-за того, что латиница.

Среди перечисляемых адресов есть главный модуль, и туда попадает диапазон памяти, внутри которого ArtMoney нашел строку.

Насчет функций была мысль, скилла в реверсе мало, но HexRays в IDA что-то все-таки смог выдать. Возникала мысль даже прокинуть из Frida свою функцию прямо в JVM, т.к. аргументы функции RegisterNative известны, но мне не хватает опыта.
var func=new NativeFunction(ptr(«0xFFFFFF»), 'void', ['int']); //адрес функции, тип возвращаемого значения, типы аргументов
func(123);

Так можно вызывать нативные функции. Что до явовских — не в курсе, не пробовал.

Что до поиска адресов, что получится, если искать паттерн в байтах вместо строки?
Как я понял, поиск строк нужен чтобы передать данные в игру. И если решится как передавать данные, то необходимость в поиске строк отпадет сама собой.
Насчет передачи данных в игру, я бы попробовал поискать метод в jvm, которая позовляет выполнить метод (invoke), а затем с помощью него вызывать ваш java код и передавать в него необходимые данные.
Sign up to leave a comment.

Articles