Страница 1 из 1

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

СообщениеДобавлено: 03 мар 2013, 18:15
Woolf
Совершенствовал защиту своего клиента, столкнулся с такой проблемой, как 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 - введена для нивелирования случайных срабатываний при единичных фризах. Такое иногда бывает, особенно, на загаженной винде.
Пользуйтесь на здоровье.

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

СообщениеДобавлено: 03 мар 2013, 18:38
Kayler
Спасибо, попробую :)
PS а почему в разделе ‹ Unity3D ‹ Общие вопросы?))

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

СообщениеДобавлено: 03 мар 2013, 18:39
Diab10
Норм. Только почему не в копилке?)

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

СообщениеДобавлено: 03 мар 2013, 18:48
Neodrop
Спасибо.

(3A4OT)

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

СообщениеДобавлено: 06 мар 2013, 20:55
Acolit
Спасибо, хорошо, если без сервера работает.

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

СообщениеДобавлено: 22 ноя 2013, 19:40
Diab10
Если спидХак стоит на низких значениях(+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)
        {
                //чит!
        }
}

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

СообщениеДобавлено: 24 ноя 2013, 21:14
cibersant
Спасибо.Проверим.

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

СообщениеДобавлено: 24 ноя 2013, 23:45
cibersant
Вроде работает.Прямо во время игры вылетают.Игре 5 дней а уже багеры и спидхакеры.