Простая защита от SpeedHack
Добавлено: 03 мар 2013, 18:15
Совершенствовал защиту своего клиента, столкнулся с такой проблемой, как speedHack. Провел небольшое исследование, дабы понять, как это работает. Смысл спидхака в том, что сторонняя программа в заданное количество раз увеличивает частоту системного таймера tickCount, в связи с этим, увеличивается частота всех программных таймеров unity, в том числе, и значение переменной time (аналогично изменению переменной timescale). Лично я это решил проверкой на сервере расстояния, которое проходит игрок в единицу времени и частоту прихода синхронизирующих команд. Но, также, решил повесить еще и на клиент небольшую защиту. Она основана на том, что, изменение частоты tickCount не затрагивает внутренние часы компьютера, а именно на них базируется класс DateTime. В связи с этим родился такой код:
Это проверено у меня на ЗБТ и это работает, ложных срабатываний не было. Тестировало около 100 человек.
Для чего нужна строка "if (span.TotalMilliseconds * 1.3f < dTick)" - класс DateTime обладает довольно низкой точностью и получаемые значения могут прыгать в ту или иную сторону. Коэффициент 1.3 - является своеобразным коэффициентом округления.
Переменная errorCount - введена для нивелирования случайных срабатываний при единичных фризах. Такое иногда бывает, особенно, на загаженной винде.
Пользуйтесь на здоровье.
Синтаксис:
Используется 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);
}
}
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 - введена для нивелирования случайных срабатываний при единичных фризах. Такое иногда бывает, особенно, на загаженной винде.
Пользуйтесь на здоровье.