Jump to content

Recommended Posts

Защита 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.

bb3f6c4bab93t.jpg

 

Замените 23 байта начиная с этого адреса на 0x90

0d22451435eet.jpg

 

Сохраните проделанные изменения и убедитесь, что в игре не работают GM-команды.

 

Способ №2. Переименовывание GM-команд.

Злоумышленник не сможет воспользоваться GM-командами, если он не будет знать их названия. Итак, Вам придется переименовать каждую команду.

 

Чтобы изменить название GM-команды, откройте GameServer.exe в любом HEX-редакторе. Затем найдите GM-команду и измените ее название. Длина нового названия должна быть такой же, как и длина старого.

 

Для примера, переименуем команду &make в команду &give. Обратите внимание, что длины строк "make" и "give" равны (по 4 символа). Открываем GameServer.exe в HEX-редакторе и ищем строку "make":

1be7554408d7.jpg

 

Вам будут попадаться строки, которые содержат в себе подстроку "make" (например, "MakeItem", "make failed!", "GMmakeLog" и др.). Игнорируйте их и продолжайте поиск. Когда Вы найдете нужную строку, Вы увидите рядом названия других GM-команд:

873d40f811c7t.jpg

 

Заменяем на "give":

1f3f52ff40dbt.jpg

 

Сохраните проделанные изменения. Повторите данные действия для каждой GM-команды.

 

Список адресов GM-команд

GameServer.exe версии 1.36 (2 040 КБ):

Скрытый текст

(0x001A7018) lua
(0x001BD05C) itemvalid
(0x001BD158) addkb
(0x001BD160) setpinginfo
(0x001BD16C) senddata
(0x001BD18C) getping
(0x001BD1A4) setping
(0x001BD1AC) lua_all
(0x001BD1C8) delitem
(0x001BD248) skill
(0x001BD250) forge
(0x001BD280) seeattr
(0x001BD288) light
(0x001BD290) itemattr
(0x001BD310) attr
(0x001BD3E4) make
(0x001BD404) setcesslevel
(0x001BD434) addcess
(0x001BD470) addsailexp
(0x001BD4A8) addlifeexp
(0x001BD4B4) addexp
(0x001BD4BC) addmoney
(0x001BD4E8) kill
(0x001BD50C) summonex
(0x001BD534) summon
(0x001BD550) pet
(0x001BD56C) isblock
(0x001BD5B4) misclear
(0x001BD5C0) missdk
(0x001BD60C) delmission
(0x001BD65C) clearmission
(0x001BD6C0) addmission
(0x001BD71C) clearfalg
(0x001BD784) setflag
(0x001BD7DC) clearrecord
(0x001BD840) setrecord
(0x001BD84C) reload_ai
(0x001BD858) misreload
(0x001BD864) harmlog=0
(0x001BD870) harmlog=1
(0x001BD8B0) updateall
(0x001BD8BC) gamesvrstop
(0x001BD8C8) call
(0x001BD8D0) qitem
(0x001BD8D8) qcha
(0x001BD8E0) relive
(0x001BD92C) reload
(0x001BD934) kick
(0x001BD93C) goto
(0x001BD944) unhide
(0x001BD94C) hide
(0x001BD954) notice
(0x001BD998) move
(0x001BD8E8) reload monsterrefresh
(0x001BD8F8) reload iteminfo
(0x001BD904) reload skillinfo
(0x001BD910) reload characterinfo
(0x001BD920) reload alltable

GameServer.exe версии 1.38 (2 088 КБ):

Скрытый текст

(0x001B4114) lua
(0x001C7818) itemvalid
(0x001C78A4) addkb
(0x001C78AC) setpinginfo
(0x001C78B8) senddata
(0x001C78E4) getping
(0x001C790C) setping
(0x001C7914) lua_all
(0x001C793C) delitem
(0x001C7964) skill
(0x001C796C) forge
(0x001C7994) seeattr
(0x001C799C) light
(0x001C79A4) itemattr
(0x001C79F0) attr
(0x001C7AC4) make
(0x001C7AEC) setcesslevel
(0x001C7B1C) addcess
(0x001C7B44) addsailexp
(0x001C7B70) addlifeexp
(0x001C7B7C) addexp
(0x001C7BA4) addmoney
(0x001C7BD0) kill
(0x001C7BF8) summonex
(0x001C7C24) summon
(0x001C7C4C) pet
(0x001C7C90) isblock
(0x001C7CB8) misclear
(0x001C7CC4) missdk
(0x001C7D0C) delmission
(0x001C7D58) clearmission
(0x001C7DA8) addmission
(0x001C7DF4) clearfalg
(0x001C7E40) setflag
(0x001C7E88) clearrecord
(0x001C7EB4) setrecord
(0x001C7EC0) reload_ai
(0x001C7ECC) misreload
(0x001C7ED8) harmlog=0
(0x001C7EE4) harmlog=1
(0x001C7F10) updateall
(0x001C7F1C) gamesvrstop
(0x001C7F28) call
(0x001C7F30) qitem
(0x001C7F38) qcha
(0x001C7F40) relive
(0x001C7F8C) reload
(0x001C7F94) kick
(0x001C7F9C) goto
(0x001C7FA4) unhide
(0x001C7FAC) hide
(0x001C7FB4) notice
(0x001C7FF8) move
(0x001C7F48) reload monsterrefresh
(0x001C7F58) reload iteminfo
(0x001C7F64) reload skillinfo
(0x001C7F70) reload characterinfo
(0x001C7F80) reload alltable

GameServer.exe версии 2.4 (3 000 КБ):

Скрытый текст

(0x0027069C) lua
(0x002709C8) opencrystal
(0x00270E4C) CloseMapEntry
(0x0028E9F0) closecrystal
(0x0028EA00) CheckMapState
(0x0028EA10) CloseMap
(0x0028EA1C) OpenMap
(0x0028EA24) OpenMapEntry
(0x0028EA34) playsave
(0x0028EA80) itemvalid
(0x0028EB0C) addkb
(0x0028EB14) setpinginfo
(0x0028EB20) senddata
(0x0028EB4C) getping
(0x0028EB74) setping
(0x0028EB7C) lua_all
(0x0028EBA4) delitem
(0x0028EBCC) skill
(0x0028EBD4) forge
(0x0028EBFC) seeattr
(0x0028EC04) light
(0x0028EC0C) itemattr
(0x0028EC58) attr
(0x0028ED2C) make
(0x0028ED54) setcesslevel
(0x0028ED84) addcess
(0x0028EDAC) addsailexp
(0x0028EDD8) addlifeexp
(0x0028EDE4) addexp
(0x0028EDEC) addmoney
(0x0028EE18) kill
(0x0028EE40) summonex
(0x0028EE6C) summon
(0x0028EE94) pet
(0x0028EED8) isblock
(0x0028EF00) misclear
(0x0028EF0C) missdk
(0x0028EF54) delmission
(0x0028EFA0) clearmission
(0x0028EFF0) addmission
(0x0028F03C) clearfalg
(0x0028F088) setflag
(0x0028F0D0) clearrecord
(0x0028F0FC) setrecord
(0x0028F108) reload_ai
(0x0028F114) misreload
(0x0028F120) harmlog=0
(0x0028F12C) harmlog=1
(0x0028F158) updateall
(0x0028F164) gamesvrstop
(0x0028F170) call
(0x0028F178) qitem
(0x0028F180) qcha
(0x0028F188) relive
(0x0028F1D4) reload
(0x0028F1FC) kick
(0x0028F204) goto
(0x0028F20C) unhide
(0x0028F214) hide
(0x0028F258) notice
(0x0028F260) move
(0x0028F190) reload monsterrefresh
(0x0028F1A0) reload iteminfo
(0x0028F1AC) reload skillinfo
(0x0028F1B8) reload characterinfo
(0x0028F1C8) reload alltable

 

Способ 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

 

Тема открыта для обсуждения. Пишите свои вопросы и идеи в комментариях! :smile:

  • Like 2

Share this post


Link to post
Share on other sites

Я например, просто все вредные GM команды в HEX-редакторе заменил нулевыми байтами, все работает хорошо, но это скорее не правильный способ избежания проблемы.

Откатил GS на предыдущею версию и сделал как описано в первом способе. :morning1:

Share this post


Link to post
Share on other sites
1 час назад, e1mer сказал:

Я например, просто все вредные GM команды в HEX-редакторе заменил нулевыми байтами, все работает хорошо, но это скорее не правильный способ избежания проблемы.

Откатил GS на предыдущею версию и сделал как описано в первом способе. :morning1:

У меня защита как в 3 способе стоит.

Share this post


Link to post
Share on other sites

3 способ почему-то не работает.

Сервер не воспринимает скрипт, как таковой.

Использую скрипт - [Script] KickAllPlayers, каких либо проблем нет, а вот с этим проблемы.

 

В variable.lua ник персонажа указан, но пользоваться командами могут все ГМ без исключения.

Share this post


Link to post
Share on other sites

i wont use translator this time. bad google translatexD

 

V3ct0r @  of After [KickCha] command, there is the any way to the account BAN Customers Also the when triggered?

 

Btw. Great Guide. Very informational.

Edited by Jones

Share this post


Link to post
Share on other sites
10 час назад, aleksandr сказал:

3 способ почему-то не работает.

Сервер не воспринимает скрипт, как таковой.

Использую скрипт - [Script] KickAllPlayers, каких либо проблем нет, а вот с этим проблемы.

 

В variable.lua ник персонажа указан, но пользоваться командами могут все ГМ без исключения.

 

В GameServer.exe есть функции GetGmLv() и SetGmLv()?

Попробуй убрать строку

-- Сбрасываем GM-уровень до 0
SetGmLv(role, 0)

 

10 час назад, Jones сказал:

i wont use translator this time. bad google translatexD

 

V3ct0r @  of After [KickCha] command, there is the any way to the account BAN Customers Also the when triggered?

 

Btw. Great Guide. Very informational.

I think we can write trigger to ban account when it's gm level changed.

  • Like 2

Share this post


Link to post
Share on other sites
8 часов назад, V3ct0r сказал:

 

В GameServer.exe есть функции GetGmLv() и SetGmLv()?

Попробуй убрать строку


-- Сбрасываем GM-уровень до 0
SetGmLv(role, 0)

 

Да, помогло.

Видимо функция SetGmLv не добавлена.

Edited by aleksandr
  • Like 1

Share this post


Link to post
Share on other sites

i'm have error: the players are with problem to speak in the Place

[04-24 17:18:34]resource/script\calculate\functions.lua:16707: attempt to call global `GetGmLv' (a nil value)

Share this post


Link to post
Share on other sites
7 часов назад, DevMorgan сказал:

i'm have error: the players are with problem to speak in the Place

[04-24 17:18:34]resource/script\calculate\functions.lua:16707: attempt to call global `GetGmLv' (a nil value)

Does your GameServer have GetGmLv function? Do you pass a correct role to it? 

Share this post


Link to post
Share on other sites
6 hours ago, V3ct0r said:

Does your GameServer have GetGmLv function? Do you pass a correct role to it? 

i'm using this:

Способ N3. GameServer.exe с функциями HandleChat(), GetGmLv() и  SetGmLv()

Для реализации данного способа Вам потребуется модифицированный GameServer.exe с функциями HandleChat(), GetGmLv() и SetGmLv().

Share this post


Link to post
Share on other sites

@V3ct0r

 

  if (string.find(message, "&") == 1) then 

 

Все бы ничего, но не значит ли это, то он будет кикать и понижать ГМлевел любого ГМа (из тех, кто не присутствуют в списке), даже если сообщение будет не "&make 123, 1", а "f ns xnj nen pf,sk&", то есть банальная опечатка со сменой раскладки и использованием знака вопроса. Таким образом, надо использовать проверку только первого символа мэссэйджа. Я еще не копался здесь в скриптинге и не разбираюсь в нем совсем, но ПРИМЕРНО это должно быть вот так, нэ? (возможно здесь другие методы, но суть в обращении только к первому символу мэссэйджа)

 

 

  if (string.find(message[1], "&") == 1) then 

 
Edited by SnakeSanders

Share this post


Link to post
Share on other sites

@SnakeSanders

Это условие как раз и проверяет что символ '&' находится в начале строки. См. функцию string.find()

 

Цитата

string.find (s, pattern [, init [, plain]])

 

Ищет первое вхождение шаблона pattern в строку s. Если поиск успешен, то find возвращает индексы s где найдено совпадение с шаблоном, т.е. где начинается и кончается; иначе возвращает nil. Третий, необязательный числовой параметр init указывает откуда начинать поиск; по умолчанию он равен 1, также он может быть отрицательным. Значение true в четвертом, необязательном параметре plain выключает возможность поиска по шаблону, в этом случае производится поиск подстроки как есть, т.е. считается, что она не содержит «шаблонных» ("magic") симолов. Помните, что если указан параметр plain, то параметр init должен быть указан тоже.

 

  • Like 1

Share this post


Link to post
Share on other sites

@V3ct0r

Ага, да, спасибо, все понял.

То есть в данном ключе просто неправильно рассмотрел "==  1", используя навыки не-помню-какого-языка, где == 1 просто можно было заменить на == true, здесь же 1 значит место в мессэйдже. тогда все понятно, да.

 

П.С: Правильно понял ведь, да? (((=

Edited by SnakeSanders

Share this post


Link to post
Share on other sites
2 часа назад, SnakeSanders сказал:

@V3ct0r

Ага, да, спасибо, все понял.

То есть в данном ключе просто неправильно рассмотрел "==  1", используя навыки не-помню-какого-языка, где == 1 просто можно было заменить на == true, здесь же 1 значит место в мессэйдже. тогда все понятно, да.

 

П.С: Правильно понял ведь, да? (((=

Здесь 1 значит не true, а именно единицу - позицию символа & в строке.

  • Like 1

Share this post


Link to post
Share on other sites

Добавил список адресов GM-команд. Всего 53 команды и 5 параметров для команды &reload.

 

GameServer.exe версии 1.36 (2 040 КБ):

Скрытый текст

(0x001A7018) lua
(0x001BD05C) itemvalid
(0x001BD158) addkb
(0x001BD160) setpinginfo
(0x001BD16C) senddata
(0x001BD18C) getping
(0x001BD1A4) setping
(0x001BD1AC) lua_all
(0x001BD1C8) delitem
(0x001BD248) skill
(0x001BD250) forge
(0x001BD280) seeattr
(0x001BD288) light
(0x001BD290) itemattr
(0x001BD310) attr
(0x001BD3E4) make
(0x001BD404) setcesslevel
(0x001BD434) addcess
(0x001BD470) addsailexp
(0x001BD4A8) addlifeexp
(0x001BD4B4) addexp
(0x001BD4BC) addmoney
(0x001BD4E8) kill
(0x001BD50C) summonex
(0x001BD534) summon
(0x001BD550) pet
(0x001BD56C) isblock
(0x001BD5B4) misclear
(0x001BD5C0) missdk
(0x001BD60C) delmission
(0x001BD65C) clearmission
(0x001BD6C0) addmission
(0x001BD71C) clearfalg
(0x001BD784) setflag
(0x001BD7DC) clearrecord
(0x001BD840) setrecord
(0x001BD84C) reload_ai
(0x001BD858) misreload
(0x001BD864) harmlog=0
(0x001BD870) harmlog=1
(0x001BD8B0) updateall
(0x001BD8BC) gamesvrstop
(0x001BD8C8) call
(0x001BD8D0) qitem
(0x001BD8D8) qcha
(0x001BD8E0) relive
(0x001BD92C) reload
(0x001BD934) kick
(0x001BD93C) goto
(0x001BD944) unhide
(0x001BD94C) hide
(0x001BD954) notice
(0x001BD998) move
(0x001BD8E8) reload monsterrefresh
(0x001BD8F8) reload iteminfo
(0x001BD904) reload skillinfo
(0x001BD910) reload characterinfo
(0x001BD920) reload alltable

GameServer.exe версии 1.38 (2 088 КБ):

Скрытый текст

(0x001B4114) lua
(0x001C7818) itemvalid
(0x001C78A4) addkb
(0x001C78AC) setpinginfo
(0x001C78B8) senddata
(0x001C78E4) getping
(0x001C790C) setping
(0x001C7914) lua_all
(0x001C793C) delitem
(0x001C7964) skill
(0x001C796C) forge
(0x001C7994) seeattr
(0x001C799C) light
(0x001C79A4) itemattr
(0x001C79F0) attr
(0x001C7AC4) make
(0x001C7AEC) setcesslevel
(0x001C7B1C) addcess
(0x001C7B44) addsailexp
(0x001C7B70) addlifeexp
(0x001C7B7C) addexp
(0x001C7BA4) addmoney
(0x001C7BD0) kill
(0x001C7BF8) summonex
(0x001C7C24) summon
(0x001C7C4C) pet
(0x001C7C90) isblock
(0x001C7CB8) misclear
(0x001C7CC4) missdk
(0x001C7D0C) delmission
(0x001C7D58) clearmission
(0x001C7DA8) addmission
(0x001C7DF4) clearfalg
(0x001C7E40) setflag
(0x001C7E88) clearrecord
(0x001C7EB4) setrecord
(0x001C7EC0) reload_ai
(0x001C7ECC) misreload
(0x001C7ED8) harmlog=0
(0x001C7EE4) harmlog=1
(0x001C7F10) updateall
(0x001C7F1C) gamesvrstop
(0x001C7F28) call
(0x001C7F30) qitem
(0x001C7F38) qcha
(0x001C7F40) relive
(0x001C7F8C) reload
(0x001C7F94) kick
(0x001C7F9C) goto
(0x001C7FA4) unhide
(0x001C7FAC) hide
(0x001C7FB4) notice
(0x001C7FF8) move
(0x001C7F48) reload monsterrefresh
(0x001C7F58) reload iteminfo
(0x001C7F64) reload skillinfo
(0x001C7F70) reload characterinfo
(0x001C7F80) reload alltable

Share this post


Link to post
Share on other sites

Обновил гайд. Добавил список адресов GM-команд для GameServer.exe версии 2.4.

 

Share this post


Link to post
Share on other sites

Перезалейте пожалуйста GS.exe на другой файлообменник, DropBox пишет, что превышен лимит на скачивание.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×