Простая защита от SpeedHack

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

Простая защита от SpeedHack

Сообщение Woolf 03 мар 2013, 18:15

Совершенствовал защиту своего клиента, столкнулся с такой проблемой, как speedHack. Провел небольшое исследование, дабы понять, как это работает. Смысл спидхака в том, что сторонняя программа в заданное количество раз увеличивает частоту системного таймера tickCount, в связи с этим, увеличивается частота всех программных таймеров unity, в том числе, и значение переменной time (аналогично изменению переменной timescale). Лично я это решил проверкой на сервере расстояния, которое проходит игрок в единицу времени и частоту прихода синхронизирующих команд. Но, также, решил повесить еще и на клиент небольшую защиту. Она основана на том, что, изменение частоты tickCount не затрагивает внутренние часы компьютера, а именно на них базируется класс DateTime. В связи с этим родился такой код:

Синтаксис:
Используется csharp
    private DateTime olddt;
    private long oldTick;
    private int errorCount;

    void Start() {
        olddt = DateTime.Now;
        oldTick = Environment.TickCount;
         InvokeRepeating("invSpeedHack", 5, 5);
    }

    void invSpeedHack() {
        TimeSpan span = DateTime.Now - olddt;
        olddt = DateTime.Now;

        long dTick = Environment.TickCount - oldTick;
        oldTick = Environment.TickCount;

        if (span.TotalMilliseconds * 1.3f < dTick) {
            errorCount++;
        }

        if (errorCount > 5) {
            Debug.Log("SH detected");
            SceneManager.getI.loadNewLevel(GameConst.scCheat);
        }
    }


Это проверено у меня на ЗБТ и это работает, ложных срабатываний не было. Тестировало около 100 человек.

Для чего нужна строка "if (span.TotalMilliseconds * 1.3f < dTick)" - класс DateTime обладает довольно низкой точностью и получаемые значения могут прыгать в ту или иную сторону. Коэффициент 1.3 - является своеобразным коэффициентом округления.

Переменная errorCount - введена для нивелирования случайных срабатываний при единичных фризах. Такое иногда бывает, особенно, на загаженной винде.
Пользуйтесь на здоровье.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Простая защита от SpeedHack

Сообщение Kayler 03 мар 2013, 18:38

Спасибо, попробую :)
PS а почему в разделе ‹ Unity3D ‹ Общие вопросы?))
Аватара пользователя
Kayler
Адепт
 
Сообщения: 1038
Зарегистрирован: 25 авг 2010, 23:49
Откуда: Чувашия

Re: Простая защита от SpeedHack

Сообщение Diab10 03 мар 2013, 18:39

Норм. Только почему не в копилке?)
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Простая защита от SpeedHack

Сообщение Neodrop 03 мар 2013, 18:48

Спасибо.

(3A4OT)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Простая защита от SpeedHack

Сообщение Acolit 06 мар 2013, 20:55

Спасибо, хорошо, если без сервера работает.
Аватара пользователя
Acolit
UNIверсал
 
Сообщения: 431
Зарегистрирован: 08 мар 2012, 11:15

Re: Простая защита от SpeedHack

Сообщение Diab10 22 ноя 2013, 19:40

Если спидХак стоит на низких значениях(+1% ... +3%...), то эта защита его не сможет засечь.
В обычных играх это мб и не заметно, но вот я в гонках это сильно ощутил. В драге 100-500 миллисекунд позволяет срезать при помощи спидХака, и не засекёт.

Поэтому, предлагаю ещё вот эту защиту добавить:

(js) :
Синтаксис:
Используется javascript
var olddt3 : DateTime;
var oldTick3 : long;

function Awake()
{
        olddt3=DateTime.Now;
        oldTick3 = Environment.TickCount;
}

function Update()
{
        var span33 : TimeSpan = DateTime.Now - olddt3;
        if(Mathf.Abs(parseInt(((DateTime.Now - olddt3)).TotalMilliseconds-(Environment.TickCount - oldTick3)))>150)
        {
                //чит!
        }
}
 


(c#) :
Синтаксис:
Используется csharp
private DateTime olddt3;
private long oldTick3;

void Awake()
{
        olddt3=DateTime.Now;
        oldTick3 = Environment.TickCount;
}

void Update()
{
        TimeSpan span33 = DateTime.Now - olddt3;
        if(Mathf.Abs(int.Parse(((DateTime.Now - olddt3)).TotalMilliseconds-(Environment.TickCount - oldTick3)))>150)
        {
                //чит!
        }
}
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Простая защита от SpeedHack

Сообщение cibersant 24 ноя 2013, 21:14

Спасибо.Проверим.
_https://vk.com/app4031890 - 3d боец
cibersant
Старожил
 
Сообщения: 938
Зарегистрирован: 14 дек 2011, 01:27

Re: Простая защита от SpeedHack

Сообщение cibersant 24 ноя 2013, 23:45

Вроде работает.Прямо во время игры вылетают.Игре 5 дней а уже багеры и спидхакеры.
_https://vk.com/app4031890 - 3d боец
cibersant
Старожил
 
Сообщения: 938
Зарегистрирован: 14 дек 2011, 01:27


Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2