Jump to content
V3ct0r

Видимость названий объектов и их жизней без нажатой клавиши Shift

Recommended Posts

Видимость названий объектов и их жизней без нажатой клавиши Shift

 

Всем привет! В данном гайде я расскажу как сделать отображение названий монстров, NPC и ников персонажей, а также их жизней без нажатой клавиши Shift или взятия в цель:

 

797b3c2df42e.png

 

Вам понадобится:

1) Game.exe из папки system Вашего клиента;

2) Отладчик OllyDbg. Я буду работать в версии 1.10.

 

Чтобы сделать данную модификацию, необходимо пропатчить Game.exe.

Примечание: В этой статье я показываю лишь принцип того, как произвести такую модификацию. Иными словами, инструкции и их адреса у Вас могут отличаться от тех, что я привожу в гайде. Я буду работать с Game.exe из 1.39 ру. оф. клиента.

 

Итак, нам нужно найти в Game.exe код, который обрабатывает нажатие клавиши Shift. У данной клавиши есть код 16 (0x10 в шестнадцатеричной системе счисления). Также нам известно, что в WinAPI есть функция GetKeyState(int nVirtKey), с помощью которой можно узнать, нажата ли клавиша с кодом nVirtKey. Заходим в игру (на карту) и открываем Game.exe в OllyDBG и начинаем искать вызовы функции GetKeyState(). Функция находится в библиотеке USER32.DLL, ставим на нее Break Point (F2).

bcab8e57ae3e.jpg

 

Break Point сразу же срабатывает. Смотрим на стек и видим что функция была вызвана из библиотеки MindPower3D_D8R.dll. Это библиотека движка игры.

da0ad31fb53f.jpg

 

Переходим по адресу 0x101290D4 (адрес возврата из функции GetKeyState) и видим следующий код:

d865c67e2604.jpg

 

101290C0 PUSH EBP
101290C1 MOV EBP,ESP
101290C3 SUB ESP,44
101290C6 PUSH EBX
101290C7 PUSH ESI
101290C8 PUSH EDI
101290C9 MOV DWORD PTR SS:[EBP-4],ECX
101290CC PUSH 10
101290CE CALL DWORD PTR DS:[<&USER32.GetKeyState>>
101290D4 MOVSX EAX,AX
101290D7 AND EAX,0FF00
101290DC POP EDI
101290DD POP ESI
101290DE POP EBX
101290DF MOV ESP,EBP
101290E1 POP EBP
101290E2 RETN

Видим, что в качестве параметра GetKeyState() передается 0x10 - код клавиши Shift. Возможно, данная функция по адресу 0x101290C0 проверяет, нажата ли клавиша Shift. Назовем ее IsShiftPress().

Далее смотрим где эта функция вызывается:

d18482897d11.jpg

Ставим Break Point на каждый вызов и видим, что функция IsShiftPress() постоянно вызывается по адресам 0x004CC3E2, 0x004D7DE4 и 0x004D7E41. Начинаем с адреса 0x004CC3E2. Переходим на него и видим следующий код:

004CC3E2  CALL DWORD PTR DS:[IsShiftPress]
004CC3E8  TEST EAX,EAX
004CC3EA  MOV EBP,2
004CC3EF  JE SHORT 004CC45D
004CC3F1  MOV EAX,DWORD PTR DS:[ESI+124]
004CC3F7  XOR EDI,EDI
004CC3F9  TEST EAX,EAX
004CC3FB  JLE 004CC62A
004CC401  MOV EAX,DWORD PTR DS:[6705C8]

Если Shift не нажат, то происходит прыжок на адрес 0x004CC45D (TEST EAX,EAX - сравнение регистра EAX с 0). Затираем этот прыжок с помощью инструкций NOP, чтобы данный код выполнялся независимо от того, нажат Shift или нет:

004CC3E2  CALL DWORD PTR DS:[IsShiftPress]
004CC3E8  TEST EAX,EAX
004CC3EA  MOV EBP,2
004CC3EF    NOP
004CC3F0    NOP
004CC3F1  MOV EAX,DWORD PTR DS:[ESI+124]
004CC3F7  XOR EDI,EDI
004CC3F9  TEST EAX,EAX
004CC3FB  JLE 004CC62A
004CC401  MOV EAX,DWORD PTR DS:[6705C8]

52c512bc0e73.jpg

Переходим в игру и видим, что название монстров/персонажей и их жизни отображаются без нажатого Shift'a, чего мы и хотели добиться. Теперь осталось сохранить изменения в Game.exe. Щелкаем правой кнопкой мыши по коду в отладчике, в контекстном меню выбираем Copy to executable -> All modifications и сохраняем Game.exe.
 

  • Like 2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×