Использование указателей и "Авто изменение адресов". На примере игры "Warcraft 3".
Если случается так, что ранее найденные и сохраненные адреса становятся недействительными, это значит, что игра использует динамическое распределение памяти .
Недействительные адреса - это значит, что там не то, что в игре или нет никакого значения вообще (пишется <НЕТ>).
Итак, рассмотрим природу этого явления "динамическое распределение памяти" по английски "Dynamic Memory Allocation" сокращенно DMA.
Когда игре необходима дополнительная память она использует функцию Windows для получения памяти.
Windows раздает участки памяти случайно, то есть по DMA.
Из этого следует, что перезапуск игры приводит к полной переделки всей карты памяти.
Блоки памяти меняются местами, адреса меняются.
Использование "Авто изменение адресов"
Итак, после перезапуска игры все адреса поменялись. В этих случаях вам не нужно находить заново все изменившиеся адреса.
Сначала найдите новый адрес одного из изменившихся адресов.
Затем выделите старый адрес в правой таблице и новый адрес в левой таблице и используйте команду меню "Авто изменение адресов".
Практически, программа находит разницу между старым и новым адресом. И прибавляет эту разницу ко всем адресам в таблице.
На пример, качаем с сайта ArtMoney таблицу "Warcraft 3 (hero)" от JS.
Запустите ArtMoney и потом игру "Warcraft 3".
Переключитесь из игры на ArtMoney используя Alt-Tab.
Загружаем таблицу в ArtMoney. Мы видим это:

Мда совсем не то. Ищем опыт (Experience), у меня он равен 600.
Убиваем в игре кого нибудь опыт стал 650. Отсеиваем. Получаем один адрес 021D071C.
Делаем как показано на рисунке команду "Авто изменение адресов на все". В случае разбивке по группам делаем "на группу"

Получаем в результате это

Вуаля, все работает!
Использование указателей
Адреса меняются после перезапуска игры.
Но игра должна знать, где её параметры поэтому существует ячейка в которой записан адрес этого параметра.
Эта ячейка называется указателем на адрес, фактически она его содержит.

Адрес указателя при перезагрузке игры не меняется.
То есть, если адреса в таблице привязать к указателю, то получим таблицу значения в которой всегда актуальны.
Итак, выделяем ячейку с опытом и делаем команду "Искать указатель на этот адрес".
Находим этот указатель и привязываем командой "Установить указатель на все" или "на группу".

Упс, но мы ничего не находим! Это значит что указатель не на адрес с опытом, а на структуру, начало которой мы не знаем.
Итак, опять выделяем ячейку с опытом и делаем команду "Искать указатель на начало блока памяти".

Тем самым мы найдем все указатели на диапазон адресов между началом блока и ячейкой с опытом.
Таких указателей нашлось 521 штук.
Выделяем ячейку с опытом и делаем команду "Сохранить Адрес/Указатель".
Очищаем таблицу и переносим все указатели в таблицу.
Делаем команду "Установить все указатели на сохраненный адрес".
Теперь все указатели указывают на этот адрес 021D071C

Перезапускаем игру. Делаем сортировку в таблице по значению. Ищем значение 650.
Такой адрес один. Выделяем его и делаем команду "Сохранить Адрес/Указатель".

Загружаем изначальную таблицу. Выделяем ячейку с опытом и нажимаем "Установить сохраненный указатель на все".
Вот и всё ребята! Мы имеем таблицу, адреса которой не меняются при перезагрузке игры.

Указатель 6F71C7B8 указывает на адрес 01420088
Адрес 01420088 есть адрес начала структуры описывающей нашего героя.
Адрес 01420088 плюс смещение 1684 равный 0142071C есть адрес опыта.
Тем самым мы привязались к адресу началу структуры, и имеем дело с относительными адресами.
Адрес опыта 1684 относительно начала структуры получаемого из указателя 6F71C7B8.
Полученная таблица выглядит следующим образом:
Указатель 6F71C7B8 + 1684 / Experience
Указатель 6F71C7B8 + 1688 / Points
Указатель 6F71C7B8 + 1692 / Power
Указатель 6F71C7B8 + 1712 / Dexterity
Указатель 6F71C7B8 + 1712 / Health
Указатель 6F71C7B8 + 1744 / Manna

Возможные действия с указателями:
- 1) Сохранить адрес/указатель - сохранить адрес/указатель/смещение для последующей работы
- 2) Установить указатель на все (на группу) - выделяем один указатель в найденных и один адрес в таблице, сопоставляем их,
то есть предполагается, что искали указатель на этот адрес,
остальные адреса/указатели в таблице переводятся в указатели со смещение относительно исходного адреса.
- 3) Установить сохраненный указатель на все (на группу) - тоже самое, что выше, но указатель берется из сохраненного командой "Сохранить адрес/указатель ".
Плюс дополнительно добавляется ко всем смещениям - сохраненное смещение.
- 4) Установить все указатели на этот адрес - всем указателям в таблице присваевается смещение, чтобы они указывали на этот адрес ( адрес должен быть выделен).
- 5) Установить все указатели на сохраненный адрес - тоже самое, что выше, но указатель берется из сохраненного командой "Сохранить адрес/указатель ".
Copyright (C) 1996-2002, ArtMoney Team.
Дата последнего обновления
14 декабря 2002 года