totkotoriy Wrote:Что такое статические и динамические адреса? И какие надо менять?
И какие надо менять? Я как понимаю это адрес, который ты нашёл, это адрес памяти? Или чего? Должен он меняться при другом запуске игры или нет? Как написать dll честно говоря не знаю... нужен там хук или нет?
Статические адреса - это адреса, на информацию по которым выделяется память системой при самом запуске exe. Эти адреса всегда постоянны, при любом запуске по ним будет одна и та же информация (сама информация может меняться в процессе игры, но смысл её одинаков для одного и того же статического адреса). Вся информация, записанная в экзешнике хранится именно по статическим адресам (в процессе игры она может куда-то копироваться, но изначально - по статическим). Код игры также хранится по статическим адресам.
Динамические адреса - это адреса, на информацию по которым память выделяла сама игра (а потом туда что-то записывала). Где именно находится выделенная память - неизвестно, она может находиться где угодно, в разных местах во время разных запусков.
В иде можно грубо различить статические адреса как те, по которым что-то есть без запуска отладчика.
Статические адреса находятся примерно между 0x400000 и 0x800000. Остальные адреса - динамические.
Что-то менять прямо есть смысл только по статическим адресам. Нахождение динамического адреса практически ничего не даёт - при следующем запуске по тому же адресу может быть записано что-то другое.
Если ты хочешь изменить какую-то записанную в самом экзешнике информацию, то тебе нужен статический адрес. Менять надо только один раз при запуске игры - после этого она уже будет изменённая на весь запуск. Хук тут никакой не нужен, просто надо поменять информацию при запуске, например, в событии Эры OnAfterWoG или OnBeforeWoG.
Если тебе где-то в игре нужно получить или изменить информацию, записанную по динамическому адресу, нужно знать статический указатель и смещения.
Например:
*(int*)(*(int*)(0x699420) + 21708 + 1352*21*1 + 1352*3 + 52)
В статическом адресе 0x699420 во время игры записывается динамический адрес, по которому находится информация о бое.
21708 - это смещение информации о воюющих монстрах в информации о бое (т. е. информация о монстрах находится в 21708-ом байте, если считать с начала информации о битве).
1352 - количество памяти, которое занимает инофрмация об одном монстре.
21 - максимальное количество монстров у одной стороны.
1 - защищающаяся сторона.
3 - отряд монстров номер 3.
Т. е. 1352*21*1 + 1352*3 означает, что мы будем рассматривать отряд номер 3 у защищающейся стороны.
52 - смещение поля типа монстра в его информации.
Т. е. *(int*)(*(int*)(0x699420) + 21708 + 1352*21*1 + 1352*3 + 52) возвратит нам тип монстра у отряда монстров номер 3 защищающейся стороны в бою. Естественно, это можно делать только во время боя, когда у защищающейся стороны есть стек номер 3.
Но это, вроде, тебе пока не нужно, я показал для примера работы с динамическими адресами.
Теперь насчёт адресов для файла/памяти.
Всё это - только статические адреса. Более того, адреса для файла и для памяти - это одни и те же адреса в разных представлениях.
Если ты откроешь exe hex-редактором, то адреса информации там будут начинаться с 0. Это и есть адреса для файла.
Если же ты откроешь exe в дизассемблере, то адреса той же самой информации будут начинаться с 0x400000+. Это адреса для памяти.
Все адреса, найденные в дизассемблере, отладчике, artmoney - это адреса для памяти. В dll'ках и через erm правятся тоже только адреса для памяти.
Найденный мной адрес - адрес, естественно, для памяти. А вот найденный тобой в экзешнике адрес - это тот же самый адрес, но в представлении адреса для файла.
В общем, адреса для файла встречаются только если править exe hex-редактором. Во всех остальных случаях (в т. ч. и в коде самой игры) используются адреса для памяти. То, что я говорил про от 0x400000 до 0x800000 - это тоже в адресах для памяти.
Хук - это перехватчик управления. Он нужен для того, чтобы при выполнении игрой команды по определённому адресу управление передавалось плагину и он мог что-то сделать или поменять, а потом вернуть управление игре. Это что-то вроде триггера, который ты сам устанавливаешь и который срабатывает каждый раз, когда выполняется код, в котором он установлен. Нужен хук только тогда, когда ты хочешь в конкретное место вклинить выполнение своего кода.
Примеры написанных dll есть, начиная примером, входящим в поставку Эры.
Вроде на всё ответил.