Ситуация на PWI и сервере Morai в частности (02.08.2015)

Всем привет.

4 августа (когда в Москве уже будет среда) свершится то, о чем так долго просили игроки с умирающих американских серверов — объединение серверов. Причем объединение не одиночное, а коснется абсолютно всего сообщества PWI.

Что вообще движет компанию на такой радикальный шаг? Игроки давно ныли об объединении в связи с упадком популярности, но никаких мер не предпринималось. Админы ссылались на невозможность объединения баз данных двух серверов. Отсюда логично предположить, что увеличивающееся количество межсерверных эвентов и послужило основной причиной. ПВИ и без того был лишен межсерверных битв династий (НВ), а тут еще в Китае в очередном крупном обновлении был добавлен новый межсерверный эвент среди гильдий.

Оставлять все «как есть» становится сложнее. Разница между версиями продолжает увеличиваться и лишать игроков ПВИ всей прелести межсерверных баталий — было бы верхом цинизма. Решено было объединять (вопрос объединения баз данных быстро отпал).

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

Прежде всего следует отметить, что сервера PWI различаются по двум принципам:
1. Часовой пояс
2. Статус: ПВЕ или ПВП

Часовой пояс делится на три зоны: Западное побережье (США), Восточное побережье (США) и Центрально-европейское время.
Только 2 сервера из 8 имеют статус ПВП (как на руоффе, когда перс белеет после достижения 30 уровня с невозможностью стать вновь синим). Остальные — ПВЕ.

И тут понимаешь: ПВИ попали в очень сложную ситуацию. Нужно не просто что-то делать со статусом, но и как-то совместить серверы из разных часовых поясов.

Глянем на статус серверов и их часовой пояс:

Западное побережье (США): Archosaur (PVE), Lost City (PVP), Sanctuary (PVE), Heavens Tear (PVE).
Восточное побережье (США): Harshlands (PVP), Raging Tide (PVE), Dreamweaver (PVE).
Центрально-европейское время: Morai (PVE)

В часовом поясе западного побережья 4 сервера. Не мудрствуя лукаво, ПВИ решили сделали так:
Heavens Tear и Archosaur объединяются в новые сервер Etherblade.
Sanctuary и Lost City объединяются в новые сервер Twilight Temple.
Оба сервера остались в прежнем часовом поясе.

И все бы ничего, но все новые сервера будут в одном статуса — PVE. PVP-статус упраздняется! Шок для Lost City. Рандом ПК больше нет. Кос-лист можно отменять. Не хочешь ПК — становись синим и делай ежи спокойно, афкай, ботоводь где хочешь. Вся игровая культура, весь прежний уклад меняется. Эвент с повозками полностью теряет свой шарм. Это те самые всхлипы горе-игроков ПК-сервера.

А что же остальные сервера? А тут самое интересное!

ПВИ объединяет Raging Tide и Dreamweaver в новый сервер Tideswell. Tideswell для всех, кто живет по времени восточного побережья.

Остаются два сервера: европейский ПВЕ Morai и «восточный» ПК-сервер Harshlands. Тут то и вступает «из двух зол меньшее» — Harshlands отправляют в европейский часовой пояс на новый сервер: Dawnglory. Сказать, что для игроков Harshlands это стало потрясением — ничего не сказать. Мало того, что новый статус — ПВЕ, так и разница с Европой у них — 6 часов.

Для примера: ТВ, начинающееся в 20:00, у них будет в 2 часа дня. А ТВ в 14:00 — будет в 8 утра. С ТВ ничего слишком страшного, но что касается остальных эвентов — все в это время будут в школе и на работе.

Двойной удар, который вынудит многих просто бросить игру либо же начать заново на новом Tideswell.

Чего не скажешь о европейцах, играющих на Harshlands с момента, когда европейского сервера еще не существовало. Ребята начнут нормально играть, а не по времени, когда вечерние эвенты начинались в 2 часа ночи.

Звучало предложение объединить PVP Harshlands и PVP Lost City. Два ПК сервера, в один — сказка. Harshlands даже смирились бы с небольшой сменой часового пояса. Но. Остался бы «лишний» сервер на западном побережье и объединение с Мораем выглядело бы еще более кошмарно в виду еще большей разницы во времени.

Можно с Мораем не объединять, но куда девать Harshlands? Пихать 3 сервера в 1? Это будет нЕчто. Оставлять же нельзя, так как если брать в расчет межсерверные битвы династий — число серверов должно быть кратным 4-м. 5-ый сервер в таком случае будет просто выпадать.

Но и это еще не все. К совпадающим именам будут добавлять префиксы. К совпадающим с Мораем именам. Так что многие с Harshlands распрощаются и со своими привычными именами. Беда не приходит одна. Крепитесь.

Что нам ПВИ еще готовит?

Не нужно быть семи пядей во лбу — обнуление карты. И обнуление это они собираются делать раз в три месяца. Топы, начавшие в разных концах карты, рискуют и не встретиться. Самые догадливые уже протестуют против такого решения (раньше было раз в полгода), до остальных же дойдет при следующем вайпе. Думаю решение оставить 6 месяцев всё-таки продавят, иначе тв превратят в «фан» против мобов и нубокланов.

Подводя итог скажу, что много позитивного от объединения не жду (играю на Морае). Да, количество народу прибавится, но играть они будут в заметно другое время. Многие с Harshlands уйдут, тамошние европейцы расплывутся по европейским же гильдиям. Таким образом, часть кланов Harshlands канут в небытие, что приведет к сосредоточению тамошней группы северо-американцев в пару-тройку крупных кланов.

Еще не стерлись воспоминания, как после объединения Momaganon и Lothranis, почти все кланы Lothranis подверглись разрушительному воздействию и плавно перетекли в кланы немецкого сервера. Даже основная конста Кризиса была в Реквием. Уверен, тоже самое произошло бы и сейчас: Морай всё бы переварил, но текучку остановит часовой пояс.

Почему зависает / не ищет Cheat Engine?

Всем привет.

Однажды может случиться такая ситуация, что Cheat Engine при поиске какого-то распространенного значения в памяти просто зависает во время процесса этого самого поиска.

Freezed Cheat Engine
Ползунок прогресса поиска останавливается и больше не двигается.
Можно попасть в легкий ступор, ведь «еще вчера все работало».
Причина возникающего затыка, на самом деле, до безобразия проста:
Freeze reason
Да, это нехватка свободного места на диске, на котором расположена папка хранения временных файлов — Temp. В данном случае, это диск L:.

Узнать, куда у вас Windows скидывает временные файлы вы можете здесь (Windows 7): Панель управления -> Система -> Дополнительные параметры системы -> Загрузка и восстановление — Переменные среды. Переменная Temp и Tmp.
Temp Folder

Cheat Engine при поиске значений в памяти процесса скидывает найденное во временную папку.

Cheat Engine Temp folder

Оставляйте с запасом свободное пространство диска с папкой для временных файлов, и вас минует данная проблема.

Как найти смещение ID цели в таргете

Сегодня мы поговорим о том, как найти смещение ID цели в таргете. Выделив себя, соответственно, узнаем и свой ID.

Для начала определимся, что это вообще такое?

ID — это уникальный идентификатор (номер) персонажа, моба, нпс в игре. Многие функции в качестве аргумента принимают ID. ID того, кого вы хотите бафнуть/атаковать, ID того, кого хотите взять на руки. Даже самое простое: чтобы выделить кого-то — вам надо знать его идентификатор. Примеров можно привести множество. В конце концов, ID пригодится нам в будущих поисках.

Таким образом мы теперь знаем, что это значение, которое указывает на конкретный объект. Его-то и научимся находить.

Запускаем PW, логинимся на персонажа.

Запускаем Cheat Engine, выбираем процесс с игрой (elementclient.exe), жмём Open
Open pwi client via cheatengine

А дальше в поиске нам надо оттолкнуться от какого-то известного значения ID. «Но мы же не знаем ни одного» — скажете вы. Ну как же? Если в таргете никто не выделен, значит TargetID = … 0! Нулю, конечно. Но мы ноль искать не будем, т.к. таких значений — целое море. Мы выделим кого-нибудь. Сейчас мы знаем, что TargetID больше 0. Такое условие для поиска и задаем в Cheat Engine.

Ищем значения, которые больше нуля (scan type: Bigger than)
Search bigger than 0

Получили 105 миллионов значений. Начинаем отсеивать. Снимаем выделение, чтобы в таргете ничего не было.

Меняем Scan type с Bigger than на Exact Value и жмем Next Scan
Next 0

212 тысяч. Очень неплохо. Опять берем кого-нибудь в таргет.

Меняем Scan type с Exact Value на Bigger than и жмем Next Scan
Bigger than 0

В два раза уменьшили общее количество найденных результатов. Вы знаете что делать: вновь сбрасываем таргет.

Меняем Scan type с Bigger than на Exact Value и жмем Next Scan
Search 0

Количество уменьшилось. Но убывает уже не так быстро как хотелось бы. И тут есть маленький хинт: выделим не какого-нибудь перса, а НПС! Это существенно сократит результат поиска. Продолжаем выполнять нехитрое чередование: Выделить кого-нибудь — Bigger than — Next Scan, после чего снять выделение — Exact Value — Next Scan, выполняя отсеивание. В общей сложности после около десятка чередований (не забудьте выделять как персов, так и нпс), мы получим примерно такой результат:

Почти добрались до дна
Short result

Посмотрите. Сейчас у нас в таргете никого нет. TargetID, соответственно, равен нулю. Но и все найденные значения равны нулю. Где из них нужный — в данном случае непонятно.

Выделяем кого-нибудь, меняем Scan type с Exact Value на Bigger than и жмем Next Scan
Final result

Если у вас чуть больше значений — ничего страшного. Итак, теперь у нас есть два варианта.

1. Посмотрим внимательно на скриншот выше. Самый нижний результат отбрасываем. Выделенный персонаж не имеет ID равный 1. Смотрим на остальные результаты — некоторые из них меняют свое значение прямо в данный момент! Но мы же не меняем свой таргет сейчас. Значит все изменяющиеся результаты — мусор для нас. Останутся пару-тройку значений. Выделите нпс. Потом перса. Потом снова нпс. Там, где значение при выделении нпс будет принимать значение намного больше (на несколько порядков!), чем при выделении персонажа — наше искомое значение. На скрине выше оно подчеркнуто. В данном случае был выделен персонаж с ID = 6248640 или 0x5F58C0 в шестнадцатеричном формате. Для сравнения, нпс будет иметь ID вида = 0x80104B82. Не шестизначный, как ID перса!

2. Актуально для PWI. Берем ярлык нашего ПВ. Заходим с свойства ярлыка. В поле «Объект» дописываем строчку game:cpw console:1, чтобы получилось строка вида: «D:\Perfect World Entertainment\Perfect World International\element\elementclient.exe» startbypatcher game:cpw console:1
Данная строка активирует консоль. Заходим в игру с помощью нашего ярлыка. Активируем консоль сочетанием клавиш Shift+~ (Шифт + тильда). В появившемся окне вводим команду d_rtdebug 1. Данная команда в меню чата желтым показываем нам кого мы выделили в десятичном и шестнадцатеричном формате.

Выделяем кого-нибудь, смотрим высветившийся желтым ID и ищем десятичное число (в скобках) в значениях из списка, который мы отсеяли в Cheat Engine. Нашли? Это наш TargetID. Двойным кликом перемещаем его в область работы (нижнее окно программы).

Найдем смещение нашего TargetID.

Жмем правой кнопкой по адресу в рабочем окне.

Выбираем пункт Find out what accesses this address
What access this address

На запрос присоединения дебаггера отвечаем Yes.
Получаем список инструкций, которых объединяет одно — одинаковое смещение.

Общее смещение
Common offset

Как вы уже догадались — это смещение к TargetID. Далее, если подумать, по логике вещей оно должно находиться в структуре персонажа. Проверить вы это можете сами, покопавшись глубже. Точно так же, как мы это делали с поиском базового адреса через опыт персонажа.

Таком образом, цепочка оффсетов до TargetID будет такая: BaseAddress + 1C + 28 + 59C (Базовый адрес + структура игры + структура персонажа + TargetID).

Обновления в PW. Большие и маленькие

Всем привет.
Хотелось бы черкнуть пару строк об обновлениях в ПВ. Как вы понимаете, само по себе обновление подразумевает замену каких-либо файлов игры. Но не все из них нас интересуют. Давайте определимся какие же именно.
Классифицируем обновления на три категории:

1. Мелкие. Обычно в них локализатор изменяет ассортимент шопа, цены в нем, а так же исправляет ошибки в локализации игры (неверное описание, перевод оставшегося оригинального текста) и тд. Оффсеты и адреса при таких обновлениях не изменяются. Поэтому они нам неинтересны.

2. Средние. Такие обновления уже затрагивают elementclient.exe. Базовый адрес точно меняется. Однако это нельзя сказать с уверенностью про смещения. Большинство из них могут остаться прежними (как это было в недавнем обновлении на PWI). Однако такое случается не часто.

3. Крупные. Это обновления, связанные с вводом нового аддона для игры. Мало того, что меняются адреса и оффсеты (смещения), но даже можно встретить и изменение в функциях инжекта (пользовательские функции, имитирующие внутриигровые).

Что же делать когда вышло обновление и смещения «уплыли»? Нет необходимости искать их с нуля! Зачастую оффсеты просто сдвигаются вперед на кратное четырем байтам число.

Например: пусть у вас смещение для кол-ва ХП было 0x4B8. И вы видите, что после обновления там оно уже не хранится. Прибавьте к 4B8 число 4. Получим 4BC (кто не умеет работать с шестнадцатеричной системой счисления — просто возьмите в помощь стандартный калькулятор Windows). Проверяем. Оно? По этому смещению лежит ХП? Нет? Значит прибавляем еще 4. Получаем 4C0. Так же проверяем.

Допустим, мы нашли искомое смещение. Запомнили на сколько байт вперед оно переместилось? Теперь не надо перебирать. Остальные оффсеты, которые находились рядом с искомым, в большинстве своем так же лежат рядышком, на равноудаленном от искомого «расстоянии».

Есть смещения, которых изменения, как правило, не затрагивают. Например:
LocX = 0x3C
LocZ = 0x40
LocY = 0x44

Они остаются неизменными от версии к версии.

Постоянные же адреса при средних и крупных обновлениях изменяются. Базовый адрес, гейм адрес, адреса для функций — всё это придется находить заново.

Как найти walk-адреса для инжекта движения PW?

Довольно часто встречающийся вопрос: как найти walk-адреса для инжекта движения? Всё очень просто. Для поиска нам понадобится отладчик OllyDbg (скачиваем по адресу http://www.ollydbg.de/).
Запускаем ПВ, заходим на персонажа.
Запускаем наш ранее скачанный ollydbg.

Окно Ollydbg после запуска программы
Olly Open
Выбираем пункт меню File - Attach
Olly Attach
В появившемся списке процессов выбираем наш запущенный процесс ПВ — elementclient.exe
Находим и дважды щелкаем по elementclient.exe
Olly elementclient
После выбора процесса отладчик цепляется к нему и ставит на паузу.
Вы можете убедиться в этом по характерной надписи
Olly paused
Наш клиент на паузе и ни на что больше не реагирует. Снимаем с паузы, нажимая клавишу F9.
Надпись Paused (на паузе) сменилась на Running (запущен)
Olly running
Обратите внимание на надпись module ntdll
Olly ntdll module
Она означает, что мы сейчас находимся в ненужном нам модуле ntdll. Для того, чтобы перескочить на необходимый, нажимаем сочетание клавиш Ctrl+G. Открывает окно для ввода адреса для перехода. Введем от балды любой адрес из нужного модуля. Например, 00444444. Переходим. Нажимаем еще раз Ctrl+G и повторяем процедуру.
Убедимся, что теперь мы там, где надо
Olly elementc module
Итак, теперь мы в нужном модуле, а значит отправляемся искать код в процессе, который нам покажет адреса walk-адресов.
Нажимаем правой кнопкой в главном окне программы, переходим в меню Search for — Sequence of commands (или нажимаем Ctrl + S). В появившемся окне вводим две ассемблерные команды:
PUSH 3
MOV ECX,EDI
Окно Sequence of commands с нашими командами
Olly sequence
Нажимаем Find и получаем:
Olly first found
Олли нашла нам искомую комбинацию команд, но, к сожалению, это не то, что нам нужно. Нажимаем Ctrl+L (продолжить поиск).
Нам нужен участок кода, похожий на этот
Olly scnd found
Второй результат поиска (после как мы нажали Ctrl+L) сразу же дает нам его!
«И где же наши walk1, walk2 и wakl3 адреса в этом непонятном участке кода?» — спросите вы.
Да вот же они (подчеркнуты красным).
walk1, walk2 и walk3
Olly found walk addresses

4A1AA0, 4A7DE0, 4A2090 — актуальные walk-адреса для версии руоффа от 23.06.2015. Берите и применяйте в своих инжектах движения.
Поздравляю. Как найти walk-адреса для инжекта движения PW вы теперь знаете и можете с легкостью находить их самостоятельно.

Как найти базовый адрес (Base address) для PW? Ручной способ

Итак, в предыдущей статье мы с вами познакомились с быстрым способом нахождения базового адреса.

Ручной, более продвинутый способ.
Для поиска нам потребуется программа CheatEngine. Скачать вы ее можете на одноименном официальном сайте — http://cheatengine.org/
Если вы в первый раз работаете с данной программой, то рекомендую посмотреть маленький видеоурок, в котором показывается и рассказывается о принципе ее работы:

Итак, запускаем ПВ, логинимся на своего персонажа.

Запускаем Cheat Engine, выбираем процесс с игрой (elementclient.exe), жмём Open
Open pwi client via cheatengine
Всё, мы прицепили процесс ПВ к CheatEngine.

Я буду рассматривать поиск базового адреса на примере изменения полученного опыта персонажа. По аналогии, вы можете искать через другие значения характеристик персонажа, которые вы сможете изменить в любой момент (например, хп, мп и др).

Открываем характеристики персонажа и смотрим текущее количество опыта
Current EXP
Вводим текущее количество опыта в строку поиска CheatEngine. В моем случае это 883672. Обратите внимание, чтобы настройки поиска были такими же как у меня. В частности, Scan Type, Value Type и убрана галочка у Hex (поставив галочку, программа будет искать шестнадцатеричное значение, тогда как у нас оно — десятичное).
Ввели, жмем First Scan (первичное сканирование). На данном этапе программа производит сканирование памяти игры на предмет наличия в ней значения 883672 (у вас, напомню, оно своё).
Что мы получаем
got exp
1. CheatEngine нашел нам всего один адрес в памяти, который содержит значение нашего текущего опыта. Отлично!
2. Щелкаем два раза по найденному значению, чтобы оно добавилось в специальное поле ниже.

Мы получили самый простой вариант (зачем всё усложнять?), когда найденное значение — единственное. Это бывает не часто. В большинстве случаев, после первого отсеивания вы будете получать еще целую кучу адресов в памяти, которые будут содержать искомое значение. 99% из них — ненужный вам мусор.

Что-то типа такого
more results
Что делать? А что делать вы должны уже знать, посмотрев небольшой обучающий видеоролик, который я давал вам ранее на этой странице. Просто опять убейте какого-нибудь моба, значение текущего опыта изменится. Введите новое количество опыта в то же поле, куда вводили искомый опыт в первый раз, но теперь жмем не на New Scan, а Next Scan. Что делает программа? Она ищет новое значение опыта, но уже не во всей области памяти игры, а только среди ранее найденных значений.

В итоге список ранее найденных значений заметно сократится, потому что многие адреса хранили «мусор», а не текущее значение опыта, поэтому они останутся хранить прежнее значение, которое нам уже не нужно. В идеале, там должно остаться 1-2 значения. Если их больше — убиваете моба снова, и ищете новое значение через Next Scan до тех пор, пока не добьетесь нужного результата.

Итак, у нас с вами одно значение. Именно в этом месте памяти (1C40CD1C — не удивляйтесь, что адрес содержит и буквы — он представлен в шестнадцатеричном виде) хранится искомое нам значение. Мы можем считать его, изменить, заморозить.

Поменял опыт на 9999999
Change Exp
Чтобы изменить опыт на свой, просто кликните по текущему значению в колонке Value в нижней области (напомню, двойным кликом по найденному значению оно переносится в нижнюю рабочую область).

Конечно, стать бессмертным вы не сможете (только в оффлайн играх). Вы не сможете быстро прокачаться, поменяв значение опыта на 100000000000. Просто потому, что вся данная информация хранится на сервере игры, а не в клиенте. Мы редактируем область памяти клиента и повлиять на значения, хранящиеся на сервере никак не можем. Вы можете поменять имя персонажа, уровень, кол-во хп, мп, денег и т.п. но всё, что вы меняете — видите только вы. Такова особенность онлайн-игр.

Ну что ж, немного отступили.
Круто! Мы нашли определенное значение! Надо найти хп? Так же и найдем. Зачем что-либо еще искать? Зачем искать базовый адрес? А вот зачем: найденный адрес 1C40CD1C с текущим опытом является временным. Если мы перезапустим клиент, то по адресу 1C40CD1C мы уже опыт не найдем! Но мы сможем находить его быстро и всегда, зная базовый адрес и цепочку оффсетов от этого адреса до искомого адреса. Вперед!

Нажимаем правой кнопкой по найденному адресу в нижнем окне и в меню выбираем Find out what writes to this address (найдем, что пишет по этому адресу)

Нажимаем правой кнопкой по адресу и в меню выбираем Find out what writes to this address
Find out what writes to this address

Нас уведомляют, что к процессу прицепится отладчик. Жмем Yes
CheatEngine Debugger

Появилось окно, которое отлавливает всё, что записывает что-либо в нашу ячейку памяти
debug window

Чтобы поймать то, что же пишет (меняет значение опыта), нам надо, соответственно, поменять значение опыта. Для этого делаем что? Правильно — убиваем моба.
После убийства появляется инструкция
got first offset
Посмотрите. Как только мы убили моба, появляется строчка, которая непосредственно производит запись нового значения опыта в нашу ячейку памяти. А теперь посмотрите на подчеркнутую шестнадцатеричную цифру — это смещение до ячейки опыта! Самое последнее смещение, непосредственно указывающее на ячейку, хранящую опыт. Запомним его — 4D4. Теперь нам надо найти смещение, указывающее на смещение 4D4 (простите за тавтологию). Вперед.
Выделяем инструкцию, жмем More Information, Правой кнопкой по выделенному адресу и копируем его в буфер обмена
extra info
Закрываем окна отладчика.
Жмем ОК, Stop/Close. Ставим галочку у Hex, вставляем в поле скопированный адрес, жмем New Scan - First Scan
put new address
Адрес у нас в шестнадцатеричном виде, поэтому нам необходимо было поставить галочку у Hex, тем самым подсказывая CheatEngine, что мы ищем не десятичное значение, а шестнадцатеричное.

Итак, у нас появляется целая куча адресов. Кликаем два раза по первому адресу, он появляется в нижней области программы. Щелкаем правой кнопкой мыши по нему в нижней области программы и выбираем пункт Find out what accesses this address (что обращается к этому адресу).

Выпадает куча инструкций
access to address
Посмотрите Внимательно. У всех у них одинаковое смещение — 28. То, что нужно! Второй оффсет, ведущий к нашему ранее найденному. Запомним его.

Выделяем первую строчку, жмем More Information. Возможно искомый адрес (probably address) нам показывают 03230398.

Щелкаем по нему и копируем в буфер обмена
access 2nd address
Жмем ОК, Stop/Close, закрывая дополнительные окна. В поле для поиска вводим наш новый адрес 03230398. New Scan — First Scan

И что мы видим?! Зеленый адрес!!! D3B08C
first static address

Итак, зеленый адрес, это статичный (неизменяемый адрес). Но это еще не базовый адрес. Далее вы узнаете почему. Забегая вперед скажу, что мы нашли Game address. Гляньте на автоматический способ. Помните, что нам выдала программа?

А выдала она нам вот что
Посмотрите на строчку Game Address и сравните с зеленым адресом, который мы только что получили. Похожи? 🙂

Мы с вами нашли постоянный гейм адрес и вплотную подобрались к базовому адресу.

Кликаем два раза по зеленому адресу, добавляя его в рабочую область. В ней выделяем этот адрес, жмем правой кнопкой и всё так же выбираем Find out what accesses this address.

Выпадает куча инструкций со смещением 1C
1C offset

1C — это смещение, как мы уже знаем, к статическому гейм адресу. Запоминаем это смещение.

Выполняем привычные действия: берем самую первую инструкцию, выделяем ее и щелкаем по More Information. Возможный адрес нам показывают 00D3B070.

Щелкаем по нему правой кнопкой и копируем в буфер обмена.
last offset
Жмем ОК, Stop/Close, закрывая дополнительные окна. В поле для поиска вводим наш новый адрес 00D3B070. New Scan — First Scan

Нам попался второй зеленый адрес! 00D3A8EC
got base address
Что это? Базовый адрес? Гляньте на картинку из автоматического поиска и вы убедитесь, что это именно он!

Но нам то надо убедиться самим! Щелкаем по зеленому адресу двойным кликом, правой кнопкой по нему в нижней области экрана, выбираем Find out what accesses this address.

И что же мы видим?
base total

Смещений больше нет. везде фигурирует статический 00D3A8EC адрес. То есть это самое начало цепочки оффсетов.

Итак, мы нашли с вами базовый адрес: Baseaddress = 0xD3A8EC.
Мы нашли с вами цепочки оффсетов до ячейки памяти, хранящей текущее количество опыта: 0x1C, 0x28, 0x4D4.

Таким образом, цепочка оффсетов до текущего опыта примет вид: 0xD3A8EC + 0x1C + 0x28 + 0x4D4
Считывая значение по данной цепочке, мы всегда будем получать актуальную информацию об опыте даже после перезапуска клиента игры.

Так как мы уже знаем, что гейм адрес тоже является постоянным и на него указывает смещение 0x1C (смещение к гейм структуре) относительно базового адреса, то мы можем сократить нашу цепочку до вида GameAddress + 0x28 + 0x4D4, то есть 0xD3B08C + 0x28 + 0x4D4.

А что за смещение 0x28? Это смещение, указывающее на структуру нашего персонажа. В этой структуре хранятся многие другие характеристики нашего персонажа. То есть если вы будете искать хп или количество денег в инвентаре, то смещение структуры персонажа будет так же фигурировать в вашей найденной цепочке.

Отсюда какой можно сделать вывод? Если вы будете искать количество хп, например, то вам достаточно будет найти только самый первый из найденных нами оффсетов, указывающий непосредственно на саму ячейку памяти с хп, а не на другое смещение, так как мы уже знаем, что является характеристикой персонажа, а значит хранится в структуре персонажа, то есть по цепочке Baseaddress + 0x1C + 0x28 + хп

Как найти базовый адрес (Base address) для PW? Быстрый способ

В прошлой статье мы с вами уяснили для себя что такое базовый адрес, и почему он находится в первую очередь. Если вы до сих пор не сделали этого, то можно пройти сюда.

Сейчас мы с вами займемся непосредственно его поиском.

Итак, как же найти базовый адрес? Существует два способа: ручной и автоматический. Какие же плюсы и минусы каждого? Если подумать, то они вполне очевидны.
Плюсы:

Ручной:
— Вы знаете, что, как и где находить. Ни от кого не зависите
— Безопасно
Автоматический:
— Быстрота поиска

Минусы:

Ручной:
— Вы тратите больше времени на нахождение, чем в автоматическом способе
Автоматический:
— Если программа перестает корректно работать, то вы становитесь беспомощным и будете ждать, когда всё найдут за вас и выдадут на блюдечке.
— В один прекрасный день, в виде offsetfinder’a вам могут подсунуть какую-нибудь заразу.

Какой выбрать — каждый решает сам для себя.

Если вы выбрали автоматический способ, то можете скачать OffsetFinder по ссылке (программа не моя, не забудьте проверить на вирусы).
Запускаем ПВ, запускаем программу и получаем наш базовый адрес:
get base address

На второй адрес пока не обращаем внимание. К нему мы вернемся позже, в ручном способе нахождения базового адреса PW.

На этом всё. Переходим по ссылке выше если вам нужно более глубокое понимание в нахождении базового адреса и оффсетов (смещений).

Что такое Базовый адрес (Base address) и зачем он нужен?

Итак, начнем с самого начала, а именно — поиска базового адреса. Что это вообще такое и зачем нам это надо?

Говоря обывательским языком (гуглите «Динамическая память» если хочется углубленного понимания), память PW выделяется динамически, игра не занимает постоянно одно и то же место в памяти. Вы не можете, например, сходу взять адрес со значением ХП персонажа и работать с ним в своей программе. Найдя его сейчас, в будущем вы просто не узнаете где этот адрес находится, так как при каждом перезапуске клиента игры, он (адрес) будет меняться.

Как же быть? Нужно найти статический (базовый) адрес PW, который не меняется при перезапуске клиента! Проще говоря, именно этот адрес PW берет за основу и размещает в памяти относительно него все необходимые данные. Нам же останется только знать смещения (оффсеты) относительно этого адреса, чтобы получить актуальное на данный момент место в памяти с необходимой нам информацией (хп, мп, лвл, чи и т.п.). Поиском смещений мы займемся в следующих статьях.

Для тех, кто еще не совсем понял, проведем небольшую аналогию.
Представьте, что вы оказались в новом для вас торговом центре. Вы знаете, что где-то здесь находится нужный вам павильон. Но где? Вход в торговик — это базовый адрес. Он постоянен. Информационные таблички с логотипами фирм — это смещения (оффсеты) относительно входа (базового адреса). Они показывают, куда вам двигаться от входа, чтобы достигнуть желаемого павильона (места в памяти).

Таким образом, используя комбинацию «базовый адрес + смещение», вы можете находить область памяти, где в данный момент хранится нужная вам информация. Смещений, конечно, в подавляющем большинстве случаев, будет не одно, а несколько.

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

Поэтому важно самому уметь его находить, а не ждать, пока добрые дяденьки найдут за вас. Собственно, это касается всех смещений и адресов. Данный сайт как раз и посвящен тому, чтобы помочь вам в этом.

P.S. Постоянные адреса и смещения не изменяются до тех пор, пока вы используете текущую версию игры. Однако если в PW выходит более-менее крупное обновление, затрагивающее изменение файла elementclient.exe, то это сигнал к тому, что теперь придется потрудиться в поисках новых значений. Но может случиться и так, что изменения смещений и не коснутся, как это было при обновлении клиента PWI до версии 1.5.2 build 2482, когда основная часть смещений осталась без изменений.

Как же найти базовый адрес? Чтобы узнать, читайте далее.

Powered by WordPress