An awesome server for people who develop MMORPGs servers! Looking for a group? Or just want to learn something new? Two channels for Russian and English speakers inside. More than hundred people are waiting for you! ;) » Click here to join « [ATTACH]
[ATTACH] PWDEV.RU Вики по PW разработке. Большая часть посвящена межсервисным взаимодействиям на пакетном уровне. Общий список пакетов Версии с одинаковой структурой объединяются в блоки с указанием первой версии, начиная с которой структура последующих идентична. [ATTACH] Декларация пакетов / объектов Зависимости между запрашивающим и ответным пакетами. Присутствуют ссылки на структуры вложенных объектов. Адекватное отображение векторов/массивов с предшествующими полями размеров типа CUInt. Версии с одинаковой структурой объединяются в одну, с указанием в заголовке самих версий (или диапазона). [ATTACH] Предупреждение Декларация пакетов построена на основе парсинга структур из отладочной информации сервисов. В редких случаях возможно несовпадение алгоритма сериализации пакета и его описанной декларации (в частном случае — поля с указателями). Если несмотря на верно описанную структуру пакета, при отправке сервер ругается, необходимо вручную проверить алгоритм сериализации в сервисе: GNET::<название пакета>::marshal TODO 1. Парсинг функций сериализации. 2. Декларация пакетов остальных сервисов всех версий (пока gdeliveryd). Благодарности JoLan — хост и домен, пикча котика int 3 — бесконечные консультации Принимаются различные предложения и замечания в этой теме.
Никто ещё не замутил, так хуле Цветные ники и прочая дичь будет Каналы по написанию софта и хрен знает чего Голосовые каналы самый сок :> https://discord.gg/DaUgs4m
Страшная вещь, но работает прекрасно. Код лучше не смотреть, так как это полнейшее изнасилование и никаким MVC там и близко не пахло. Во избежание инфаркта. Писался в каком-то бреду в начале 2015-го и непонятно зачем. Полностью работоспособно только на 1.5.1 Установка: 1. Распаковать в mysite/cab 2. Зайти на mysite/cab/installer/index.php Проследовать инструкциями. 3. Логиниться по mysite/cab/login.php 4. Если логин пользователя admin, root или test, то работает также переключение на админку. [IMG] [IMG] [IMG] Из няшного: прекрасный XML редактор, который не подыхает на ходу. Везде стоят затычки типа кика персонажа, если его параметры редактируются. На постоянной основе им пользоваться на свой страх и риск. Пользование оставляю бесплатным абсолютно в любых целях. Код разрешено разбирать на потроха и использовать абсолютно в любых целях. Запрещено переделывать копирайты и название без внесения каких-либо изменений ФУНКЦИОНАЛА. UPD: Если инсталлер выдаёт ошибку подключения к API, то перейти по ссылке вручную и, если там кракозябры, изменить кодировку api.php либо в самом installer.php изменить 57 строчку на $api = strpos(file_get_contents($_POST['apiaddr']), "API"); Поливание говном свободное, я в любом случае ничего не буду изменять.
Тянем нагетом ElfSharp Install-Package ELFSharp Подключаем неймспэйсы using ELFSharp.ELF; using ELFSharp.ELF.Sections; using System.IO; Юзаем шаблон, изменяя под себя string path = @"путь до сервиса"; var elf = ELFReader.Load(path); var function = ((ISymbolTable)elf.GetSection(".symtab")).Entries .FirstOrDefault(ent => ent.Type == SymbolType.Function && ent.Name == "сырое название функции" ); if (function == null) throw new Exception("Function does not exists."); int address = int.Parse(function.ToString().Split(new [] { ": 0x" }, StringSplitOptions.None)[1].Split(',')[0], System.Globalization.NumberStyles.HexNumber) - 0x8048000; elf.Dispose(); using (var writer = File.OpenWrite(path)) { writer.Seek(address, SeekOrigin.Begin); writer.WriteByte(байт для записи); } Пример для темы: http://pastebin.com/qT3ebd3Y
Буду признателен, если поможете оттестировать следующие новые команды: queryglobalcontrol importrole <roleidfile> - импорт XML персонажа в базу deletewaitde <backup> calcwaitdel <year> <level>; year > 2007 getsignindata <month> setclspvpflag <flag> getrolelogindata <year> <logicid> ; year > 2007, logicid >= 0 getuserlogindata <year> <logicid> ; year > 2007, logicid >= 0 listfintask <count> ; если <count> отсутствует, по-умолчанию равен 2040 listmnfactioninfo listmnfactionapplyinfo listmndomaininfo clearmnfactionid importmnfactioninfo <mnfactioninfofile> importmnfactionapplyinfo <mnfactionapplyinfofil> importmndomaininfo <mndomaininfofile> setmnfactionstate <state> clearmnfacioncredit listsolochallengerank clearclswaypoint
Как это обычно бывает. Один расказал другому, тот расказал ещё кому-то, в итоге на каком-то шаге появился интересный человек, который бегает по всем серверам и устраивает такую, кхм, "атаку". Суть бага: пакет GetSavedMsg (0xD9) из gdeliveryd можно вызывать хоть сотню раз в секунду через OOG, при этом каждый раз он шлёт 0xD8 в gamedbd и пересылает обратно ответ клиенту, при правильном подборе условий (кол-во сохранённых сообщений в тет-а-тет и скорость отправки пакетов) это заставляет сервер генерировать такие объёмы трафика, что он досит сам себя. Решение — заглушить обработчик пакета GetSavedMsg. Побочный эффект — нельзя будет получить историю беседы тет-а-тет (кто-то этим пользуется?). 1. Открываем gdeliveryd в IDA 2. Переходим в функцию GNET::GetSavedMsg::Process [IMG] [IMG] [IMG] 3. Заменяем push ebp на retn [IMG] Меняем первый байт на C3 [IMG] [IMG] 4. Сохраняем изменения [IMG] [IMG] 5. Загружаем на сервер
Просто ржач как чел пытается заработать на моём эмуле. http://forum.maindev.ru/threads/emu-perfect-world-2-2.20614/ "Номер релиза" убил [IMG] Сяп джосе (@Joslian) за ссылку. P.S. Вообще это какое-то хайло с морга, только нескольким посонам с морга кидал эмуль. P.P.S. Вообще продажа чужих разработок и выставление как своей — не айс, так что я расстроен :C
Позволяет клепать скрипты для редактирования любых данных персонажей как пирожки (код становится в три строчки). Внутри комплект: packets.php + packet_class.php Пример (выкинуть все монетки у персонажа (id 1024) из банка): $data = GetRoleData(1024); $data['storehouse']['money'] = 0; PutRoleData(1024, $data); Пример (умножить у персонажа количество единиц вещи (id 1222) на 100): $data = GetRoleData(1024); foreach ($data['pocket']['items'] as &$value) if($value['id'] == 1222) $value['count'] *= 100; PutRoleData(1024, $data); Achtung! Внутри packets.php изменить значения $host и $port на свои. Спасибки принимаю на R886298849911 или Z152378827400
Итак, давеча наш любименький морг изговняли — сменили шрифт на непонятно что. Т.к. администрация в чатике игнорирует, заюзаем полит. метод — соберем подписи, чтобы в настройках появился тот самый стиль MMORPG-DEVS.RU (серенький такой о_О), но с шрифтом, который был на прошлой неделе. На всякий случай напоминаю, что здесь демократия, а не тоталитаризм. Подписью будет считаться любое сообщение, оставленное ниже. --- добавлено: 9 сен 2015 в 20:13 --- 1
DomainDataClientEditor — редактор клиентского файла domain.data [ATTACH] Зачем? Клиентский domain.data нужен для правильного отображения названий территорий, их границ, и времени начала ТВ. Требования dotNet Framework 4.5 Возможности Переименование территорий Изменение уровня и стоимости территории Редактирование время старта ТВ Экспорт из клиентского domain.data в серверный domain.sev Что отсутствует? Редактирование и отображение границ территорий (трата времени на никому ненужную функцию) [ATTACH] byte magic[4]; int count; struct { wchar_t name[16]; int id; int level; int money; struct { int x; int y; }clanicon[1]<optimize=false>; int pointscount; struct { int x; int y; }point[pointscount]<optimize=false>; int trianglescount; struct { int id1; int id2; int id3; }triangle[trianglescount]<optimize=false>; int neighbourscount; struct { int id; }neighbour[neighbourscount]<optimize=false>; }zone[count]<optimize=false>; int twcount; struct { int day; int hour; int minute; }tw[twcount]<optimize=false>; int maxbattles;
[ATTACH] [ATTACH] Файл для работы: domain.sev VT: https://www.virustotal.com/ru/file/31b6da042382a8903f799c285ab3e516292d8b17b4a630c566b5af60f8dba5a6/analysis/1440674172/
Участники: 1) deadraky, Гоша Контакты: [почищено] 2) fаrmach Контакты: [почищено] Суть претензии: Как-то deadraky попросил меня написать простую панель для ГМов, что, естественно, я как обычно сделал бесплатно (facepalm), но договорились, что никому он это давать не будет и все были рады [IMG] До недавнего времени (https://vk.com/extravagantpwru?w=wall-87746429_735) — какой-то фармач купил его (ну, может это и не его вина). [IMG] А вдруг это я придумал, и не было никаких панелей и вообще продал совсем другой тип? Окей, приступим. Благо, гугл смилостивился и сохранил кеш страниц форума (http://webcache.googleusercontent.com/search?q=cache:iDoxYcXq3eEJ:http://forumextravagant-pw.ru/index.php?threads/%D0%A1%D0%BE%D1%81%D1%82%D0%B0%D0%B2-%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0.148/+deadraky extravagant pw&oe=utf-8&channel=suggest&hl=ru&as_q&spell=1&&ct=clnk). Внезапно, я даже "Системный администратор". [IMG] И, что не удивительно, ссылка на панель осталась прежней — http://extravagant-pw.ru/167a5c15c8bfbf84b7939597cdef16eb/ [IMG] И, благо, никто не потер копирайты. [IMG] Вот такие пироги с котятами. UPD: сейвнул в вебархив https://web.archive.org/web/20150815185126/http://extravagant-pw.ru/167a5c15c8bfbf84b7939597cdef16eb/
[ATTACH] [ATTACH] [ATTACH] Шары никакой не будет и продажи, впрочем, тоже.
Так что, предлагайте свою услугу фикса на всю аудиторию разработчиков. Пример: [ATTACH] Цена: 2500 руб, если gdeliveryd с дебаг инфой. 2700 руб, если gdeliveryd без дебаг инфы. 2000 руб за ограниченный фикс. Скуп: desmondhume777 P.S. Дополнительно до/после возможен тест подобными сообщениями.
Собрана на скорую руку. В архиве два файла chm, по названию разберетесь.
Раз уж пошла такая тема... В 1.5.2 китайцы изменили опкоды, структуру пакетов и т.д. и т.п. Наша цель - сделать скриншот, где мы посреди 1.5.2 стоим. В glinkd/gamesys.conf везде, где встретится 10501, меняем на 10502 Далее надо починить вывод нпсов в округе, а то никто не поверит. Бредем в IDA в ядро по функции S2C::CMD::Make<S2C::INFO::npc_info>::From<packet_raw_wrapper>(packet_raw_wrapper *const wrapper, gnpc *pObject) Суть: "удвоить" выбранное. Т.к. китайцы слепили в очередной раз фигню: первый раз ID указывает на облик, второй раз на его функции (моб, проститутка и т.д.) [ATTACH] Запоминанием, куда сувать будем — 0x080724E3 Бредем по elementdataman::save_data(elementdataman *const this, const char *pathname), смотрим, что она няш мяш, её и будем затирать, все равно нигде не вызывается. [ATTACH] Записываем адрес, где push ebp — 0x0829B974 Переводим jmp 829B974h с учетом позиции, куда будем сувать в опкод E9 8C 94 22 00 Ой вей, пять байт, как раз весь call затрется. Бредем обратно в S2C::CMD::Make<S2C::INFO::npc_info>::From<packet_raw_wrapper>(packet_raw_wrapper *const wrapper, gnpc *pObject) И лепим прыжок вместо вызова [ATTACH] Терь переводим в опкод, учитывая, что будем сувать по 0x0829B974 call 0806922Eh add esp, 4 push eax call 0806922Eh jmp 080724E8h Получаем E8 B5 D8 DC FF 83 C4 04 50 E8 AC D8 DC FF E9 61 6B DD FF И суем это вместо данных той функции, оставшиеся 3 байта от инструкции затираем 0x90, чтобы красиво было. [ATTACH] Загружаем на сервер и заходим через 1.5.2 клиент и ловим ошибку, т.к. опкоды кривые (ну а что? один пакет пофиксили и все? да хрен там, кому надо правьте хештейбл опкодов в глинкд) [ATTACH] Клацаем Esc, становимся няшнее и делаем скриншот [ATTACH]
При отправке в горн выставляется определенный набор смайлов, что мне вообще не понравилось. После изменений ниже в горн-чат будут отправляться смайлы, которые сейчас напялены на персе, но важно учитывать, что при выборе смайлов для отправки в горн вместо них все равно будут отображаться те, что задуманы китайцами (какие-то рыбы, или что это?). Открываем ядро и бредем до gplayer_imp::SendFarCryChat Там смотрим, что у нас какие-то сравнения и прыжки идут. Кому они нахрен нужны? Стираем их и захватываем со всем этим всовывание 6-го набора смайлов в emote_id [ATTACH] Открываем gs hex редактором, находим 80 7D FF 01 75 0F 8B 45 08 0F BE 80 7F 0C 00 00 89 45 EC EB 07 C7 45 EC 06 00 00 00 И заменяем на 90 90 90 90 90 90 8B 45 08 0F BE 80 7F 0C 00 00 89 45 EC 90 90 90 90 90 90 90 90 90 [ATTACH] Загружаем обратно на сервер, запускаем и прыгаем як не москали до потолка. [ATTACH]
Позволяет собирать и читать пакеты на PHP. Слеплен на скорую руку. Приветствуются предложения. Структура: [ATTACH] Пример получения ника перса по его ID (в пакете есть и другая инфа, чтобы было, смотреть структуру GRoleBase), чтобы понять работу класса: struct __cppobj __attribute__((aligned(2))) GRoleBase : Rpc::Data { char version; unsigned int id; Octets name; int race; int cls; unsigned __int8 gender; Octets custom_data; Octets config_data; unsigned int custom_stamp; unsigned __int8 status; int delete_time; int create_time; int lastlogin_time; GRoleForbidVector forbid; Octets help_states; unsigned int spouse; unsigned int userid; Octets cross_data; unsigned __int8 reserved2; unsigned __int8 reserved3; unsigned __int8 reserved4; }; <? include("packet_class.php"); $GetRoleBase = new WritePacket(); $GetRoleBase -> WriteUInt32(-1); // always $GetRoleBase -> WriteUInt32(1024); // userid $GetRoleBase -> Pack(0xBC5); if (!$GetRoleBase -> Send("localhost", 29400)) // send to gamedbd return; $GetRoleBase_Re = new ReadPacket($GetRoleBase); // reading packet from stream $packetinfo = $GetRoleBase_Re -> ReadPacketInfo(); // read opcode and length $GetRoleBase_Re -> ReadUInt32(); // always $GetRoleBase_Re -> ReadUInt32(); // retcode $GetRoleBase_Re -> ReadUByte(); // version $GetRoleBase_Re -> ReadUInt32(); // id echo $GetRoleBase_Re -> ReadUString(); // show rolename ?>
Hallo! [ATTACH] Программа фиксит время ожидания смены статуса джинна до 0 сек. Поиск (корявый) на паттернах, так что, версия не важна (естественно 1.4.1+, ранее джинны не существовали) — фиксит или шлет подальше. Проверялась на 1.4.1, 1.4.5 и 1.5.1
Имена участников (разделяйте запятой).