Jump to content
Sign in to follow this  

Recommended Posts

Отключаем сообщения о погоде

 

1.png

 

Привет! В этом гайде я расскажу каким образом можно убрать сообщения о погоде из системы.

 

Работать будем с GameServer.exe, под понятием "сервер" будет подразумеваться GameServer.

 

Есть 2 способа отключения сообщений о погоде. Первый состоит в том, чтобы вообще убрать погоду с сервера. Второй - произвести некоторые изменения в GameServer.exe, при этом погода останется, но сообщения в систему о ней исчезнут.

 

Способ I - Нет погоды нет сообщений

В директории resource сервера находятся папки с картами (garner, magicsea, darkblue, guildwar и так далее). В каждой такой папке лежит файл:

картаmonster_conf.lua
где карта это название папки, в которой находится данный файл - garner, magicsea, darkblue, guildwar и так далее.

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

 

Например, для Аскарона (garner) погода в файле garnermonster_conf.lua определяется следующим образом:

AddWeatherRegion(9,  8, 40, 2434, 2800 , 80, 80)
AddWeatherRegion(11, 8, 40, 2247, 2960 , 80, 80)
AddWeatherRegion(9,  8, 40, 1190, 1140 , 80, 80)
AddWeatherRegion(11, 8, 40, 1160, 1400 , 80, 80)

Наша задача заключается в том, чтобы удалить или закомментировать (--) вызовы функции AddWeatherRegion() в файле monster_conf.lua для каждой карты. Таким образом, мы отключим погоду на сервере.

 

После проделанных изменений не забудьте перезагрузить GameServer.exe.

 

Способ II - Патчим GameServer.exe

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

 

Открываем GameServer.exe в OllyDbg (File -> Attach -> В списке процессов выбрать GameServer.exe). Затем переходим в модуль GameServer (View -> Executable modules -> В списке модулей выбрать GameServer), его адрес (Base) 0x00400000. Далее проанализируйте дизассемблированный код. Для этого в контекстном меню окошка с инструкциями (кодом) выберите Analysis -> Analyse code или нажмите сочетание клавиш Ctrl + A.

 

В итоге мы должны получить следующее:

2.png

Окно с инструкциями - кодом

 

Далее нужно найти строку с сообщением о погоде. Так как я работаю с GameServer.exe версии 1.38, то данная строка находится в .res файле. Декомпилируем .res файл:

 

На выходе получается текстовый файл. Производим поиск по файлу с помощью ключевого слова "weather" и находим строку:

GM_WEATHER_CPP_00001 { "Weather: Current sea{0} {1}nearby will occur{2}" }

Это шаблонная строка для сообщения о погоде, которое выводится в системный чат. Видно, что идентификатором этой строки является строка "GM_WEATHER_CPP_00001", её мы и будем искать в GameServer.exe. Для этого в контекстном меню окна с инструкциями выполняем команду Search for -> All refernced text strings. В появившемся окне с текстовыми строками ищем строку "GM_WEATHER_CPP_00001" (контекстное меню -> Search for text -> GM_WEATHER_CPP_00001). Затем кликаем по найденной строке правой кнопкой мыши и выбираем команду Follow in Disassembler (или нажимаем Enter).

 

В результате мы видим, что данная строка используется по адресу 0x0004B1D93:

004B1D8B | PUSH EAX                          ; /Arg3
004B1D8C | LEA ECX,DWORD PTR SS:[EBP-C8]     ; |
004B1D92 | PUSH ECX                          ; |Arg2
004B1D93 | PUSH 0x005C2AA8                   ; |Arg1 = 005C2AA8 ASCII "GM_WEATHER_CPP_00001"
004B1D98 | MOV ECX,0x0071E084                ; |
004B1D9D | CALL 0x0054EA70                   ; \?Format@CResourceBundleManage@@QAEHPBDAAVCFormatParameter@@QAD@Z
004B1DA2 | LEA EAX,DWORD PTR SS:[EBP-C0]
004B1DA8 | PUSH EAX                          ; /Arg1
004B1DA9 | MOV ECX,DWORD PTR DS:[71E078]     ; |
004B1DAF | CALL 0x0049E0C0                   ; \CGameApp::LocalNotice
004B1DB4 | MOV EAX,DWORD PTR SS:[EBP-14]
004B1DB7 | XOR EDX,EDX
004B1DB9 | MOV ECX,3E8

Как нетрудно догадаться, данные инструкции загружают шаблонную строку из .res файла, подставляют в неё координаты и название погодного явления, а затем выводят получившееся сообщение в системный чат.

 

Отключим вывод сообщения о погоде в системный чат. Для этого необходимо затереть соответствующие инструкции:

004B1DA2 | LEA EAX,DWORD PTR SS:[EBP-C0]
004B1DA8 | PUSH EAX                          ; /Arg1
004B1DA9 | MOV ECX,DWORD PTR DS:[71E078]     ; |
004B1DAF | CALL 0x0049E0C0                   ; \CGameApp::LocalNotice

Чтобы затереть данные инструкции, нужно заменить их байты на 0x90 (инструкция NOP). Выделяем инструкции начиная с адреса 0x04B1DA2 по адрес 0x004B1DAF и вызываем контекстное меню. В контекстном меню выполняем команду Binary -> Fill with NOP's. Получаем следующие инструкции:

004B1D8B | PUSH EAX                       ; /Arg3
004B1D8C | LEA ECX,DWORD PTR SS:[EBP-C8]  ; |
004B1D92 | PUSH ECX                       ; |Arg2
004B1D93 | 0x005C2AA8                     ; |Arg1 = 005C2AA8 ASCII "GM_WEATHER_CPP_00001"
004B1D98 | MOV ECX,0x0071E084             ; |
004B1D9D | 0x0054EA70                     ; \?Format@CResourceBundleManage@@QAEHPBDAAVCFormatParameter@@QAD@Z
004B1DA2 | NOP
004B1DA3 | NOP
004B1DA4 | NOP
004B1DA5 | NOP
004B1DA6 | NOP
004B1DA7 | NOP
004B1DA8 | NOP
004B1DA9 | NOP
004B1DAA | NOP
004B1DAB | NOP
004B1DAC | NOP
004B1DAD | NOP
004B1DAE | NOP
004B1DAF | NOP
004B1DB0 | NOP
004B1DB1 | NOP
004B1DB2 | NOP
004B1DB3 | NOP
004B1DB4 | MOV EAX,DWORD PTR SS:[EBP-14]
004B1DB7 | XOR EDX,EDX
004B1DB9 | MOV ECX,3E8

Сохраним проделанные изменения. В контекстном меню выбираем команду Copy to executable -> All modifications. На вопрос "Copy selection to executable file?" отвечаем "Copy all". Появится окошко, просто закрываем его крестиком. Далее программа задаст новый вопрос типа: "Файл GameServer.exe был изменен! Сохранить изменения?", отвечаем "Да" и в диалоге выбора файла, вводим название для измененного GameServer.exe.

 

Запускаем измененный GameServer.exe и убеждаемся, что сообщений  о погоде в системе больше нет.

 

 

Для GameServer.exe версии 1.36 шаг с декомпиляцией .res соответственно нужно пропустить и сразу искать непосредственно строку сообщения о погоде по ключевому слову "weather". Я нашел такую строку:

Weather: %s has occurred at location %d %d

Затем нужно аналогичным образом затереть инструкции начиная с адреса 0x004AA928 по адрес 0x004AA935.

  • Like 1

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...