Jump to content
Sign in to follow this  
V3ct0r

Редактирование горячих клавиш в клиенте на примере Insert

Recommended Posts

Редактирование горячих клавиш в клиенте на примере Insert

 

Всем привет! :smile:

 

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

 

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

    if ( key == VK_INSERT && !GetMainCha()->IsBoat() )
    {
        CInsertState *seat = dynamic_cast<CInsertState*>(GetMainCha()->GetActor()->GetCurState());
		if (seat)
        {
			seat->Cancel();
            return;
        }

        seat = new CInsertState(GetMainCha()->GetActor());
        seat->SetIsSend( true );
        seat->SetAngle( GetMainCha()->getYaw() );
        GetMainCha()->GetActor()->SwitchState(seat);

        return;
    }

Этот код находится в методе _KeyDownEvent(int key), класса CWorldScene, который вызывается при нажатии игроком какой-либо клавиши на клавиатуре.

 

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

 

Итак, запускаем игру и присоединяемся к процессу Game.exe в отладчике OllyDBG. Ищем приведенный код выше. Для этого выполним поиск по всем константам: контекстное меню дизассемблера -> Search for -> All constants.

 

В появившемся окошке вводим код клавиши Insert (0x2D):

i1.png

 

Появится окно с результатами поиска. Результатов будет очень много, но в первую очередь нас интересуют инструкции CMP. Как узнать какая инструкция нам нужна? Ставим на все инструкции CMP точку останова (Breakpoint). Если сразу после того, как Вы поставили точку останова она сработала, то убираем ее и продолжаем выполнение программы.

i2.png

 

Далее идем в игру и нажимаем клавишу Insert. Сработала точка останова по адресу 0x004CD308 (у Вас адрес может отличаться):

i3.png

 

Давайте для примера заменим клавишу Insert на клавишу Space (пробел). Этот пример не совсем удачный, так как данная клавиша используется для ввода пробела в чат. 

 

Код клавиши Space:

#define VK_SPACE          0x20

Остальные коды клавиш Вы можете найти в заголовочном файле WinUser.h

 

Заменяем инструкцию

CMP ESI,2D

на 

CMP ESI,20

 

i4.png

 

Переходим в игру и нажимаем пробел. Теперь персонаж садится на землю и встает по нажатию клавиши Пробел. Сохраняем проделанные изменения.

 

Для тех, кто не умеет пользоваться OllyDBG, но использует Game.exe из данного примера. Откройте Game.exe в любом HEX-редакторе (я буду использовать HxD) и перейдите по адресу 0x000CD30A. Как мы получили этот адрес?

0x000CD30A = 0x004CD308 - 0x00400000 + 2
2 = 2 байта инструкции CMP ESI

i5.png

 

Замените 0x2D на код интересующей Вас клавиши.

i6.png

 

Сохраните проделанные изменения.

 

На этом все.

  • Like 2

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...