Блокировка собейтом ф-ий сампа
#1

Т.к. играть на сервере с читерами я думаю ни кому не нравится, то я считаю написание античита совместными усилиями главное дело сообщества скриптеров павн.
Сам использую собейт только ради того, чтобы протестировать свои же античиты.

Но с недавних пор в собейте под версию сампа 0.3с появились дико классные для читеров фишки: блокировать любую ф-ию сампа на её выполнение.

И вот я при реализации одной из своих идей для решения проблем по игре, т.к. поступало много жалоб решил разобраться в одном вопросе.

Дело имеем с оружием полученным честным путём(Не путать с читерским оружием)
Допустим хотим запретить вход в интерьер с оружием или использовать оружия при отсутствии лицензии на огнестрельное оружие.
pawn Code:
getgun[playerid] = GetPlayerWeapon(playerid);
    if( CheckFireArm(getgun[playerid]) && getgun[playerid] > 0)
    {   //если у игрока нету лицки, то и огнестрельного оружия не должно быть
        if(PlayerInfo[playerid][pGunLic] != 1)
        {
            if(peremCheckWeapon == 0)
            {
                SetPlayerArmedWeapon(playerid, 0);
                if(GetPlayerWeapon(playerid) > 0)//проверяем убралось ли оружие
                {//если не убралось, то в следующем шаге попробовать убрать оружием другим способом
                    peremCheckWeapon = 1; SendClientMessageToAll(COLOR_RED, "SetPlayerArmedWeapon");
                }
            }
            else if(peremCheckWeapon == 1)
            {
                RemovePlayerWeaponEx(playerid, getgun[playerid]);
                if(GetPlayerWeapon(playerid) > 0)
                {
                    peremCheckWeapon = 2; SendClientMessageToAll(COLOR_RED, "RemovePlayerWeapon");
                }
            }
            else if(peremCheckWeapon == 2)
            {
                ResetPlayerWeaponsEx(playerid);
                if(GetPlayerWeapon(playerid) > 0)
                {
                    peremCheckWeapon = 3; SendClientMessageToAll(COLOR_RED, "ResetPlayerWeapons");
                }
            }
            else
            {
                SetPlayerHealthEx(playerid, 0);
                if(GetPlayerWeapon(playerid) > 0)
                {
                    peremCheckWeapon = 0; SendClientMessageToAll(COLOR_RED, "SetPlayerHealth");
                }
            }
        }
    }
Проблема:
1. Почему то GetPlayerWeapon(playerid) не срабывает в одном такте после отбирания оружия. Конечно можно ввести ещё один такт для проверки убралось ли оружие, но это в худшем случаи.
2. В итоге всё это не помогает, т.к. в собейте даже есть блокирование SetPlayerHealth. В итоге после этих всех проверок надо добавить кик или бан. Но это сделать нельзя покуда не найден способ проверить убралось ли действительно оружие, или эта ф-ия отбора оружия у игрока заблокирована собейтом.
3. Через некоторое время сражения собейта и античита, вообще оружие не даётся(даже не видно как оно отбирается и отбирается ли вообще) Античит вообще не ругается. Но ф-ия OnPlayerUpdate отрабатывает дальнейший код.
Reply
#2

Quote:

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

Ой, зря Вы это сказали Щас начнётся....

Про "...написание античита совместными усилиями..." скажу так:
Разработчики этой ....... гадости не сидят на месте, и постоянно обновляют её. Стоит сделать хороший античит, как выйдет обновление чита. Поэтому каждый скриптер делает свой античит, и как он работает знает тока он один, и работать он будет до тех пор, пока не появиться в сети код античита.

PS: Моё сугубо личное мнение...
Reply
#3

Думаю, что те кто пишут собейт далеко не дураки, что умудрились все ф-ии сампа заблокировать.
И им не нужно твои античиты, они сами лучше тебя античит напишут в 1000 раз, т.к. знают все слабые места собейта.
Поэтому молчание по этому поводу не решит проблему.
До сих пор я не видел, чтобы кто то глубоко обсуждал античиты. Причина скорее всего, что все хотят на этих античитах стрести бабок с малолетних школьников. Но при этом собейт прекрасно развивался.

Quote:

Поэтому каждый скриптер делает свой античит, и как он работает знает тока он один, и работать он будет до тех пор, пока не появиться в сети код античита.

Выложи свой античит и я пойму как он работает и на чём основан. Уловлю идею и на подобие напишу свой.
Reply
#4

Скриптово бороться с такими новинками все равно что пытаться пальцем по воде написать какое-то слово. Эффект есть, но очень недолгий. Собейт все хорошеет, а мультиплеер нет, страдает конечно качество и точность. С такой уже совершенно очевидной проблемой нужно обратится к разработчику мультиплеера.
Reply
#5

Я думаю, что скоро в собейте будет блокировать команду кик и бан.
Вот тогда самп обкакается. И я тогда точно пошлю всё к чёртовой матери.
Reply
#6

Собейт блокирует функции сампа, заменяя значение 1 переменной... это баг сампа... есть выход такой, как внешний античит, но не долгий... кик собейт точно блокировать не будет, так как кик - это закрытие udp соединения со стороны сервера... собейт же не на сервере...
Reply
#7

С этим делом надо шевелиться и разработчику сампа тоже, а то на защиту совсем забил.
Reply
#8

Geryy,согласен, стоит уделить немного больше времени защите. В версии R2 появилась защита от брута RCON и простых DoS атак, конечно от школьных программ, типа sамрfp и Rсоn-Раss спасает кое-как, но вот более грамотную атаку пропускает. Конечно не античит, но проблема тоже актуальная.

PS. Кому интересно, для защиты от брута, и DoS использую wipfw. 99% атак отбивает...
Reply
#9

Степашка, знаю у тебя всегда есть оригинальные и простые идеи.
Предложи хоть одну, как отсечь людей, которые блокируют ф-ию SetPlayerArmedWeapon.
Reply
#10

pawn Code:
new weaponId;
SetPlayerArmedWeapon(playerid, weaponId);
if(weaponId != GetplayerWeapon(playerid)) BanEx(playerid, "******");
Reply
#11

ты уверен что в одном такте сработает?
это проверено или лишь твои мысли?

т.к. я проверял и заметил что GetplayerWeapon(playerid) возвращает оружие которое было до сброса если они идут в одном такте.

тот код что я выложил это не теория а на практике проверенный код

SetPlayerArmedWeapon(playerid, 0);
if(GetPlayerWeapon(playerid) > 0)
{
срабатывает всегда даже если нету читов. ПОЧЕМУ?
}
Reply
#12

Могу вечером проверить, сейчас на работе.
Reply
#13

Quote:
Originally Posted by Stepashka
View Post
pawn Code:
new weaponId;
SetPlayerArmedWeapon(playerid, weaponId);
if(weaponId != GetplayerWeapon(playerid)) BanEx(playerid, "******");
Данные не успеют передаться туда и обратно. Два варианта. SetPlayerArmedWeapon меняет серверное значение текущего оружия игрока, которое потом сразу же читает GetPlayerWeapon. Никого этой проверкой не забанит. Вторая версия - SetPlayerArmedWeapon отправляет клиенту данные для смены оружия в то время как GetPlayerWeapon возвращает серверное значение текущего оружия клиента, полученное недавно от клиента. Эти значения почти всегда могут быть разными, потому что клиенту данные еще не дошли, а мы уже проверяем результат.

Такую проверку хорошо бы сделать в самом клиенте, а такой возможности нет.
Reply
#14

Может стоит проверять через секунду после сброса?
Reply
#15

HappyScripter, ты абсолютно прав.И я это знал давно, только так выразиться как ты не мог.
Просто думал, что кто нибудь подскажет решение.

Дело в том, что я уже как два года назад заметил что существует ряд ф-ий которые в одном такте не работают. Но раньше я находил решение, т.к. это было не связано с борьбой с читерами.

И вот на данном примере решил спросить нашёл ли кто решение этой проблемы. И как видимо ни кто не нашёл.
Reply
#16

Менять оружие можно в любом месте, но проверку нужно делать в OnPlayerUpdate(), а не сразу. Но это все мысли, на деле клиент может после смены переключить оружие и назад уже придут данные о другом оружии.
Reply
#17

Quote:
Originally Posted by HappyScripter
View Post
GetPlayerWeapon возвращает серверное значение текущего оружия клиента
сервер не хранит значения клиентской стороны.
Reply
#18

Вот пример таких ещё ф-ий.

AttachTrailerToVehicle и IsTrailerAttachedToVehicle не будут работать в одном такте
и т.д. есть ещё такие ф-ии. Счас сразу не вспомню
Reply
#19

HappyScripter, а если этот апдейт будет с другими данными, то это тоже не получится... я думаю надо дать время, около секунды, а потом уже проверять... Но а если у клиента лаги? Все может быть...
Reply
#20

Quote:
Originally Posted by Borg
View Post
HappyScripter, а если этот апдейт будет с другими данными, то это тоже не получится... я думаю надо дать время, около секунды, а потом уже проверять... Но а если у клиента лаги? Все может быть...
перед изменением оружия запоминаем его ИД
меняем оружие
ждем в OnPlayerUpdate() изменения текущего оружия

возможно, изменения оружия будут не сразу, поэтому нужно ждать изменений в этой функции, постоянно проверяя текущее оружие
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)