Защита GM команд
Привет!
Предположим, Ваш сервер был взломан и злоумышленник получил доступ к GM-аккаунту. В данной статье я расскажу как обезопасить Ваш сервер от его действий, то есть сделать взлом бессмысленным.
Внимание! Особое внимание уделите командам &lua и &lua_all. С их помощью злоумышленник может получить контроль над машиной, где запущен GameServer.exe, со всеми вытекающими из этого последствиями: кража Вашей сборки либо её удаление, вайп базы данных, потеря доступа к машине и так далее. Обсуждение этих команд проходит в данной теме: Все прелести команды &lua.
Для обеспечения безопасности Вашего сервера, не используйте имена из примеров данной статьи на своем сервере!
Способ №1. Нет GM-команд - нет проблем!
Если Вы редко или вообще не пользуетесь GM-командами, то имеет смысл их отключить. Редактировать персонажей и выдавать предметы можно с помощью специальных программ или вручную в базе данных, когда персонаж не в игре.
Чтобы отключить GM-команды нужно внести изменения в GameServer.exe.
Версия | Размер (КБ) | Адрес
--------+-------------+------------
1.36 | 2 040 | 0x000DE1E8
1.38 | 2 088 | 0x000E6852
2.0 | 3 000 | 0x00161349
Откройте GameServer.exe в любом HEX редакторе и перейдите по адресу из таблицы. Я буду работать с 1.38 GameServer.exe в редакторе HxD.
Замените 23 байта начиная с этого адреса на 0x90
Сохраните проделанные изменения и убедитесь, что в игре не работают GM-команды.
Способ №2. Переименовывание GM-команд.
Злоумышленник не сможет воспользоваться GM-командами, если он не будет знать их названия. Итак, Вам придется переименовать каждую команду.
Чтобы изменить название GM-команды, откройте GameServer.exe в любом HEX-редакторе. Затем найдите GM-команду и измените ее название. Длина нового названия должна быть такой же, как и длина старого.
Для примера, переименуем команду &make в команду &give. Обратите внимание, что длины строк "make" и "give" равны (по 4 символа). Открываем GameServer.exe в HEX-редакторе и ищем строку "make":
Вам будут попадаться строки, которые содержат в себе подстроку "make" (например, "MakeItem", "make failed!", "GMmakeLog" и др.). Игнорируйте их и продолжайте поиск. Когда Вы найдете нужную строку, Вы увидите рядом названия других GM-команд:
Заменяем на "give":
Сохраните проделанные изменения. Повторите данные действия для каждой GM-команды.
Список адресов GM-команд
GameServer.exe версии 1.36 (2 040 КБ):
GameServer.exe версии 1.38 (2 088 КБ):
GameServer.exe версии 2.4 (3 000 КБ):
Способ N3. GameServer.exe с функциями HandleChat(), GetGmLv() и SetGmLv()
Для реализации данного способа Вам потребуется модифицированный GameServer.exe с функциями HandleChat(), GetGmLv() и SetGmLv().
Функция HandleChat(userdata role, string message) срабатывает, когда игрок пишет сообщение в местный чат. Так как GM-команды отправляются также в местный чат, Вы можете написать скрипт, который будет контролировать выполнение команд.
Например, Вы можете сделать так, чтобы GM-команды срабатывали только при условии, что их отправляет персонаж с определенным именем или ID. Плюс ко всему, можно сделать чтобы этот персонаж должен еще состоять в определенной гильдии, в которую входят только администраторы и GM Вашего сервера. Все зависит от Вашей фантазии.
Чтобы узнать, что персонаж является GM, используйте функцию GetGmLv(userdata role).
С помощью функции SetGmLv(userdata role, number level) можно изменять GM-уровень аккаунта, к которому прикреплен персонаж. Например, в той же функции HandleChat() можно сбрасывать GM-уровень аккаунта в 0, если персонаж не прошел проверку.
Реализуем простую систему контроля GM-команд:
1) GM-команды могут выполнять только персонажи с именами: "V3ct0r", "pkodev" и "Administrator";
2) В случае, если персонаж GM и он не прошел проверку, сбросить GM-уровень до 0, кикнуть персонажа с сервера и отправить сообщение администратору в консоль GameServer.exe.
Для начала создадим в файле variable.lua массив с именами персонажей, которые могут использовать GM-команды. Назовем его PlayerCanUseCmd:
PlayerCanUseCmd = {}
PlayerCanUseCmd["V3ct0r"] = 1
PlayerCanUseCmd["pkodev"] = 1
PlayerCanUseCmd["Administrator"] = 1
Затем напишем скрипт для функции HandleChat() в файле functions.lua:
-- Обработчик местного чата
function HandleChat(role, message)
-- Проверяем что персонаж GM
if (GetGmLv(role) > 0) then
-- Проверяем что персонаж отправил GM-команду
if (string.find(message, "&") == 1) then
-- Проверяем имя персонажа
local cha_name = GetChaDefaultName(role)
if (PlayerCanUseCmd[cha_name] ~= nil) then
-- Персонаж может использовать GM-команду
return 1
end
-- Персонаж не может использовать GM-команду
-- Сбрасываем GM-уровень до 0
SetGmLv(role, 0)
-- Кикаем персонажа с сервера
KickCha(role)
-- Пишем сообщение администратору в консоль сервера
print("Player [" .. cha_name .."] trying to use GM command!")
-- Запрещаем выполнение GM-команды
return 0
end
end
return 1
end
Для кика персонажей нам понадобится функция KickCha(), добавьте ее также в functions.lua:
function KickCha(character)
local pkt = GetPacket()
WriteCmd(pkt, 1505)
SendPacket(character,pkt)
end
Тема открыта для обсуждения. Пишите свои вопросы и идеи в комментариях!