Jump to content

Search the Community

Showing results for tags 'ассемблер'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Russian Section
    • Новости и объявления
    • Пиратия: Документация
    • Пиратия: Релизы
    • Пиратия: Разработка
    • Пиратия: Web
    • Пиратия: Помощь
    • Совместные проекты / набор команды
    • Доска объявлений
    • Программирование
    • Оффтопик
    • Корзина
  • English Section
    • News & Announcements
    • Guides
    • Releases
    • Development
    • Web
    • Questions & Help
    • Shared Projects / Team search
    • Paid services & Requests
    • Programming
    • Offtopic
    • Recycle bin
  • Portuguese Section
    • Dúvidas & Ajuda
  • Spanish Section
    • Preguntas y Ayuda
  • Servers
    • Russian servers
    • English servers

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 3 results

  1. Видимость названий объектов и их жизней без нажатой клавиши Shift Всем привет! В данном гайде я расскажу как сделать отображение названий монстров, NPC и ников персонажей, а также их жизней без нажатой клавиши Shift или взятия в цель: Вам понадобится: 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). Break Point сразу же срабатывает. Смотрим на стек и видим что функция была вызвана из библиотеки MindPower3D_D8R.dll. Это библиотека движка игры. Переходим по адресу 0x101290D4 (адрес возврата из функции GetKeyState) и видим следующий код: 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(). Далее смотрим где эта функция вызывается: Ставим 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] Переходим в игру и видим, что название монстров/персонажей и их жизни отображаются без нажатого Shift'a, чего мы и хотели добиться. Теперь осталось сохранить изменения в Game.exe. Щелкаем правой кнопкой мыши по коду в отладчике, в контекстном меню выбираем Copy to executable -> All modifications и сохраняем Game.exe.
  2. "Вы исчерпали число попыток, игра будет принудительно закрыта" Всем привет! Как известно, если 4 раза подряд ввести неверный пароль от Вашего аккаунта (или аккаунта Вашего друга, который забыл Вам сообщить пароль), то игра закроется с сообщением "Вы исчерпали число попыток, игра будет принудительно закрыта". Иногда это бывает неудобно. В данной статье я расскажу как сделать так, чтобы игра больше не закрывалась. Работать будем с 1.3х ру. оф. клиентом. Сразу скажу, что в данный момент я сам не знаю как это можно сделать, поэтому будем разбираться вместе. С чего начать? Давайте попробуем зацепиться за сообщение "Вы исчерпали число попыток, игра будет принудительно закрыта". Где оно может находиться? Либо в Game.exe, либо в StringSet.txt. Проверим StringSet.txt. Действительно, здесь есть такая строка: [251] "Вы исчерпали число попыток, игра будет принудительно закрыта" Запомним ее номер 251. Он же 0xFB в шестнадцатеричной системе счисления. Откроем Game.exe в отладчике OllyDBG и поищем это число. Нашлось всего 11 инструкций, это хорошая новость. Так же нас интересуют только инструкции PUSH, а их здесь всего 2. Проверим инструкцию push 0xFB по адресу 0x005076A5: Ниже видим вызов системной функции SendMessageA с параметром WM_DESTROY. Что делает функция SendMessageA()? Она отправляет заданное сообщение окну. А заданное сообщение у нас WM_DESTROY, это сообщение посылается когда необходимо уничтожить окно. Таким образом, можно сделать вывод, что этот код закрывает игру, а по адресу 0x005076A5 начинает загружается строка с сообщением. Перестаем гадать и ставим точку останова по адресу 0x005076A5, идем в игру и 4 раза вводим неверный пароль. Точка останова сработала! Значит где-то выше код, который закрывает клиент, если мы 4 раза введем неверный пароль. Теперь нас интересуют инструкции условных переходов. По адресу 0x00507691 можно увидеть инструкцию cmp EAX, 3. А дальше идет условный переход на адрес 0x00507709, если значение в регистре EAX меньше и не равно 3. Можно предположить, что в EAX попадает количество попыток неудачного входа: EAX = 0 (1 попытка); EAX = 1 (2 попытки); EAX = 2 (3 попытки); EAX = 3 (4 попытки). Давайте это проверим. Ставим точку останова по адресу 0x00507691. И вводим несколько раз неверный пароль. Действительно, если 3 раза ввести неверный пароль, то EAX = 2. Как заставить игру перестать закрываться? Очень просто: условный переход меняем на безусловный: Возвращаемся в игру и пробуем вводить неверный пароль. После 10 попытки становится понятно, что игра не закроется и мы достигли поставленной цели. Сохраняем наши изменения в Game.exe. Так же можно изменять количество попыток, после которых игра закроется. cmp EAX, <число попыток - 1> jmp 0x00507709 * число попыток должно быть в шестнадцатеричной системе счисления Например, инструкция cmp EAX,0A Означает, что игра закроется после 11 попытки. На этом все!
  3. Редактирование горячих клавиш в клиенте на примере Insert Всем привет! Меня спросили как можно изменить кнопку, на которую персонаж садится чтобы восстановить очки жизней и маны (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): Появится окно с результатами поиска. Результатов будет очень много, но в первую очередь нас интересуют инструкции CMP. Как узнать какая инструкция нам нужна? Ставим на все инструкции CMP точку останова (Breakpoint). Если сразу после того, как Вы поставили точку останова она сработала, то убираем ее и продолжаем выполнение программы. Далее идем в игру и нажимаем клавишу Insert. Сработала точка останова по адресу 0x004CD308 (у Вас адрес может отличаться): Давайте для примера заменим клавишу Insert на клавишу Space (пробел). Этот пример не совсем удачный, так как данная клавиша используется для ввода пробела в чат. Код клавиши Space: #define VK_SPACE 0x20 Остальные коды клавиш Вы можете найти в заголовочном файле WinUser.h Заменяем инструкцию CMP ESI,2D на CMP ESI,20 Переходим в игру и нажимаем пробел. Теперь персонаж садится на землю и встает по нажатию клавиши Пробел. Сохраняем проделанные изменения. Для тех, кто не умеет пользоваться OllyDBG, но использует Game.exe из данного примера. Откройте Game.exe в любом HEX-редакторе (я буду использовать HxD) и перейдите по адресу 0x000CD30A. Как мы получили этот адрес? 0x000CD30A = 0x004CD308 - 0x00400000 + 2 2 = 2 байта инструкции CMP ESI Замените 0x2D на код интересующей Вас клавиши. Сохраните проделанные изменения. На этом все.
×
×
  • Create New...