![]() |
Поиск указателей. На примере игры "Warcraft 3" |
![]() |
Если случается так, что ранее найденные и сохраненные адреса становятся недействительными, это значит, что игра использует динамическое распределение памяти.
Чтобы сделать таблицу работающую всегда нужно найти указатели. В программ есть 3 метода поиска указателей, включая “Указатель на Указатель” до 5 уровня (для SE редакции поиск “Указатель на Указатель” ограничен вторым уровнем).
Адреса меняются после перезапуска игры. Но игра должна знать, где её параметры, поэтому существует ячейка, в которой записан адрес этого параметра. Эта ячейка называется
указателем на адрес, фактически она его содержит.
![]() Адрес указателя при перезагрузке игры не меняется. То есть, если адреса в таблице привязать к указателю, то получим таблицу, значения в которой всегда актуальны. Рекомендуем искать только статические указатели (с галочкой "Только статические адреса в модулях"). Статические указатели гарантировано работают на любых компьютерах! Для Windows 32-бита почти 99% указателей четные, для Windows 64-бита кратны четырем! Итак, выделяем ячейку с опытом и делаем команду "Искать указатель на этот адрес". Находим этот указатель и привязываем командой "Установить указатель на все" или "на группу". ![]() Упс, но мы ничего не находим! Это значит что указатель не на адрес с опытом, а на структуру, начало которой мы не знаем. Итак, опять выделяем ячейку с опытом и делаем команду меню "Искать Указатель с максимально возможным смещением". ![]() Тем самым мы найдем все указатели первого уровня с максимально возможным смещением. Таких указателей нашлось 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 ![]() Если вы не нашли простого указателя, то возможна структура типа "Указатель на указатель", в этом случае используйте поиск "Указатель на указатель". Сначала ищем 2 уровень, если не находим, тогда 3 уровень. Каждый следующий уровень ищется в 10 раз медленнее предыдущего. Если 2 уровень 1 минута, то 3 уровень 10 минут, а 4 уровень 100 минут при одинаковом смещении. Поэтому рекомендуется уменьшать смещение до 500-1000 байт на 4-5 уровнях. ![]()
|
![]() |