Unity obfuscation Methods og Anti-Hack Protection

Du har endelig sluppet spillet som du har jobbet så hardt med, og kanskje til og med lagt til et leaderboard for å gi spillet en utfordring. Men dagene går og du legger merke til at noen spillere dukker opp på toppen av resultattavlen med urealistisk høye poengsummer. Din første tanke er selvfølgelig at de hacker, men hvordan gjør de det?

Svaret er at de mest sannsynlig bruker et program for å injisere sine egne verdier i minnet, med det mest populære av slike programmer som Cheat Engine. Nå, i enkeltspillerspill, spiller ikke hacking så stor rolle, men det blir et problem når det er et flerspiller-spill der de andre spillerne er involvert.

I dette innlegget vil jeg vise hvordan du kan gjøre spillet ditt sikrere mot slike angrep, noe som igjen vil forbedre opplevelsen for ikke-hackende spillere.

MERK: Denne artikkelen dekker bare kort de vanligste angrepene og grunnleggende beskyttelse mot dem. Hvis du trenger mer ferdige løsninger, kan du sjekke denne Asset Store-pakken.

Når det gjelder hacking med Cheat Engine, er det 2 vanligste angrep: Speed ​​Hacking og Value Scanning.

Speed ​​Hack

Speed ​​Hack er den enkleste å utføre (krever bare 2 klikk), og er vanligvis førstevalget for nybegynnere.

Speed ​​hack fungerer ved å øke hastigheten på spillets oppdateringshastighet, noe som gjør alt raskere, og gir dermed hackere et forsprang på spillerne som spiller med normal hastighet.

Heldigvis er det en måte å oppdage dette hacket på i Unity. Sjekk skriptet nedenfor:

MERK: Fra og med i dag fungerer ikke denne metoden lenger, derfor har det blitt mye vanskeligere å oppdage hastighetshack i enkeltspillerspill. Flerspillerspill er imidlertid fortsatt i stand til å gjøre det ved å stole på sjekker på serversiden for å oppdage eventuelle uoverensstemmelser i spiller-server-tiden og iverksette passende handlinger (sparke/utestenge spilleren osv.).

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.");
    }
}

Skriptet ovenfor sammenligner tiden i spillet med en datamaskins (system) tid. Normalt oppdateres begge tidene med samme hastighet (forutsatt at Time.timeScale er satt til 1), men når SpeedHack er aktivert, akselererer den oppdateringsfrekvensen i spillet, noe som gjør innspillingen -Spilletiden akkumuleres raskere.

Når forskjellen mellom begge gangene blir for stor (i dette tilfellet 7 sekunder, men du kan velge hvilken som helst verdi, bare pass på at den ikke er for liten for å unngå falske positiver) kaller skriptet SpeedhackDetected()-metoden som signaliserer tilstedeværelsen av SpeedHack.

For å bruke skriptet, sørg for at det er festet til ethvert objekt i scenen.

Verdiskanning

Verdiskanning er en prosess for å finne relevante verdier i spillets tildelte minne og overskrive dem med forskjellige verdier. Oftest brukt for å øke spillerens helse, våpenammunisjon eller en hvilken som helst verdi som vil gi en hacker en urettferdig fordel i spillet.

Teknisk sett kan hver verdi i spillet overskrives/endres, men betyr det at alle må beskyttes? Ikke nødvendigvis. Vanligvis målretter nybegynnere kun verdiene som vises på skjermen og som er kjent for hva de brukes til (for eksempel spillerhelse, ammunisjon osv.). Så det meste av tiden er det bare "exposed" verdier som trenger å beskyttes.

Skjermbilde av Unity FPS-spill

For eksempel på skjermbildet ovenfor, er hver verdi på skjermen et potensielt mål for hacking.

Så spørsmålet er, hvordan beskytte de viktige verdiene mot et verdiskanningsangrep? Svaret er Obfuscation.

Obfuscation er handlingen for å gjøre noe uklart, uklart eller uforståelig.

Det er mange måter å skjule en variabel på, men jeg vil bruke en metode som jeg kaller Randomizer. Den tilfeldige verdien genereres ved starten, deretter trekkes den virkelige verdien fra den (gjemmer den deretter), og når det er nødvendig, trekkes den skjulte verdien fra en generert tilfeldig verdi, med en forskjell som det opprinnelige tallet. Nøkkelen er å ha en verdi som vises på skjermen til å ha en helt annen verdi enn variabelen, noe som leder hackere på en helt feil måte når de skanner.

  • Lag et nytt skript, kall det 'SC_Obf', og lim inn koden nedenfor i det:

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;
    }
}

Skriptet ovenfor vil bli brukt til å generere et tilfeldig tall og 2 enkle metoder for å skjule og deobfuskere verdiene.

  • La oss nå gå til et vanlig eksempel på et skript uten noen form for uklarhet:
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");
    }
}

Skriptet ovenfor inneholder 2 enkle variabler: helse (float) og ammunisjon (int). Begge variablene vises på skjermen:

Denne måten å gjøre ting på er enkel og praktisk med tanke på vedlikehold, men hackere vil enkelt kunne skanne verdiene og overskrive dem ved hjelp av Cheat Engine eller lignende programvare.

  • Her er det samme skriptet, men ved å bruke obfuskasjonsmetoder fra '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");
    }
}

I stedet for å initialisere helse- og ammunisjonsvariabler direkte, initialiserer vi dem ved starten i void Awake() (sørg for å kalle SC_Obf.Initialize() før du tildeler verdiene ved å bruke SC_Obf.Obfuscate(verdi)).

Når vi så viser verdiene, fjerner vi dem umiddelbart ved å kalle SC_Obf.Deobfuscate(value) og dermed vise de virkelige verdiene.

Hackeren ville prøve å søke etter 100 og 30, men ville ikke kunne finne dem fordi de virkelige verdiene er helt forskjellige.

For å manipulere de obfuskerte verdiene (f.eks. subtrahere helse) deobfuskerer vi først verdien og trekker deretter fra den nødvendige verdien og tilslører det endelige resultatet tilbake.

For en mer avansert løsning, sjekk gjerne denne Asset Store-pakken.

Foreslåtte artikler
Introduksjon til Unity C# Scripting Language
Metoder i begynnelsen av kjøretid som initialiserer verdier i Unity
Opprette klasser og objekter i Unity Code
Guide til MonoBehaviour in Unity
Lag en GrabPack i Unity Inspirert av Poppy Playtime
Skape en kuletidseffekt i Unity
Opprette interaktive objekter i Unity