Есесно получится, это будет выглядеть примерно так: startSound(string.Format("./music/{0}.mp3",npc_id)); // аргумент - путь к файлу музыки. Ну название музыки, которая будет проигрываться, - айди моба. Остаётся переписать на асм, найти функцию проигрывания, подредактировать её, много раз сфейлиться, поматериться и забить на это дело. %картинка из поста Роймайка%
Ничего сложного. Отредактировать ядро при желании можно. Тем более всё намного проще, чем прокси с Коши. Просто добавить проверку на попадание в круг (самое простое) в плоскости с учётом гм прав. И проверку можно добавить в любую частовызываемую функцию. Почему нельзя для тестов отдельную локацию (зону) с телепортом туда?
Если и делать квест, то будут проблемы, ибо за выполнение квеста (если не ошибаюсь) отвечает клиент. Вырезать функцию выполнения квеста - и гм зона не помеха. Хотя могу путать с квестами на сундуки. По теме - можно в ядре сделать проверку, но не очень удобно это
Правильно делают, что у тебя тестят :D В пакетах нет ничего уникального, это обычные пакеты чата. Иероглифы тут ни при чём. Клиент просто не выдерживает и крашится.
Именно так. Ядро будет работать также, как и не очищенное.
Ну вы и извращенцы. ООГ.. А давайте свой клиент напишем для ведения трансляций! Или вообще прогу, которая вырисовывает клиент в нужном месте! Если серьёзно, то тупо ставьте открытое окно клиента на каком-нибудь сервачке и всё. Тоже мне, проблему нашли. Ну как сказать, стримить одно окно - это уже затратно. 50 МБ инет + от 4гб оперативы + хороший процессор + электроэнергия В любом случае, написать софт будет более затратно
Ну вы и извращенцы. ООГ.. А давайте свой клиент напишем для ведения трансляций! Или вообще прогу, которая вырисовывает клиент в нужном месте! Если серьёзно, то тупо ставьте открытое окно клиента на каком-нибудь сервачке и всё. Тоже мне, проблему нашли.
Айпи сервера - 188.138.101.60 / cp.violendpw.ru Это просто ничего не значащая информация.
Патчи обычно делают для универсальности. Они удобны тогда, когда разные версии отличаются только парой адресов, а тут на разных версиях множество отличий. Да и не для шары это дело ;)
[IMG]
Можно, править ядро. Всего-то добавить проверку флага "в бою" в обработчике команд снять/одеть предмет. Для многих "всего-то" превращается в мучительные недели изучения ассемблера и последующий бабах. P.S. Могу запилить
В гм панели же есть какие-то баны, ограничивающие то ли сделки, то ли еще что-то. Сам не юзал. Еще возможно, что какая-то дебаг команда? Ты - админ на этом сервере или это твой перс на каком-то сервере?
А можно для ленивых сразу для 1024 выложить ядро ? С дебаг символами Жирно будет, пусть люди учат асм :D
Добрый день. У меня вот такой вопрос: Можно ли например дебаг привязать не ко всем GM, а к персонажу с отдельным идом, или к отдельному аккаунту. Как это вот можно реализовать, где копать, и как примерно должна выглядеть функция ? Заранее спасибо. Можно привязать хоть по айпи/лвлу/клану/полу. Но тут уже не обойтись без непосредственной отладки сервера для нахождения параметров, по которым привязываем. И, конечно же, нужно знать ассемблер. Привязка по айди: находим смещение до айди перса (отладка/изучение функций в иде), меняем код на mov eax, [ebp+8] cmp [eax+123], 456 (где 123 - смещение, 456 - айди) jne %выход%
Описывай предь,пожалуйста до "ввода" своих таблиц и тд и указывай версию,на которой делал,ибо тестил на 1.5.0 : По поводу таблиц - у меня подредактированы только аргументы функции, это не должно влиять на смысл. Функция в любом случае есть (GLog::log()), её можно затереть. Версия 1.5.1, забыл дописать. 0x0811c8DA Это адрес строчки вызова функции, сама функция находится в [IMG] (0x811C8C4 - 0x811C8E1) 0x08122523 konec Это вычислено верно. Заходим в функцию GMCommandHandler и огорчаемся: [IMG] Смещение стало не 0x48, а 0x44 (пкм - hexadecimal), поэтому 6-й байт в коде изменится с 48 на 44. D48C4 - стираем 30 байт. Дописываем байты, вычисляем разность (у меня получилась 0x5C52). Результат: [IMG] Сохраняем и для надежности/проверки суём в иду. (Проанализировалось не до конца) [IMG] Зеленым указаны начальные команды, которые были перед/после затираемой функции (они не изменились, значит мы ничего не сломали), между ними наш код. Прыжок переходит на верный адрес. https://yadi.sk/d/BnY5l5qjZwF7f - пофикшенное ядро Для редактирования asm кода, рекомендую использовать http://hte.sourceforge.net/ Спасибо, попробую. По поводу вырезки "лишнего" кода, лучше делать по другому: Я практиковал такой способ, когда редактировал клиент, но тут функция была мелкая, а джампом всё равно пришлось бы затереть 5 байт. Когда-нибудь опишу в гайдах и такой вариант.
Мне потребовалось: IDA + Hex Rays, хекс редактор, Cheat Engine и немного знаний асма. Ахтунг! Все числа в статье - в 16-ричной системе счисления. Где-то есть 0x, где-то нет. Статья будет состоять из трёх частей: Итак, нужно запретить доступ к дебаг командам всем, кроме ГМов. Как? У меня не было опыта редактирования ядра, но я предположил, что нужно глянуть функции, которые отвечают за управление Debug командами (лвл ап - d 2000 и подобные) и GM командами (телепорт гма - d 19 1 1 1 и подобные). Открываем ядро IDA'ой, ждём полного анализа. Слева список функций: [IMG] Жмём Alt-T, вбиваем в поиск Debug. С помощью Ctrl-T можно переключать на следующий результат поиска. Через минуту я нашёл интересные функции (они были рядом): [IMG] Название говорит за себя. Выбираем GMCommandHandler, F5 (генерация псевдокода). Видим (у меня переименованы некоторые переменные): [IMG] Строчка if ( (param1 <= 200 || param1 > 222) && param1 != 19 ) палит всю функцию. Я вспомнил, что для гма доступны как раз команды d 19, d 201, d 202, .., d 222. Видно, что идёт запись в лог, если параметр неверный. Значит мы на верном пути. Смотрим дальше. Должна быть проверка на то, ГМ ли это вызывает. Тут одно из двух: либо проверка идёт перед вызовом функции (где-то в дебрях кода), либо внутри функции. Я безуспешно проверил все функции CheckGMPrivilege, HasGMPrivilege, которых оказалось полно в ядре, но ни одна не вызывалась при использовании этих команд. (Десктопная убунту + IDA, приаттаченная к процессу. Спасибо Максимиану за подсказку). Всё оказалось проще. Сразу после записи в лог идёт строчка if ( *(a1 + 0x48) ) Очевидно, что a1 - указатель на структуру перса, который юзает команду d num, а +0x48 - это смещение до GM флага или структуры с информацией о GM правах. В любом случае, если это значение 0, то идёт выход из функции. В асм коде эта проверка выглядит так: [IMG] Если 0, то прыжок не идёт (jnz - jump if not zero). Записали, назовём это IsCharGM() (просто для себя) Переходим к функции DebugCommandHandler, F5. Начало у неё такое: [IMG] Опять же, переменные переименованы, так как я вводил свои структуры. Красным выделена строчка, которая вызывает функцию GLog::log(), которая записывает куда-то что-то. Вроде и полезная.. Но нам ведь надо всунуть нашу найденную проверку IsCharGM(), а для неё еще место нужно. Поэтому я принял решение стереть эту функцию нафиг (ВОТ ЭТО ДЫРА!!1) Смотрим асм код: [IMG] Зеленое - махинации с указателями на локальный/глобальный стек, трогать нельзя ни в коем случае. Красным - функция GLog::log(). Смотрим адрес начала этой функции: 0x812527E и конец: 0x812529C минус один == 812529B. Аргументы функции DebugCommandHandler: [IMG] По счастливой случайности, первый параметр оказался как раз тем самым указателем на структуру перса, вызывающего команду (поверьте на слово, проверил бряками в иде). Это очень сильно упрощает задачу. Почему? Об этом во второй части. Что мы знаем? а) У нас есть 0x1E (30 штук) байт для проверки гм прав у перса (0x1E - вместо затёртой, в будущем, функции) б) В функцию DebugCommandHandler передаётся указатель на структуру перса Как должен примерно выглядеть код проверки? На си: if (*(a1+0x48)) return 0; На асме: mov eax, [ebp+8h] ; в регистр eax суём наш указатель на структуру. Он находится в [ebp+8], потому что http://i.imgur.com/h6Exx0z.png cmp [eax+48h], 00 ; сравниваем значение по адресу eax+48 с нулём jz %адрес выхода с функции% (jz %адрес% можно заменить на mov eax, %адрес% / jz eax, но мой "генератор" опкода отказался работать с "jz %регистр%") Теперь поэтапно: а) Адрес выхода с функции? Листаем функцию в самый низ, видим там: [IMG] Зеленое - адрес выхода с функции. 0x812B8D1 б) Теперь нужно этот асм-код преобразовать в опкод. Я делал это с помощью Cheat Engine. На первый взгляд нет проблем, просто преобразовать 3 команды в байт-код. Ан нет! Команда jz %ptr% на самом деле опознаётся компьютером, как jz +N, где N - разность между адресом назначения и адресом команды, следующей сразу за прыжком. Вот такая хитрая относительная адресная арифметика. Поэтому: I) Переводим первые две команды в опкод: [IMG] 8B 45 08 83 78 48 00 - 7 байт в сумме II) Возвращаемся к записанным ранее адресам: 0x812527E (адрес начала функции, которая будет стёрта). Прибавляем 7 байт. 0x812527E+7 == 0x8125285. Значит по адресу 0x8125285 будет лежать команда jz +N. Она занимает 6 байт (опкод самого jz + 4 байта на N). Значит 0x8125285 + 6 == 0x812528B. III) Теперь вычитаем из конечного адрес (выхода с функции 0x812B8D1) полученный адрес (0x812528B) == 0x6646. Вот и всё. Теперь спокойно переводим команду jz +6646 в байты: 0F 84 46 66 00 00 Весь код: 8B 45 08 83 78 48 00 0F 84 46 66 00 00 Открываем ядро в хекс редакторе (мой любимый - 010 Editor). В файле все адреса смещены на 0x8048000 относительно того, что в памяти, поэтому берём адрес функции для затирания: 812527E и вычитаем 8048000, получаем DD27E. Переходим по этому адресу (Ctrl-G), видим [IMG] Затираем 0x1E (30 в десятичной) байт. Не нулями, а байтами по 90 (nop - no operation). Вообще, код лучше не затирать нулями никогда. [IMG] Затёрли, теперь вбиваем наш код: [IMG] Сохраняем. Поздравляю, вы великолепны. 1. Скорее всего (это никак не меняет сути гайда), там не указатель на структуру персонажа, а указатель на объект. И функции - это просто методы класса, которые выполняют действия над этим объектом. С другой стороны, обычно указатель на объект передаётся в ecx, поэтому могу и ошибаться. 2. Дыр быть не может. Если вы прочитали гайд полностью, это должно быть очевидно. Если игрок не может использовать ГМ команды, то он не может использовать дебаг команды. 3. Минус - не будет функции, которая что-то там логгирует. 4. Возможно, я индус, и можно было сделать всё проще, но я привык редактировать код, а не копаться в каких-нибудь xml и искать нужные параметры. 5. Я не описал (и не буду) моменты, как я добывал значения переменных с помощью бряков в ИДЕ, иначе это не влезет в одно сообщение. Да и в гугле полно информации на эту тему. Материал можно копировать и использовать на своё усмотрение, но указание автора (int 3) приветствуется. Если есть вопросы - задавайте, с радостью отвечу.
Стимул, чтобы не ленились люди :) не ленивые уже запилил, прошу не выкладывать гайд Уже поздно. Те, кому приспичит, сравнят ядра и поменяют у себя байты. А опыт и информация - это очень ценно. Инструкций в гайде будет достаточно, но всё равно понадобится приложить некоторые усилия.
Интересно, запили статью :) И количество дыр Увы, всё не без дыр. Самая страшная дыра: можно выдать себе гмку (через pma/iweb) и нагло пользоваться дебагом. И желательно выложить полное ядро , а не очищенное. Очищенное выкладывалось как раз с учётом того, что позже будет гайд, и те, кому надо, отредактируют своё ядро. Стимул, чтобы не ленились люди :)
С этим ядром дебаг команды смогут использовать только GM'ы. Качаем gs Заливаем в папку /home/gamed Выдаём права Включаем дебаг-мод ... PROFIT!!1 Скачать Запрещено копировать материал/лепить патчи без разрешения автора. Если кому-нибудь будет интересно, запилю статью. (c) int 3
Если честно, ничего не понял. Этим же вродь нельзя исправить мою проблему? Это так, пища для размышлений. Но разрешается создавать клан только с 5. Наткнулся на проблему с кланами, а именно - Максимальная длина названия клана. о_О В любом случае, с клиентской частью покончили.
Имена участников (разделяйте запятой).