Это точно пв? Какая версия? Не припомню `gmatrix` и `libskill.so` в оригинале.
Ты сталкивался с этой проблемой на OrigamiPW, и тебе пришлось сменить ос. Не совсем точно. В gs многопоточность устроена правильно, но её очень легко сломать сторонними модификациями, если тщательно не проконтролировать изменения. На OPW падал мир из-за моего личного косяка в реализации одного механизма, что приводило к дедлоку (подчеркну - по моей вине) и дальнейшему падению. ОС к этому отношения не имела и не должна иметь - ошибки в многопоточности = логические ошибки в коде. Я именно поэтому и отреагировал смайликом :^), так как не понял, о каких проблемах идёт речь. А на OPW смена ОС действительно была, но из-за проблем в линке/деливери. P.S. Я так, мимо проходил. Инициатива хорошая - плюс в карму за открытость.
Используйте операционную систему CentOs 7 , она более близка к Fedora Core , благодаря этому вы сможете избежать некоторых багов( например с зависаниями гс , из-за неправильно оформленной многопоточности ). :^)
Жаль Серёгу. Земля пухом
Комментарий касательно конфига: если владелец сервера опечатается в адресах, это может привести к трудноуловимым багам (в лучшем случае - к крашу). Имхо, возможность патчить память напрямую из конфига - это выдача гранаты обезьяне. Возможно, стоило сделать более безопасный интерфейс. P.S. Один конфиг-скрипт - это уже луа-движок? :^)
Всё нижесказанное относится к серверу, т.к. он имеет отладочную информацию и скомпилирован практически без оптимизаций. С клиентом чуть сложнее, но идея та же. Исходники помогают понять существующий скомпилированный код и писать новый. Даже без исходников при желании можно взять любую функцию из ядра, допустим, и переписать на C++. Так что задача внедрить скомпилированный код в в файлы другой версии решается одинаково просто (или сложно) как при наличии исходников, так и без них. Короче, исходники не помогут. А вот на вопрос, как именно внедрять код в существующие бинари, я в двух словах ответить не смогу.
Старый баг. Воспроизведение: прописать в клиентской консоли d 174 Фикс: посмотреть внимательно на код (Ида/сорцы), на выхлоп gdb и немного пошаманить в ядре. Или же найти специалиста. Или поискать гайды по фиксу на этом или соседних форумах по ключевому слову "174". P.S. Игрока 8944 можно банить
Полагаю данный редактор? С учётом предыдущей темы ТС про инжекты, его реализация основана на динамической библиотеке, что и написано в первом посте. А реализация на твоём скрине с копирайтами Гоши, который предпочитает патчить ядро напрямую. Напрашивается очевидный вывод, что это две совершенно разные реализации одного и того же.
название темы надо бы расписать немного, а то такое не понятное Дополнил так еще вопрос, как с ней работать с сервисом glinkd , ведь там нет дебаг инфы, можно пример? Библиотека не избавляет от необходимости уметь реверсить. Чтобы её использовать, необходимо знать адрес и сигнатуру функции, которая хукается. С отладочной информацией всё просто — нашли функцию по имени, взяли адрес и сигнатуру, вытащили для удобства все типы и начали писать код. Если отладочной информации нет, то найти функцию — это лишь верхушка айсберга. Даже когда функция найдена, сигнатура восстановлена (хотя бы частично, с точностью до "эквивалентных" типов) и хук активирован, ты всё ещё не знаешь, что значат её аргументы. Так что хукать нужно в тот момент, когда ты понимаешь, что и зачем ты делаешь. Впрочем, можно хукать и случайные функции, логгировать их аргументы и таким образом анализировать поведение — это удобно.
rcmp — библиотека для хуков и работы с памятью Создана с целью упростить жизнь C++ разработчика, который пишет читы/библиотеки/моды/плагины. Для её использования нужно: Знать современный C++ и уметь на нём писать (хеллоу-ворлды и код на "C с классами" не считаются) Иметь опыт написания библиотек, которые внедряются в чужой процесс (через инжект, LD_PRELOAD или какую-либо другую технику) Причины создания библиотеки при наличии множества альтернатив подробно описаны в README. Если кратко — перемешивание ассемблера и C++ чревато багами, ухудшает качество кодовой базы и распыляет внимание разработчика, в то время как библиотека избавляет от низкоуровневой каши. Благодаря rcmp, за последние несколько лет я не написал ни строчки на ассемблере, что не может не радовать. На этом вступление окончено, перейдём к практике. Подключение к проекту Предполагая, что CMake проект вашей библиотеки my-cool-library уже создан и rcmp лежит в external/rcmp: add_subdirectory(external/rcmp) target_link_libraries(my-cool-library PRIVATE rcmp) Примеры использования Так как единственная полуживая игра на этом форуме - это PW, то и примеры будут по ней. В примерах используется ядро версии 1.5.5. С тем же успехом можно работать с любым другим сервисом или клиентской частью. Сами примеры немного надуманы, потому что серьезные вещи не реализуются в несколько строк кода, но суть уловить можно. Баг "d 174" заключается в том, что игрок отправляет на сервер пакет 174 с пустым телом, из-за чего ядро благополучно падает. Фикс элементарный: находим в ядре функцию DispatchCommand класса gplayer_imp. Её адрес - 0x0809472A Сигнатура - int(gplayer_imp*, int, const void*, size_t). Эта функция отвечает за приём клиентских пакетов. Пишем код для её перехвата: struct gplayer_imp; // forward declaration // Для хука необходимо указать адрес оригинальной функции, её сигнатуру и передать сам "хук" // Хук — это лямбда, которая имеет на один аргумент больше, чем оригинальная функция // Первый аргумент лямбды — `auto original` — указатель на оригинальную функцию rcmp::hook_function<0x0809472A, int(gplayer_imp*, int, const void*, size_t)>([](auto original, gplayer_imp* self, int cmd_type, const void* buf, size_t size) { // детектируем кривой пакет if (cmd_type == 174 && size < 6) { // можно просто залоггировать или даже забанить игрока за такую наглость // псевдокод логгирования: // logger().trace("Hacker alert! Player ID = {}", self->_parent->ID.id); // оригинальную функцию не вызываем, просто выходим return 0; } // можно также логгировать вообще все пакеты от игрока, почему бы и нет? (псевдокод) // logger().trace("id={}, packet={}, len={}", self->_parent->ID.id, cmd_type, size); // пакет валидный, вызываем оригинальную функцию return original(self, cmd_type, buf, size); }); Возьмём произвольный скилл и поменяем его время перезарядки. Сделаем его случайным. // Выбор пал на скилл с ID = 111 // Функция: GNET::Skill111Stub::GetCoolingtime // Адрес: 0x0897F4E6 // Сигнатура: int __cdecl GNET::Skill111Stub::GetCoolingtime(const GNET::Skill111Stub *const this, GNET::Skill *skill) // в сигнатурах можно заменить все указатели на указатели на void, если лень объявлять типы rcmp::hook_function<0x0897F4E6, int(const void*, void*)>([](auto...) { return rand() % 5000; // от нуля до пяти секунд }); // Функция: item::Use // Адрес: 0x080F6DA4 // Сигнатура: int __cdecl item::Use(item *const this, item::LOCATION l, int index, gactive_imp *obj, size_t count) // Пример продвинутый, но неполный, т.к. предполагается наличие объявленных ранее классов rcmp::hook_function<0x080F6DA4, int(item*, item::LOCATION, int, gactive_imp*, size_t)>([](auto original, item* self, item::LOCATION loc, int index, gactive_imp* obj, size_t count) { item_body* body = self->body; // предмета нет в ячейке, нечего использовать if (body == nullptr) return 0; // прописываем логику для "своих" предметов // предмет с id = 1000 будет телепортировать игрока в рандомную точку на высоте 50 if (body->_tid == 1000) { static_cast<gplayer_imp*>(obj)->LongJump(A3DVECTOR(rand() % 1000 - 500, 50, rand() % 1000 - 500)); return 1; // возвращаемое значение - сколько предметов было потрачено } // предмет с id = 2000 будет писать в 10-й канал чата от имени игрока, где он находится else if (body->_tid == 2000) { const A3DVECTOR& pos = obj->_parent->pos; char message[100]; std::sprintf(message, "I'm at: %f, %f, %f", pos.x, pos.y, pos.z); static_cast<gplayer_imp*>(obj)->Say(message, 10); return 0; // предмет не тратится при использовании, почему бы и нет? } // на этом моя фантазия кончилась, поэтому для остальных предметов никаких кастомных эффектов не будет return original(self, loc, index, obj, count); }); Из примеров видно, что можно перехватывать вообще любые функции, прописывать произвольную свою логику вместо оригинальной или в дополнение к ней. Всё ограничивается лишь фантазией разработчика. Напишите в комментариях, каких примеров не хватает — допишу. Ссылка на библиотеку: [IMG] Требования: C++17, Windows/Linux, x86/x86-64. P.S. "Боевой" пример использования библиотеки — Replay Mod для ныне популярной игры Among Us
С какой версии есть такая фича? Видел её на 1.5.3+. Думаю, была и раньше (~1.4.8+), но я не изучал этот вопрос
В PW есть функционал, позволяющий логиниться по временному токену. Остаётся лишь правильным образом настроить клиент и сервер.
Здраствуйте. Я, Кирилл. Хотел бы чтобы вы сделали игру, 3Д-экшон суть такова...
Переведу часть мысли Миши для ТСа: как получилось, что 3 опытных разработчика, куратор и прочие согласились работать за 10к на всех? Даже если допустить месяц затраченного времени, то это по.. 2000 на человека? А разработчики точно опытные? И просто из любопытства, что входит в обязанности разработчика? Без шуток, не слежу за сферой МК, поэтому интересно, кто там считается разработчиком.
Нашёл сайт, который выполняет те же функции. Я наоборот хотел сказать, что не имею ничего против, но решать тебе :)
Со скриптом?)
Есть смысл оставить контакты для связи
Не вижу причин для нахождения в БЛе. Много лет работаю с человеком, не без заскоков, но в финансовом плане проблем никаких не было. Впрочем, решающее слово за пострадавшими, конечно.
[IMG] AutoAngel — кроссплатформенная open-source библиотека, написанная на языке C++ (имеются биндинги для Python и lua), которая даёт возможность автоматически работать с файлами различных форматов движка Angelica3D. Многим в нашей сфере не раз приходила в голову идея об автоматизации тех или иных действий при работе с файлами. Да, нынче существуют крайне мощные редакторы практически для всех известных форматов. Разработчики трудятся над ними, чтобы предоставить пользователю красивый и удобный интерфейс, ускорив и упростив работу над выпуском обновлений. Но ни один редактор не даёт возможности полноценно обрабатывать файлы на уровне скриптов. Когда я в очередной раз понял, что мне придётся совершить множество одних и тех же действий (добавить 42 питомца, 42 яйца, 42 рецепта со сложной иерархией, 42 описания, 42 скилла и т.д.), тогда и пришла мысль о создании библиотеки AutoAngel. AutoAngel позволяет писать короткие, удобные и понятные утилиты и скрипты на языках Python и lua без ущерба производительности (ядро библиотеки на C++). Библиотека является достаточно молодой, но уже даёт достаточно широкие возможности по автоматизации рутинных действий. Поддерживаемые форматы: elements.data — чтение, модификация, запись. Поддержка любых версий, всех листов (основана на конфигах sELedit). pck архивы — чтение. Стандартные ключи, без поддержки pkx. Примеры использования: Утилита сравнения elements.data (python, lua) - показывает, чем отличаются два elements.data (удаления/добавления/изменения элементов). Утилита сравнения pck архивов (python, lua) - показывает, чем отличаются два архива (удаления/добавления/изменения элементов). Симулятор лута (python, lua) - показывает средний и суммарный лут с моба за N попыток его убийства. Генератор описания шахт (python, lua) - выводит описание содержимого шахт/сундуков с иконками предметов из ЛК для форума. Исходный код и инструкции по сборке: [IMG] Поддерживаемые платформы: Windows, Linux Поддерживаемые языки: C++, Python, lua Планы на будущее: Подробная документация pck+pkx, сохранение архивов, шифрование. Больше форматов Больше примеров
./gs gs01 gs.conf gmserver.conf gsalias.conf is27 is22 is21 is26 is05 is31 is10
Имена участников (разделяйте запятой).