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
    • Пиратия: Помощь
    • Программирование
    • Совместные проекты / набор команды
    • Доска объявлений
    • Offtop
  • English Section
    • News & Announcements
    • Guides
    • Releases
    • Development
    • Web
    • Questions & Help
    • Programming
    • Shared Projects / Team search
    • Paid services & Requests
    • Offtopic
  • Porting the game to another engines
    • Tales of Pirates Unity3D
  • Server Advertisements
    • 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 2 results

  1. Как добавить к крыльям эффект полета Привет! В данной статье я расскажу как сделать, чтобы персонаж летал на обычных крыльях. Вам понадобится: Отладчик OllyDBG; Базовые знания ассемблера; Умение переводить числа из десятичной системы счисления в шестнадцатиричную и обратно; Терпение и внимательность. Для примера, заставим нашего персонажа летать на Ангельских крыльях (ID: 937) 0. Все модификации производятся на стороне клиента. Я буду работать с Game.exe из английского клиента TOP версии 1.38, поэтому, скорее всего, у Вас будут отличаться адреса инструкций; 1. Запустите клиент, откройте OllyDBG и присоединитесь к процессу Game.exe (команда File -> Attach -> В списке процессов выбрать Game.exe -> Attach); 2. Далее перейдите в модуль Game.exe (команда View -> Executable Modules или ALT + E -> В списке модулей выбрать Game.exe); 3. Выполните анализ кода (контекстное меню -> Analysis -> Analyse code или CTRL + A); 4. Найдите функцию, которая отвечает за обновление позы персонажа при перемещении крыльев в 1-ю ячейку инвентаря. Например, с помощью команды контекстное меню -> Search for -> Command или CTRL + F. Затем в окошко поиска вводим: CMP EAX, 80 В моем Game.exe она выглядит следующим образом: 004A34B0 /$ 8B81 0C0D0000 MOV EAX,DWORD PTR DS:[ECX+D0C] 004A34B6 |. 3D 80000000 CMP EAX,80 004A34BB |. 7C 11 JL SHORT 004A34CE 004A34BD |. 3D 8C000000 CMP EAX,8C 004A34C2 |. 7F 0A JG SHORT 004A34CE 004A34C4 |. 3D 87000000 CMP EAX,87 004A34C9 |. 74 03 JE SHORT 004A34CE 004A34CB |. B0 01 MOV AL,1 004A34CD |. C3 RETN 004A34CE |> 32C0 XOR AL,AL 004A34D0 \. C3 RETN Если перевести эту функцию в C-код, то она будет выглядеть примерно так: // Проверка на крылья int CheckWings(int id) { if (id >= 128 && id <= 140 && id != 135) { return 1; // В 1-й ячейке инвентаря крылья перерожденя } return 0; // 1-я ячейка пуста или в ней лежит какой-то другой предмет } Наша с Вами задача заключается в изменении этой функции, а именно условия, где сравнивается ID предмета из 1-ой ячейки инвентаря с ID крыльев. Давайте добавим в него нашли крылья: if (id >= 128 && id <= 140 && id != 135 || id == 937) Тогда наша функция на ассемблере будет выглядеть вот так: ; RET_0 - адрес инструкции XOR AL, AL ; RET_1 - адрес инструкции MOV AL, 1 MOV EAX,DWORD PTR DS:[ECX+D0C] CMP EAX, 0x03A9 ; 0x03A9 = 937 - ID Ангельских крыльев JE SHORT RET_1 ; Прыжок на return 1, если ID == 937 CMP EAX,80 JL SHORT RET_0 ; Прыжок на return 0 CMP EAX,8C JG SHORT RET_0 ; Прыжок на return 0 CMP EAX,87 JE SHORT RET_0 ; Прыжок на return 0 MOV AL,1 ; return 1 RETN XOR AL,AL ; return 0 RETN Здесь мы сталкиваемся с проблемой: новая функция занимает больше байт, чем оригинальная! Что делать? В конце модуля есть так называемый Code Cave - область, заполненная нулевыми байтами. Именно туда мы и поместим нашу новую функцию. Найти эту область очень просто: крутите ползунок в окне кода до тех пор, пока не увидите инструкции вида: DB 00 DB 00 DB 00 DB 00 Итак, помещаем нашу функцию в Code Cave, я поместил ее по адресу 0x005FF850: Обратите внимание, что адреса инструкций RET_0 и RET_1 у меня получились 0x005FF875 и 0x005FF872 соответственно. Не забудьте их исправить в функции. Теперь нужно сделать так, чтобы вместо оригинальной функции вызывалась наша, модифицированная. Есть 2 способа: первый заключается в том, что мы изменяем адрес функции во всех других функциях, которые ее вызывают. Суть второго способа состоит в том, что в начале оригинальной функции мы пишем код, который будет перенаправлять вызов на новую модифицированную функцию. Давайте воспользуемся вторым способом. Идем на начало оригинальной функции (в данном гайде это 0x004A34B0) и пишем следующий код, заменяя оригинальный: jmp <адрес модифицированной функции> retn У меня получилось вот так: Протестируем наши изменения. Зайдите в игру и поместите Ангельские крылья в 1-й слот инвентаря. Персонаж должен взлететь: 5. Как видно из скриншота, значок GM провалился в персонажа, давайте это исправим. Найдите следующий код, например, продолжая искать инструкцию CMP EAX, 80: 004A3F7F . 8B86 0C0D0000 MOV EAX,DWORD PTR DS:[ESI+D0C] 004A3F85 . 3D 80000000 CMP EAX,80 004A3F8A . 7C 16 JL SHORT 004A3FA2 004A3F8C . 3D 8C000000 CMP EAX,8C 004A3F91 . 7F 0F JG SHORT 004A3FA2 004A3F93 . 3D 87000000 CMP EAX,87 004A3F98 . 74 08 JE SHORT 004A3FA2 004A3F9A . D905 30936000 FLD DWORD PTR DS:[609330] 004A3FA0 . EB 06 JMP SHORT 004A3FA8 004A3FA2 > D905 70136000 FLD DWORD PTR DS:[601370] На скриншоте ниже в оранжевой рамке я выделил "ориентиры" - вызовы функций SetYaw() и UpdatePitchYawRoll() из библиотеки MindPower: Как видите, здесь точно такое же условие, как и в прошлой функции, и нам надо его изменить. Обратите внимание на адреса 0x004A3FA2 и 0x004A3F9A: 0x004A3F9A - код, который выполнится при соблюдении условия (в 1-й ячейке инвентаря находятся крылья); 0x004A3FA2 - код, который выполнится, если условие не соблюдается (в 1-й ячейке инвентаря нет крыльев). Так как новое условие будет занимать больше места, чем оригинальное, идем в Code Cave и записываем его. Я запишу по адресу 0x005FF87A: Далее необходимо задействовать новый код. Идем по адресу 0x004A3F85 и выполняем прыжок на новое условие: jmp <адрес нового условия> ; в данном гайде - 0x005FF87A Идем в игру и убеждаемся, что значок GM встал на свое место: 6. Если вы прикажете персонажу перемещаться, то увидите, что он будет бегать, а не летать. Исправим и это. Найдите код, примерно похожий на этот: 004A44FE |. 0F944424 1C SETE BYTE PTR SS:[ESP+1C] 004A4503 |. 3D 80000000 CMP EAX,80 004A4508 |. 7C 46 JL SHORT 004A4550 004A450A |. 3D 8C000000 CMP EAX,8C 004A450F |. 7F 3F JG SHORT 004A4550 004A4511 |. 3D 87000000 CMP EAX,87 004A4516 |. 74 38 JE SHORT 004A4550 004A4518 |. 83FF 01 CMP EDI,1 004A451B |. 74 05 JE SHORT 004A4522 004A451D |. 83FF 04 CMP EDI,4 004A4520 |. 75 07 JNZ SHORT 004A4529 004A4522 |> BF 2A000000 MOV EDI,2A 004A4527 |. EB 27 JMP SHORT 004A4550 004A4529 |> 83FF 05 CMP EDI,5 004A452C |. 74 05 JE SHORT 004A4533 004A452E |. 83FF 06 CMP EDI,6 004A4531 |. 75 07 JNZ SHORT 004A453A 004A4533 |> BF 2B000000 MOV EDI,2B 004A4538 |. EB 16 JMP SHORT 004A4550 004A453A |> 83FF 02 CMP EDI,2 004A453D |. 75 07 JNZ SHORT 004A4546 004A453F |. BF 2C000000 MOV EDI,2C 004A4544 |. EB 0A JMP SHORT 004A4550 004A4546 |> 83FF 10 CMP EDI,10 004A4549 |. 75 05 JNZ SHORT 004A4550 004A454B |. BF 2D000000 MOV EDI,2D 004A4550 |> 83F9 06 CMP ECX,6 На скриншоте я опять оставил "ориентиры": И опять то же самое условие, которое нужно изменить. В принципе, процесс редактирования условия схож с предыдущим пунктом, только у нас другие адреса для положительного и отрицательного исхода: 0x004A4518 - код, который выполнится при соблюдении условия (в 1-й ячейке инвентаря находятся крылья); 0x004A4550 - код, который выполнится, если условие не соблюдается (в 1-й ячейке инвентаря нет крыльев). Точно так же идем в Code Cave и пишем новое условие. Я напишу по адресу 0x005FF8AD: Заставляем программу использовать новый код, вместо старого. Идем по адресу 0x004A4503 и делаем прыжок: jmp <адрес нового условия> ; в данном гайде - 0x005FF8AD Идем в игру и тестируем: Ура! Теперь персонаж летает на Ангельских крыльях! 7. Сохраните проделанные изменения. В контекстном меню выберите команду Copy to executable -> All modifications. На вопрос "Copy selection to executable file?" отвечайте "Copy all". Появится окошко, просто закрывайте его крестиком. Тут программа задаст новый вопрос типа: "Файл Game.exe был изменен! Сохранить изменения?", отвечаете "Да" и в диалоге выбора файла, вводите название для измененного Game.exe. 8. На этом редактирование Game.exe завершено! Зайдите в игру и убедитесь что все работает как задумано. В результате мы с Вами заставили персонажей летать на Ангельских крыльях с ID 937!
  2. Отключаем сообщения о погоде Привет! В этом гайде я расскажу каким образом можно убрать сообщения о погоде из системы. Работать будем с 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. В итоге мы должны получить следующее: Окно с инструкциями - кодом Далее нужно найти строку с сообщением о погоде. Так как я работаю с 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.
×