Saya hampir selesai mengembangkan game multipemain gaya indie kecil. Walaupun saya bermaksud untuk mengizinkan orang untuk menyontek dalam satu pemain, ini jelas tidak dapat diterima dalam multi-pemain. Adakah yang tahu cara untuk membantu menghentikan rata-rata Joe dari menggunakan sesuatu seperti Cheat-Engine untuk memodifikasi bagian-bagian permainan? Saat ini saya berencana untuk meminta klien mengunggah hash MD5 dari setiap file pengaturan yang digunakan game (disimpan sebagai XML) ke server game untuk verifikasi setiap beberapa detik, tetapi adakah yang bisa saya lakukan untuk menghentikan hal-hal seperti editor memori, dll. ?
networking
multiplayer
security
anti-cheat
Pengguna093203920
sumber
sumber
Jawaban:
Jika Anda khawatir tentang kode yang dimodifikasi secara lokal, lalu bagaimana Anda bisa yakin bahwa seseorang belum cukup mengubah kode notifikasi Anda untuk mengirim daftar hash MD5 statis, yang sama seperti yang Anda harapkan? Bahkan, Anda bahkan tidak perlu modifikasi kode untuk melakukan ini, Anda hanya perlu proxy yang cukup mendasar (dengan asumsi tidak ada SSL, tetapi bahkan itu bisa dipalsukan dengan sedikit usaha).
Satu-satunya cara untuk melakukan apa yang Anda inginkan adalah memiliki server dan sama sekali tidak mempercayai klien sama sekali. Semua perhitungan harus ditangani di server dan semua tindakan diverifikasi sebagai setidaknya agak mungkin. Misalnya, jangan izinkan klien mengatakan bahwa mereka ingin pindah ke satu sisi peta ketika Anda tahu mereka berada di sisi lain beberapa saat yang lalu. Tanpa server di tengah melakukan segala sesuatu yang penting untuk permainan, tidak mungkin untuk tidak melakukan kecurangan, karena seseorang yang cerdas akan selalutemukan jalan di sekitar apa pun yang dapat Anda bangun ke dalam klien. Bahkan dengan satu, masih mungkin jika Anda tidak memikirkan semua cara yang berbeda untuk memanipulasi situasi sedikit. Misalnya, validasi gerakan yang saya sebutkan sebelumnya: Jika Anda melakukan perhitungan titik ke titik yang sederhana, orang mungkin masih dapat berteleportasi melalui dinding.
Jadi pertanyaannya adalah, berapa rata-rata 'rata-rata Joe'? Anda telah menyebutkan penyuntingan kode dan editor memori. Itu di atas apa yang saya pribadi pertimbangkan tingkat rata-rata, dan jika Anda ingin khawatir tentang tingkat itu maka server tepercaya terpisah yang melakukan semua pengangkatan berat diperlukan dan klien akan menjadi dasarnya hanya menjadi perangkat tampilan dan input.
sumber
Sungguh, satu-satunya cara untuk mengalahkan sebagian besar cheat adalah menjadikan klien menjadi "thin client", yaitu: Untuk hanya bertindak sebagai perangkat input dan output, dan tidak pernah memberikan informasi lebih dari yang dibutuhkannya.
Ini tidak akan menghentikan otomatisasi dan ini tidak akan menghentikan pengumpulan dan analisis informasi pasif, tetapi Anda dapat merancang game Anda sehingga ini tidak memiliki dampak yang signifikan.
Ini tidak akan menghentikan orang untuk saling meretas melalui pesan salah yang diandalkan oleh server - klien Anda harus menjaga terhadap pesan dari server sama seperti Anda menjaga situs web Anda dari serangan injeksi SQL.
Karena Anda juga ingin menggunakan klien yang sama untuk permainan pemain tunggal, solusinya adalah menjalankan server lokal dalam proses / utas terpisah dan memperlakukannya secara internal sebagai pengaturan klien / server. "Cheat" akan bekerja di sisi server. Minecraft melakukan sesuatu yang serupa, meskipun itu bukan berarti gim pertama yang memisahkan mesin gim dari antarmuka-nya sedemikian rupa.
Bacaan yang disarankan:
sumber
Dalam gim multipemain dasar, menyontek dalam jenis Cheat-Engine tidak akan berhasil. Klien hanya mengirim data dan tindakan yang Anda rancang lakukan. Biasanya itu tidak lebih dari apa yang pemain "lakukan", misalnya ke arah mana dia berlari, jika dia menembak dan sebagainya. Jadi perubahan yang dia lakukan pada memori hanya akan memengaruhi permainannya sendiri, tetapi pemain lain tidak akan melihat perubahan, yang disebut desync. Sebagian besar gim mendeteksi desyncs seperti itu dan menghapus pemain yang sudah disinkronkan dari gim.
Sekarang ada juga cara curang lainnya, tetapi itu semua adalah tentang bagaimana game Anda dirancang.
Untuk melindungi dari peretasan termudah, yang memalsukan pesan jaringan, server harus memeriksa paket itu untuk kewarasannya. "Pria itu baru saja melompati 5 layar? Itu tidak mungkin, tolak paket." (Perhatikan bahwa Anda juga dapat menjalankan rute yang sepenuhnya disinkronkan -yaitu berarti semuanya disinkronkan dan hanya "Tombol apa yang ditekan oleh pemain." - jenis pesan yang dikirim- yang membuat pesan jaringan palsu tidak berguna menurut desain.)
Cara terakhir menyontek dalam multipemain adalah peretasan visiblity, yaitu memodifikasi klien sehingga menunjukkan data ke pemain yang tidak dikenalnya. Contoh untuk ini tidak menunjukkan kabut perang, bisa melihat menembus dinding, menampilkan minimap atau hal-hal lain. Ini tidak mungkin untuk dicegah.
sumber
Untuk mencegah hack Cheat Engine dasar yang memanipulasi nilai-nilai variabel Anda maka Anda harus menyembunyikan nilai-nilai itu. Biasanya Cheat Engine digunakan untuk mengidentifikasi lokasi memori dari variabel yang menarik (misalnya jumlah emas atau masa pakai atau tingkat peningkatan kemampuan) dengan melakukan pencarian untuk nilai variabel yang diketahui tersebut, memainkan lebih banyak game dan menyebabkan nilainya berubah, maka Cheat Engine akan melakukan pencarian baru dari hasil pencarian sebelumnya untuk nilai baru. Ini memungkinkan penipu untuk memperbesar lokasi memori dari nilai, sekarang mereka dapat mengubah nilai lokasi memori tersebut menggunakan Cheat Engine.
Sebagai contoh, saya memiliki 245 EMAS ... dengan Cheat Engine saya mencari 245 dan menemukan banyak lokasi memori. Kemudian saya bermain lagi dan membawa emas saya ke 314, saya kemudian mencari nilai pencarian sebelumnya untuk nilai 314 dan dengan mudah menemukan lokasi memori tempat penyimpanan GOLD.
Cara untuk mencegah ini adalah tidak pernah memiliki nilai nyata disimpan di lokasi memori. Misalnya, saya menyimpan nilai dalam objek yang harus menghitung nilai riil saat diminta saat diperlukan. Jadi katakanlah pemain memiliki 245 EMAS. Jika mereka melakukan pencarian untuk lokasi memori dengan nilai 245, mereka mungkin menemukan banyak tetapi tidak satupun dari mereka akan menjadi lokasi memori di mana nilai emas sebenarnya disimpan, itu karena Anda tidak menyimpan nilai 245 untuk emas. Ketika permainan perlu tahu berapa banyak emas, ia akan meminta objek yang menyimpan nilai untuknya, yang akan menghitungnya sesuai permintaan.
Jadi pertanyaannya sekarang adalah: Bagaimana tepatnya Anda menyimpan nilai dengan cara yang tidak mengungkapkannya? Ini menjadi sedikit rumit dan jelek dan saya yakin ada banyak cara yang bisa dilakukan. Yang ingin saya lakukan adalah menyimpan array boolean (atau byte array). Panjang array dapat berupa apa saja, tetapi katakanlah adalah 13. Kemudian Anda memiliki penghitung yang mewakili berapa kali 13 masuk ke nilai aktual. Jadi jika kita ingin mewakili 245 maka penghitung akan memiliki nilai 18. Sekarang array akan memiliki semua boolean disetel menjadi true untuk sisa 245/13 ... pada dasarnya modulus. Dalam hal ini 11, jadi 11 boolean pertama dalam array akan disetel ke true, sisanya disetel ke false. Untuk mengambil nilai yang perlu Anda lakukan adalah mengalikan penghitung dengan panjang array, lalu menambahkan 1 untuk setiap boolean yang disetel ke true (berhenti di false pertama). Sekarang nomor 245 tidak akan pernah disimpan di mana pun dan akan sulit untuk menemukan lokasi memori yang perlu dimanipulasi untuk mengubah jumlah emas. Anda mungkin ingin mengatur panjang array ke ukuran yang berbeda (mungkin secara acak memilih angka antara beberapa rentang yang masuk akal) ketika objek ini dibuat.
EDIT: Ini berguna untuk multipemain dan pemain tunggal. Ada kecurangan yang juga bisa dilakukan dalam multi-pemain, di mana nilai-nilai dalam paket bisa diubah. Ini membutuhkan teknik berbeda untuk mencegahnya, seperti menandatangani setiap paket.
sumber