Metode Kebingungan Persatuan dan Perlindungan Anti-Peretasan

Anda akhirnya merilis game yang telah Anda kerjakan dengan keras, dan bahkan mungkin menambahkan papan peringkat untuk menambah tantangan pada game. Namun hari-hari berlalu dan Anda melihat beberapa pemain bermunculan di puncak papan skor dengan skor tinggi yang tidak realistis. Pikiran pertama Anda tentu saja mereka meretas, tapi bagaimana mereka melakukannya?

Jawabannya adalah, kemungkinan besar mereka menggunakan program untuk memasukkan nilai mereka sendiri ke dalam memori, dan program yang paling populer adalah Cheat Engine. Sekarang, dalam permainan pemain tunggal, peretasan tidak terlalu menjadi masalah, tetapi menjadi masalah jika itu adalah permainan multipemain yang melibatkan pemain lain.

Dalam postingan ini, saya akan menunjukkan cara membuat game Anda lebih aman dari serangan semacam itu, yang pada gilirannya akan meningkatkan pengalaman pemain non-peretasan.

CATATAN: Artikel ini hanya membahas secara singkat serangan paling umum dan perlindungan dasar terhadap serangan tersebut. Jika Anda membutuhkan solusi yang lebih unik, silakan periksa Asset Store Paket ini.

Ketika melakukan peretasan dengan Cheat Engine, ada 2 serangan yang paling umum: Peretasan Kecepatan dan Pemindaian Nilai.

Peretasan Kecepatan

Karena paling mudah dijalankan (hanya membutuhkan 2 klik), Speed ​​Hack biasanya menjadi pilihan pertama bagi pengguna pemula.

Peretasan kecepatan bekerja dengan mempercepat laju pembaruan game, menjadikan segalanya lebih cepat, sehingga memberi peretas keunggulan dibandingkan pemain yang bermain dengan kecepatan normal.

Untungnya, ada cara untuk mendeteksi peretasan ini di Unity. Periksa skrip di bawah ini:

CATATAN: Saat ini, metode ini tidak lagi berfungsi, oleh karena itu, mendeteksi peretasan kecepatan menjadi jauh lebih sulit dalam permainan pemain tunggal. Namun, game multipemain masih dapat melakukannya dengan mengandalkan pemeriksaan sisi server untuk mendeteksi ketidakcocokan waktu pemain-server dan mengambil tindakan yang sesuai (menendang/melarang pemain, dll.).

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

Script di atas membandingkan waktu dalam game dengan waktu (sistem) komputer. Biasanya kedua waktu diperbarui dengan kecepatan yang sama (dengan asumsi Time.timeScale disetel ke 1), tetapi ketika SpeedHack diaktifkan, ini mempercepat frekuensi pembaruan dalam game, membuat waktu dalam game terakumulasi lebih cepat.

Ketika perbedaan antara kedua waktu menjadi terlalu besar (dalam hal ini 7 detik, namun Anda dapat memilih nilai apa pun, pastikan saja nilainya tidak terlalu kecil untuk menghindari kesalahan positif) skrip akan memanggil metode SpeedhackDetected() yang menandakan kehadiran SpeedHack.

Untuk menggunakan skrip pastikan melekat ke Objek mana pun di Adegan.

Pemindaian Nilai

Pemindaian nilai adalah proses menemukan nilai yang relevan dalam memori yang dialokasikan permainan dan menimpanya dengan nilai yang berbeda. Paling umum digunakan untuk meningkatkan Kesehatan pemain, Amunisi Senjata, atau nilai apa pun yang akan memberikan keuntungan yang tidak adil bagi peretas dalam game.

Secara teknis, setiap nilai dalam game dapat ditimpa/diubah, namun apakah itu berarti semuanya perlu dilindungi? Belum tentu. Umumnya, peretas pemula hanya menargetkan nilai-nilai yang ditampilkan di layar dan diketahui kegunaannya (misalnya kesehatan pemain, amunisi, dll.). Jadi seringkali hanya nilai "exposed" yang perlu dilindungi.

Tangkapan Layar Game FPS Persatuan

Misalnya pada tangkapan layar di atas, setiap nilai di layar berpotensi menjadi target peretasan.

Jadi pertanyaannya adalah, bagaimana cara melindungi nilai-nilai penting dari serangan Value Scanning? Jawabannya adalah Kebingungan.

Kebingungan adalah tindakan membuat sesuatu menjadi kabur, tidak jelas, atau tidak dapat dipahami.

Ada banyak cara untuk mengaburkan suatu variabel, tetapi saya akan menggunakan metode yang saya sebut Randomizer. Nilai acak dihasilkan di awal, kemudian nilai sebenarnya dikurangi (selanjutnya menyembunyikannya), kemudian bila diperlukan, nilai tersembunyi dikurangi dari nilai acak yang dihasilkan, dengan selisih menjadi angka aslinya. Kuncinya adalah memiliki nilai yang ditampilkan di layar memiliki nilai yang benar-benar berbeda dari variabel, sehingga menyebabkan peretas mengambil cara yang salah saat memindai.

  • Buat skrip baru, beri nama 'SC_Obf', dan tempelkan kode di bawah ini ke dalamnya:

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

Skrip di atas akan digunakan untuk menghasilkan angka acak dan 2 metode sederhana untuk mengaburkan dan membatalkan penyamaran nilai.

  • Sekarang mari beralih ke contoh skrip biasa tanpa kebingungan apa pun:
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");
    }
}

Script di atas berisi 2 variabel sederhana: kesehatan (float) dan amunisi (int). Kedua variabel ditampilkan di layar:

Cara melakukan hal ini sederhana dan nyaman dalam hal pemeliharaan, namun peretas akan dengan mudah dapat memindai nilai dan menimpanya menggunakan Cheat Engine atau perangkat lunak serupa.

  • Ini skrip yang sama, tetapi menggunakan metode kebingungan dari '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");
    }
}

Daripada menginisialisasi variabel kesehatan dan amunisi secara langsung, kami menginisialisasinya di awal di void Awake() (Pastikan untuk memanggil SC_Obf.Initialize() sebelum menetapkan nilai menggunakan SC_Obf.Obfuscate(nilai)).

Kemudian saat menampilkan nilai, kami membatalkan penyamarannya dengan cepat dengan memanggil SC_Obf.Deobfuscate(value) sehingga menampilkan nilai sebenarnya.

Peretas akan mencoba mencari 100 dan 30 tetapi tidak dapat menemukannya karena nilai sebenarnya sangat berbeda.

Untuk memanipulasi nilai yang dikaburkan (misal, mengurangkan kesehatan), pertama-tama kita lakukan deobfuscate nilainya lalu kurangi nilai yang diperlukan, lalu samarkan kembali hasil akhirnya.

Untuk solusi lebih lanjut, silakan periksa Asset Store Paket ini.

Artikel yang Disarankan
Pengantar Bahasa Scripting Unity C#
Menerapkan Warisan dan Polimorfisme dalam Kode Persatuan
Memahami Fungsi dan Panggilan Metode
Menerapkan Teleportasi dalam Persatuan
Metode di Awal Runtime yang Menginisialisasi Nilai dalam Unity
Simpan dan Muat Logika untuk Unity
Daftar Persatuan Kata Kunci yang Berguna di C#