Cegah Kecurangan Multi Pemain

10

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. ?

Pengguna093203920
sumber
2
Saya akan merekomendasikan artikel ini, Membangun Game
Multi Pemain

Jawaban:

8

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.

Matthew Scharley
sumber
2
@ user185812: Biasanya adalah ide yang baik untuk menunggu setidaknya beberapa jam sebelum menandai jawaban yang diterima. Sementara secara pribadi saya pikir jawaban saya cukup hebat (saya bias), orang lain mungkin akan memiliki lebih banyak input dan melihat jawaban yang diterima seringkali menjadi pencegah bagi orang lain untuk menjawab.
Matthew Scharley
@MatthewScharley - jangan khawatir. ;)
Martin Sojka
11

Klien ada di tangan musuh. ( Hukum Desain Dunia Online )

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:

Martin Sojka
sumber
2

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.

API-Beast
sumber
Saya tidak setuju pada visibilitas peretasan. Tidak bisakah ini dicegah dengan tidak memberikan informasi klien sampai karakter mereka menyadarinya? Jangan salah paham, ini mungkin bukan desain yang bagus. Tapi itu berbeda dari tidak mungkin dicegah.
xuincherguixe
@ xuincherguixe Saya pikir tidak mungkin dalam beberapa keadaan. Sebagai contoh, kedua klien bermain di bawah IP yang sama dan port yang sama. Dalam kasus seperti itu, hanya niat baik klien yang mencegahnya dari membaca data yang dimaksudkan untuk yang lain.
Wodzu
1

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.

Jose Martinez
sumber
1
Biasanya, untuk mencegah kecurangan, game multi-pemain menghitung semua yang ada di server, jadi memodifikasi nilai pada klien, atau dalam paket yang dikirim ke server, tidak mengubah apa pun menjadi game yang sebenarnya. Tapi tetap saja, sisa jawabannya menarik.
Vaillancourt
@AlexandreVaillancourt Poin bagus. Saya prihatin dengan macet tanda tangan penghitungan CPU server. Saya ingin menjaga server cepat dengan hanya melewati paket antara dua pemain, tapi saya akan melihat lebih dekat sekarang setelah Anda menunjukkannya.
Jose Martinez
Jika Anda hanya mengirim input dari klien ke server, Anda tidak perlu menandatangani setiap paket. Setelah di server, jika input tidak masuk akal, mereka hanya ditolak, atau klien ditendang karena curang. Server menghitung status permainan selanjutnya, lalu mengirim status baru ke semua pemain, itu biasanya cara curang dihindari (Anda tidak menyingkirkan bot seperti ini, tetapi setidaknya Anda menghindari kecurangan kasual dari para pemain) .
Vaillancourt
1
Untuk menghindarinya, Anda membiarkan server memperbarui kehidupan baru, lalu mengirimkan kehidupan baru ke klien. Semuanya dihitung di server, dan biarkan klien menjadi "terminal bisu" untuk semua hal penting: klien akan bertanggung jawab untuk mengambil input dari pemain ("diklik pada x, y pada saat T", "tekan tombol X pada waktu T "), mengirimkannya ke server, dan menerima status baru dari server (" pemain sekarang pada posisi X, Y "," pemain memiliki ZZZ hidup ") dan menampilkannya kepada pemain.
Vaillancourt
1
Dengan ini, penipu (man in the middle) dapat mengacaukan semua yang mereka inginkan dengan paket, itu tidak akan mengubah keadaan permainan di server karena server akan memastikan bahwa inputnya valid ("hmm klien telah mengklik di lima tempat berbeda dalam 0,03 detik terakhir, itu tidak normal, mari kita tolak klik ini "), dan jalankan semua simulasi itu sendiri.
Vaillancourt