N00bSa1b0t
03.07.2014, 20:02
Всем привет.
Все знают, что в ПВ встроена функция автопота (с предпоследнего обновления, если не ошибаюсь), однако жадные китайцы требуют для него наличие в инвентаре некоего предмета под названием "Сфера алхимика". А где эта сферу взять? Конечно же в шопе.
Но, обогощать локализатора и разработчика - это не наш метод. Данная статья расскажет о том, как вручную пропатчить клиент так, чтобы можно было использовать автопот без всяких там сфер.
Итак, что для этого нужно:
1) Клиент ПВ. У меня был руофф клиент 1.5.1, последняя версия на текущий день.
2) Cheat Engine
3) Olly Debugger
4) Ida (необязательно)
5) Небольшое знание ассемблера.
Что есть автопот? Автопот - это автоматическое использование зелий, в зависимости от некоторых условий, например, от уровня здоровья персонажа.
Известно, что наличие "сферы алхимика" проверяется только лишь на клиенте, а сам сервер не знает, кто именно решил выпить банку - человек или автопот. А то, что проверяется на клиенте, может быть найдено и подправлено.
В качестве доказательства того, что автопот проверяется лишь на клиенте, можно сделать следующее: при помощи CE найти ID предмета из инвентаря и поменять его на сферу алхимика. Автопот сразу заработает.
Итак, для начала надо подумать: как именно клиент определяет может ли игрок вызвать окно автопота?
Сфера алхимика - обычный предмет. И она должна быть в инвентаре. Капитан очевидность подсказывает, что значит в клиенте есть некий алгоритм, который сканирует инвентарь и решает, можно или нельзя юзать автопот.
Варианта два - либо поиск сферы идет по клику на кнопку автопота (если она найдена - окно показывается, иначе - нет), либо поиск идет постоянно, а результат запоминается.
Итак, нам надо найти эту самую функцию сканирования инвентаря. Для этого запускаем пв, заходим в мир, запускаем СE, и вбиваем следующий адрес:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Этот адрес показывает айди предмета в первой ячейки инвентаря. В данном случае он равен 13894.
Далее жмем на адрес правой кнопкой и выбираем пункт "Find out what accesses this address", что в переводе значит "Найти то, что читает память по данном адресу".
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Откроется окно, в котором CE найдет две инструкции. При этом числа в первом столбце постоянно будут расти.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Теперь проверим нашу теорию о том, когда сканируется инвентарь. Передем в игру и нажмем Н (вызов окна автопота). Окно разумеется не появится, но и число строк в окне СЕ не изменится. Значит теория о том, что инв сканируется при попытке вызова неверна.
Итак, значит мы нашли 2 инструкции, которые сканируют инвентарь.
Рассмотрим их подробнее.
Итак, перед нами 2 одинаковые инструкции.
Происходит сравнение значения памяти по адрес ECX + 0xC со значением в регистре EDI. ECX + 0xC - это оффсет до айди предмета. А значит в EDI записан айди с которым и происходит сравнение.
Посмотрим на первую инструкцию. В нижней части окна СЕ заботливо нам показывает значение регистров процессора на момент исполнения команды.
EDI = 00008F9C
А теперь переведем в 10-ную систему: 8F9C = 36764
Ну-ка, глянем в базу, что это такое..Да это ж сфера алхимика!
Значит эта функция и есть то, что нам надо.
Но, давайте в этом убедимся. Нажимаем на кнопку "Show disassembler".
Данная функция должна где-то изменять регистр EDI, записывая туда айдишник вещи. Чуть выше видно команду mov edi, [...]
Опускаемся на команду ниже, щелкаем правой кнопкой и выбираем Set breakpoint. Игра тут же остановится. Запишем в отдельный файл значения регистра EDI, и нажмем F9, чтобы разрешить игре работать дальше. Она опять остановится. но значение EDI будет уже чуть другое. Через пару кликов F9 мы узнаем, что данная функция записывает в EDI айдишники карты жизни и всех видов сфер алхимика.
У тех, у кого есть IDA+hexray, могут по-другому взглянуть на эту функцию. Достаточно открыть elementclient.exe в IDA, перейти по нужному адресу и нажать F5. Перед вашими глазами предстанет си-подобный код.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Теперь явно виден цикл прохода по инвентарю. Также видно, что второй аргумент есть ни что иное как айди вещи для проверки. Функция возвращает номер слота, если вещь найдена, либо -1, если вещи нет.
Итак, работу функции мы поняли, осталось только подкорректировать ее.
Итак, нам нужно изменить функцию так, чтоб клиент думал, что сфера алхимика у нас есть. Это можно сделать двумя путями:
1. "грязный" - изменить функцию так, чтобы она всегда возвращала, например, 0. Т.е. любой предмет будет найдет.
2. "чистый" - возвращать не -1 только тогда, когда идет поиск сферы алхимика.
Я выбрал 2й путь. Откроем клиент в Olly и найдем нашу функцию
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Видно, что после нее идет 8 свободных байт. Строчки
POP EDI
POP ESI
RETN 8
обязательны, т.к. гарантируют восстановление регистров из стека и возврат нужного значения.
Места немного, но попробуем извернуться.
Нам надо проверить регистр EDI на равенство с число 36764. В случае равенства записать в EAX единичку.
Итак, выделим вышеупомянутые строчки, скопируем их куда-нибудь, чтоб не забыть.
После команды OR EAX,FFFFFF напишем
CMP EDI, 8F9C
Не пойдет..Слишком много байт уходит, т.к. 8F9C представляется в виде dword'а и мы теряем 2 байта в никуда.
Подумаем, а надо ли нам проверять весь регистр EDI? Мы знаем, что число 8F9C вполне укладывается в 2 байта, значит из 4-х байтного регистра можно проверять лишь младшую часть.
Напишем
CMP DI, 8F9C
Во, теперь команда занимает меньше.
Но мы видим что места тут остается мало, поэтому я принял такое решение - в случае равенства сделать джамп на свободное место.
Команда джампа в случае равенства:
JE ADDRESS
На свободном участке пишем MOV EAX,1
JMP ADDRESS
Этот джамп нужен для того, что вернуться обратно в нашу функцию.
Вот что у меня вышло
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Красным помечены измененные места.
Записываем изменение в файл (предварительно сделав бэкап оригинального файла), запускаем игру, и пробуем нажать на Н. Окошко открылось, все работает :-) Клиент пропатчен успешно.
Жду вопросов, пожеланий и прочего.
Руководство написано специально для сайта zhyk.ru, автор N00bSa1b0t. При копировании сохраните авторство :)
Выражаю спасибо Smertig'у за его гайд, который меня подтолкнул к изучению клиента и Мышам, за второй дополнительный толчок в асм :)
PS
Как выяснилось данная функция еще проверяет наличие колокола телепортации. Однако с ним ничего не поделаешь, проверка на сервере.
PPS
Вторая функция чтения инвентаря ищет итемы с авто-активацией: купоны и т.п.
Все знают, что в ПВ встроена функция автопота (с предпоследнего обновления, если не ошибаюсь), однако жадные китайцы требуют для него наличие в инвентаре некоего предмета под названием "Сфера алхимика". А где эта сферу взять? Конечно же в шопе.
Но, обогощать локализатора и разработчика - это не наш метод. Данная статья расскажет о том, как вручную пропатчить клиент так, чтобы можно было использовать автопот без всяких там сфер.
Итак, что для этого нужно:
1) Клиент ПВ. У меня был руофф клиент 1.5.1, последняя версия на текущий день.
2) Cheat Engine
3) Olly Debugger
4) Ida (необязательно)
5) Небольшое знание ассемблера.
Что есть автопот? Автопот - это автоматическое использование зелий, в зависимости от некоторых условий, например, от уровня здоровья персонажа.
Известно, что наличие "сферы алхимика" проверяется только лишь на клиенте, а сам сервер не знает, кто именно решил выпить банку - человек или автопот. А то, что проверяется на клиенте, может быть найдено и подправлено.
В качестве доказательства того, что автопот проверяется лишь на клиенте, можно сделать следующее: при помощи CE найти ID предмета из инвентаря и поменять его на сферу алхимика. Автопот сразу заработает.
Итак, для начала надо подумать: как именно клиент определяет может ли игрок вызвать окно автопота?
Сфера алхимика - обычный предмет. И она должна быть в инвентаре. Капитан очевидность подсказывает, что значит в клиенте есть некий алгоритм, который сканирует инвентарь и решает, можно или нельзя юзать автопот.
Варианта два - либо поиск сферы идет по клику на кнопку автопота (если она найдена - окно показывается, иначе - нет), либо поиск идет постоянно, а результат запоминается.
Итак, нам надо найти эту самую функцию сканирования инвентаря. Для этого запускаем пв, заходим в мир, запускаем СE, и вбиваем следующий адрес:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Этот адрес показывает айди предмета в первой ячейки инвентаря. В данном случае он равен 13894.
Далее жмем на адрес правой кнопкой и выбираем пункт "Find out what accesses this address", что в переводе значит "Найти то, что читает память по данном адресу".
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Откроется окно, в котором CE найдет две инструкции. При этом числа в первом столбце постоянно будут расти.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Теперь проверим нашу теорию о том, когда сканируется инвентарь. Передем в игру и нажмем Н (вызов окна автопота). Окно разумеется не появится, но и число строк в окне СЕ не изменится. Значит теория о том, что инв сканируется при попытке вызова неверна.
Итак, значит мы нашли 2 инструкции, которые сканируют инвентарь.
Рассмотрим их подробнее.
Итак, перед нами 2 одинаковые инструкции.
Происходит сравнение значения памяти по адрес ECX + 0xC со значением в регистре EDI. ECX + 0xC - это оффсет до айди предмета. А значит в EDI записан айди с которым и происходит сравнение.
Посмотрим на первую инструкцию. В нижней части окна СЕ заботливо нам показывает значение регистров процессора на момент исполнения команды.
EDI = 00008F9C
А теперь переведем в 10-ную систему: 8F9C = 36764
Ну-ка, глянем в базу, что это такое..Да это ж сфера алхимика!
Значит эта функция и есть то, что нам надо.
Но, давайте в этом убедимся. Нажимаем на кнопку "Show disassembler".
Данная функция должна где-то изменять регистр EDI, записывая туда айдишник вещи. Чуть выше видно команду mov edi, [...]
Опускаемся на команду ниже, щелкаем правой кнопкой и выбираем Set breakpoint. Игра тут же остановится. Запишем в отдельный файл значения регистра EDI, и нажмем F9, чтобы разрешить игре работать дальше. Она опять остановится. но значение EDI будет уже чуть другое. Через пару кликов F9 мы узнаем, что данная функция записывает в EDI айдишники карты жизни и всех видов сфер алхимика.
У тех, у кого есть IDA+hexray, могут по-другому взглянуть на эту функцию. Достаточно открыть elementclient.exe в IDA, перейти по нужному адресу и нажать F5. Перед вашими глазами предстанет си-подобный код.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Теперь явно виден цикл прохода по инвентарю. Также видно, что второй аргумент есть ни что иное как айди вещи для проверки. Функция возвращает номер слота, если вещь найдена, либо -1, если вещи нет.
Итак, работу функции мы поняли, осталось только подкорректировать ее.
Итак, нам нужно изменить функцию так, чтоб клиент думал, что сфера алхимика у нас есть. Это можно сделать двумя путями:
1. "грязный" - изменить функцию так, чтобы она всегда возвращала, например, 0. Т.е. любой предмет будет найдет.
2. "чистый" - возвращать не -1 только тогда, когда идет поиск сферы алхимика.
Я выбрал 2й путь. Откроем клиент в Olly и найдем нашу функцию
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Видно, что после нее идет 8 свободных байт. Строчки
POP EDI
POP ESI
RETN 8
обязательны, т.к. гарантируют восстановление регистров из стека и возврат нужного значения.
Места немного, но попробуем извернуться.
Нам надо проверить регистр EDI на равенство с число 36764. В случае равенства записать в EAX единичку.
Итак, выделим вышеупомянутые строчки, скопируем их куда-нибудь, чтоб не забыть.
После команды OR EAX,FFFFFF напишем
CMP EDI, 8F9C
Не пойдет..Слишком много байт уходит, т.к. 8F9C представляется в виде dword'а и мы теряем 2 байта в никуда.
Подумаем, а надо ли нам проверять весь регистр EDI? Мы знаем, что число 8F9C вполне укладывается в 2 байта, значит из 4-х байтного регистра можно проверять лишь младшую часть.
Напишем
CMP DI, 8F9C
Во, теперь команда занимает меньше.
Но мы видим что места тут остается мало, поэтому я принял такое решение - в случае равенства сделать джамп на свободное место.
Команда джампа в случае равенства:
JE ADDRESS
На свободном участке пишем MOV EAX,1
JMP ADDRESS
Этот джамп нужен для того, что вернуться обратно в нашу функцию.
Вот что у меня вышло
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Красным помечены измененные места.
Записываем изменение в файл (предварительно сделав бэкап оригинального файла), запускаем игру, и пробуем нажать на Н. Окошко открылось, все работает :-) Клиент пропатчен успешно.
Жду вопросов, пожеланий и прочего.
Руководство написано специально для сайта zhyk.ru, автор N00bSa1b0t. При копировании сохраните авторство :)
Выражаю спасибо Smertig'у за его гайд, который меня подтолкнул к изучению клиента и Мышам, за второй дополнительный толчок в асм :)
PS
Как выяснилось данная функция еще проверяет наличие колокола телепортации. Однако с ним ничего не поделаешь, проверка на сервере.
PPS
Вторая функция чтения инвентаря ищет итемы с авто-активацией: купоны и т.п.