| Использование указателей и "Авто изменение адресов". На примере игры "Warcraft 3" |
|
Если случается так, что ранее найденные и сохраненные адреса становятся недействительными, это значит, что игра использует
динамическое распределение памяти. Недействительные адреса - это значит, что там не то, что в игре или нет никакого значения
вообще (пишется <НЕТ>). Итак, рассмотрим природу этого явления "динамическое распределение памяти" по-английски
"Dynamic Memory Allocation" сокращенно DMA. Когда игре необходима дополнительная память, она
использует функцию Windows для получения памяти. Windows раздает участки памяти случайно, то есть по DMA. Из этого следует,
что перезапуск игры приводит к полной переделки всей карты памяти. Блоки памяти меняются местами, адреса меняются.
Итак, после перезапуска игры все адреса поменялись. В этих случаях вам не нужно находить заново все изменившиеся адреса. Сначала найдите новый адрес одного из изменившихся адресов. Затем выделите старый адрес в правой таблице и новый адрес в левой таблице и используйте команду меню "Автоизменение адресов". Практически, программа находит разницу между старым и новым адресом и прибавляет эту разницу ко всем адресам в таблице. Например, качаем с сайта ArtMoney таблицу "Warcraft 3 (hero)" от JS. Запустите ArtMoney и потом игру "Warcraft 3". Переключитесь из игры на ArtMoney, используя Alt+Tab. Загружаем таблицу в ArtMoney. Мы видим это: ![]() Мда, совсем не то. Ищем опыт (Experience), у меня он равен 600. Убиваем в игре кого-нибудь, опыт стал 650. Отсеиваем. Получаем один адрес 1486071C. Делаем, как показано на рисунке команду "Автоизменение адресов на все". В случае разбивке по группам делаем "на группу" ![]() Получаем в результате это: ![]() Вуаля, все работает! Указатели используется в основном в играх Windows имеющих исполняемый файл, реже в эмуляторах. Адреса меняются после перезапуска игры. Но игра должна знать, где её параметры, поэтому существует ячейка, в которой записан адрес этого параметра. Эта ячейка называется указателем на адрес, фактически она его содержит. Если вы не нашли простого указателя, то возможна структура типа "Указатель на указатель", в этом случае используйте поиск "Указатель на указатель". ![]() Адрес указателя при перезагрузке игры не меняется. То есть, если адреса в таблице привязать к указателю, то получим таблицу, значения в которой всегда актуальны. Итак, выделяем ячейку с опытом и делаем команду "Искать указатель на этот адрес". Находим этот указатель и привязываем командой "Установить указатель на все" или "на группу". ![]() Упс, но мы ничего не находим! Это значит что указатель не на адрес с опытом, а на структуру, начало которой мы не знаем. Итак, опять выделяем ячейку с опытом и делаем команду "Искать указатель на начало блока памяти". ![]() Тем самым мы найдем все указатели на диапазон адресов между началом блока и ячейкой с опытом. Таких указателей нашлось 50 штук. ![]() Перезапускаем игру. Нажимаем кнопку "Отсеять" и делаем "Отсеивание указателей" на значение 650. ![]() Такой указатель один. Если указатель не один, то перезапускаем игру и опять делаем "Отсеивание указателей". И так несколько раз. Если все равно получается несколько адресов, то выбираем любой. В левой таблице выделяем указатель, в правой таблице выделяем ячейку с опытом и делаем команду "Установить указатель на все". ![]() Вот и всё! Мы имеем таблицу, адреса которой не меняются при перезагрузке игры. ![]() ![]() Указатель 6F71C7B8 указывает на адрес 01170088 Адрес 01170088 есть адрес начала структуры, описывающей нашего героя. Адрес 01170088 плюс смещение 1684, равный 0117071C, есть адрес опыта. Тем самым мы привязались к адресу началу структуры, и имеем дело с относительными адресами. Адрес опыта 1684 относительно начала структуры получаемого из указателя 6F71C7B8. Полученная таблица выглядит следующим образом: Указатель 6F71C7B8 + 1684 / Experience Указатель 6F71C7B8 + 1688 / Points Указатель 6F71C7B8 + 1692 / Power Указатель 6F71C7B8 + 1712 / Dexterity Указатель 6F71C7B8 + 1712 / Health Указатель 6F71C7B8 + 1744 / Manna
Смещение = адрес жизни (A3) - значение указателя. |