Metode de ofuscare Unity și protecție anti-hack

În sfârșit, ați lansat jocul la care ați lucrat atât de mult și poate chiar ați adăugat un leaderboard pentru a adăuga provocare jocului. Dar zilele trec și observi câțiva jucători care apar în partea de sus a tabelului de scor cu scoruri nerealist de mari. Primul tău gând este, desigur, că piratau, dar cum fac asta?

Răspunsul este că cel mai probabil folosesc un program pentru a-și injecta propriile valori în memorie, cel mai popular dintre astfel de programe fiind Cheat Engine. Acum, în jocurile cu un singur jucător, hacking-ul nu contează atât de mult, dar devine o problemă atunci când este un joc multiplayer în care sunt implicați ceilalți jucători.

În această postare, voi arăta cum să vă faceți jocul mai sigur împotriva unor astfel de atacuri, care, la rândul lor, vor îmbunătăți experiența pentru jucătorii care nu pirata.

NOTĂ: Acest articol acoperă doar pe scurt cele mai comune atacuri și protecția de bază împotriva acestora. Dacă aveți nevoie de mai multă soluție ieșită din cutie, nu ezitați să verificați acest pachet Asset Store.

Când vine vorba de hacking cu Cheat Engine, există 2 atacuri cele mai frecvente: Speed ​​Hacking și Value Scanning.

Speed ​​Hack

Fiind cel mai ușor de executat (necesită doar 2 clicuri), Speed ​​Hack este de obicei prima alegere pentru utilizatorii începători.

Speed ​​hack funcționează prin accelerarea ratei de actualizare a jocului, făcând totul mai rapid, oferind astfel hackerilor un avantaj față de jucătorii care joacă la viteza normală.

Din fericire, există o modalitate de a detecta acest hack în Unity. Verificați scriptul de mai jos:

NOTĂ: Începând de astăzi, această metodă nu mai funcționează, prin urmare, detectarea hack-ului de viteză a devenit mult mai dificilă în jocurile cu un singur jucător. Jocurile multiplayer, totuși, pot face acest lucru bazându-se pe verificări pe server pentru a detecta orice nepotrivire în timpul jucător-server și pentru a lua măsurile corespunzătoare (lovirea/interzicerea jucătorului etc.).

SC_SpeedhackDetector.cs

using UnityEngine;
using System;

public class SC_SpeedhackDetector : MonoBehaviour
{
    //Speed hack protection
    public int timeDiff = 0; 
    int previousTime = 0;
    int realTime = 0;
    float gameTime = 0;
    bool detected = false;

    // Use this for initialization
    void Start()
    {
        previousTime = DateTime.Now.Second;
        gameTime = 1;
    }

    // Update is called once per frame 
    void FixedUpdate()
    {
        if (previousTime != DateTime.Now.Second)
        {
            realTime++;
            previousTime = DateTime.Now.Second;

            timeDiff = (int)gameTime - realTime;
            if (timeDiff > 7)
            {
                if (!detected)
                {
                    detected = true;
                    SpeedhackDetected();
                }
            }
            else
            {
                detected = false;
            }
        }
        gameTime += Time.deltaTime;
    }

    void SpeedhackDetected()
    {
        //Speedhack was detected, do something here (kick player from the game etc.)
        print("Speedhack detected.");
    }
}

Scriptul de mai sus compară timpul din joc cu timpul unui computer (sistem). În mod normal, ambele ori sunt actualizate la aceeași frecvență (presupunând că Time.timeScale este setat la 1), dar când SpeedHack este activat, accelerează frecvența de actualizare în joc, făcând ca timpul din joc să se acumuleze Mai repede.

Odată ce diferența dintre ambele timpi devine prea mare (în acest caz 7 secunde, dar puteți alege orice valoare, asigurați-vă doar că nu este prea mică pentru a evita falsele pozitive) scriptul apelează metoda SpeedhackDetected() care semnalizează prezența SpeedHack.

Pentru a utiliza scriptul, asigurați-vă că este atașat la orice obiect din scenă.

Scanarea valorii

Scanarea valorilor este un proces de găsire a valorilor relevante în memoria alocată jocului și de suprascriere a acestora cu valori diferite. Cel mai frecvent folosit pentru a crește sănătatea jucătorului, muniția armelor sau orice valoare care ar oferi unui hacker un avantaj nedrept în joc.

Tehnic vorbind, fiecare valoare din joc poate fi suprascrisă/schimbată, dar înseamnă că toate sunt necesare pentru a fi protejate? Nu neaparat. În general, hackerii începători vizează doar valorile afișate pe ecran și sunt cunoscute pentru ce sunt folosite (de exemplu, sănătatea jucătorului, muniție etc.). Deci, de cele mai multe ori doar valorile "exposed" trebuie protejate.

Captură de ecran a jocului Unity FPS

De exemplu, în captura de ecran de mai sus, fiecare valoare de pe ecran este o țintă potențială pentru hacking.

Deci întrebarea este cum să protejăm valorile importante împotriva unui atac de scanare a valorii? Răspunsul este Ofuscare.

Obfuscare este acțiunea de a face ceva obscur, neclar sau neinteligibil.

Există multe modalități de a ofusca o variabilă, dar voi folosi o metodă pe care o numesc Randomizer. Valoarea aleatoare este generată la început, apoi valoarea reală este scăzută din ea (ulterior ascunzând-o), apoi atunci când este nevoie, valoarea ascunsă este scăzută dintr-o valoare aleatoare generată, o diferență fiind numărul inițial. Cheia este să aveți o valoare care este afișată pe ecran pentru a avea o valoare complet diferită de variabilă, conducând hackerii într-un mod complet greșit atunci când scanează.

  • Creați un nou script, numiți-l 'SC_Obf' și inserați codul de mai jos în el:

SC_Obf.cs

using UnityEngine;

public class SC_Obf : MonoBehaviour
{
    static float random = -1;

    public static void Initialize()
    {
        if(random == -1)
        {
            random = Random.Range(10000, 99999);
        }
    }

    public static float Obfuscate(float originalValue)
    {
        return random - originalValue;
    }

    public static float Deobfuscate(float obfuscatedValue)
    {
        return random - obfuscatedValue;
    }
}

Scriptul de mai sus va fi folosit pentru a genera un număr aleatoriu și 2 metode simple pentru a ofusca și a dezfunda valorile.

  • Acum să trecem la un exemplu obișnuit de script fără nicio ofuscare:
using UnityEngine;

public class SC_Test : MonoBehaviour
{
    public float health = 100;
    public int ammo = 30;

    public void Damage(float points)
    {
        health -= points;
    }

    void OnGUI()
    {
        GUI.Label(new Rect(5, 5, 150, 25), health + " HP");
        GUI.Label(new Rect(5, 30, 150, 25), ammo + " Ammo");
    }
}

Scriptul de mai sus conține 2 variabile simple: sănătate (float) și muniție (int). Ambele variabile sunt afișate pe ecran:

Acest mod de a face lucrurile este simplu și convenabil în ceea ce privește întreținerea, dar hackerii vor putea cu ușurință să scaneze valorile și să le suprascrie folosind Cheat Engine sau un software similar.

  • Aici este același script, dar folosind metode de ofuscare din 'SC_Obf.cs':
using UnityEngine;

public class SC_Test : MonoBehaviour
{
    public float health;
    public int ammo;

    void Awake()
    {
        SC_Obf.Initialize();
        health = SC_Obf.Obfuscate(100);
        ammo = (int)SC_Obf.Obfuscate(30);
    }

    public void Damage(float points)
    {
        health = SC_Obf.Obfuscate(SC_Obf.Deobfuscate(health) - points);
    }

    void OnGUI()
    {
        GUI.Label(new Rect(5, 5, 150, 25), SC_Obf.Deobfuscate(health) + " HP");
        GUI.Label(new Rect(5, 30, 150, 25), SC_Obf.Deobfuscate(ammo) + " Ammo");
    }
}

În loc să inițializam direct variabilele de sănătate și muniție, le inițializam la început în void Awake() (Asigurați-vă că apelați SC_Obf.Initialize() înainte de a atribui valorile folosind SC_Obf.Obfuscate(valoare)).

Apoi, la afișarea valorilor, le deobfuscăm din mers apelând SC_Obf.Deobfuscate(value) afișând astfel valorile reale.

Hackerul ar încerca să caute 100 și 30 dar nu le-ar putea găsi deoarece valorile reale sunt complet diferite.

Pentru a manipula valorile obfuscate (de ex. scăderea sănătății), mai întâi deobscurcăm valoarea, apoi scădem valoarea necesară, apoi obscurcăm rezultatul final înapoi.

Pentru o soluție mai avansată, nu ezitați să verificați acest pachet Asset Store.

Articole sugerate
Introducere în limbajul de scripting Unity C#
Metode de la începutul runtime care inițializează valori în Unity
Salvați și încărcați logica pentru Unity
Implementarea introducerii prin tastatură și mouse în Unity
Implementarea moștenirii și polimorfismului în codul Unity
Crearea de clase și obiecte în Unity Code
Înțelegerea funcțiilor și apelurilor de metodă