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

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
Sign in to follow this  

×