Saya telah menggunakan Unity untuk membuat game 2D yang akan sepenuhnya offline (yang merupakan masalah), permainan-permainannya mengharuskan Anda memasukkan string tertentu pada level tertentu dan Unity mengkompilasi ke DLL, yang dapat dengan mudah direkayasa balik, demikian juga ada cara untuk melindungi string-string itu (game sedang offline jadi saya tidak bisa mengambil dari sumber lain)?
Permainan ini sangat bergantung pada string-string itu, dan ya saya sadar Kebingungan tetapi saya menginginkan sesuatu yang lebih kuat. Dan saya tahu bahwa jalan keluar yang mudah adalah melakukan segala sesuatu secara online dari sumber data, tetapi saya bertanya-tanya apakah itu mungkin.
unity
c#
anti-cheat
TheBinaryGuy
sumber
sumber
strings
program ke sana.Jawaban:
Jangan simpan string-string itu, simpan hash (kriptografis) dari mereka.
Fungsi hash (kriptografi), seperti enkripsi, adalah cara untuk mengubah string menjadi "omong kosong" (disebut hash), tetapi tidak seperti enkripsi, Anda tidak bisa mendapatkan string asli dari hash ini (kecuali jika Anda dapat dengan paksa memaksakannya atau hash fungsi rusak). Sebagian besar (jika tidak semua) fungsi hash mengambil string dengan panjang sewenang-wenang dan mengembalikan string dengan panjang konstan (tergantung pada fungsinya).
Bagaimana Anda memeriksa bahwa string yang dimasukkan pengguna adalah yang benar? Karena Anda tidak bisa mendapatkan string yang valid dari hash, satu-satunya hal yang dapat Anda lakukan adalah dengan hash tebakan pengguna dan membandingkannya dengan hash yang benar.
Peringatan (oleh Eric Lippert): JANGAN GUNAKAN fungsi bawaan
GetHashCode
sebagai fungsi - hasilnya dapat berbeda antara versi .NET dan platform yang berbeda, membuat kode Anda hanya berfungsi pada versi dan platform kerangka kerja .NET tertentu.sumber
Apa yang Anda coba lakukan itu sia-sia dan sia-sia.
Itu sia-sia karena tidak ada cara untuk menyembunyikan informasi yang ada di mesin pengguna. Siapa pun yang cukup berdedikasi akan menemukannya. Anda bisa membuatnya lebih sulit, tetapi Anda tidak pernah bisa mencegahnya. Jika Anda mengenkripsi itu, maka Anda perlu menyimpan kunci dan algoritma enkripsi di suatu tempat. Tidak peduli berapa banyak lapisan enkripsi yang Anda tambahkan, lapisan terluar akan selalu perlu dienkripsi agar permainan Anda dapat berjalan.
Ini juga tidak ada gunanya, karena kita hidup di era internet. Ketika game Anda menjadi sangat populer, maka kode sandi itu akan diposting di seluruh web.
Yang bisa Anda lakukan adalah mempercayai pemain untuk tidak merusak pengalaman gim mereka sendiri dengan mencari informasi yang seharusnya tidak diceritakan oleh gim itu kepada mereka. Sebagian besar pemain tidak akan memulai rekayasa ulang permainan Anda. Dan jika beberapa yang memiliki keterampilan yang diperlukan melakukan ini, maka itu adalah kesalahan mereka sendiri.
sumber
Jika hal seperti itu benar-benar diinginkan, maka alih-alih hashing, Anda dapat mempertimbangkan membangun string dari nilai input numerik saat runtime.
Keuntungannya adalah seperti yang ditunjukkan oleh @Philipp, agak tidak ada gunanya untuk mencoba dan menyembunyikan kode yang dapat dieksekusi jika Anda dapat mengharapkannya diposting di internet. Hash atau tidak, kata yang sama ditemukan di internet dan dimasukkan ke dalam permainan akan memberikan hash yang sama dan akan bekerja dengan cara baik.
Kecuali ... kecuali jika kode orang lain tidak bekerja untuk Anda. Yang bisa Anda lakukan sepele - bukan 100% anti-perusakan tetapi cukup sulit untuk dikerjakan untuk pengguna biasa. Apa pun yang sesederhana "Generator nama Elven Online" akan dilakukan (bisa semena-mena sederhana, benar-benar tidak memerlukan banyak mesin gen teks markov, menarik 4-5 suku kata dari daftar acak cukup baik).
Hanya menghasilkan angka yang agak spesifik untuk pengguna atau mesin, itu bahkan tidak harus benar-benar unik atau sangat tahan-rusak. Sesuatu yang mungkin berbeda bagi kebanyakan orang, dan tidak mungkin berubah secara teratur, misalnya nama jaringan komputer, alamat MAC, atau GUID dari drive disk sistem, apa pun (nomor seri GPU mungkin sangat buruk)ide karena pengguna cenderung untuk meningkatkan GPU). Tambahkan ke kode numerik yang ditunjuk oleh kode buka kunci, dan masukkan itu ke dalam generator kata Anda. Tetapi bersiaplah untuk menjawab pertanyaan dukungan ketika pemain menggunakan dua komputer atau mengganti kartu jaringan mereka (yang tidak biasa, tetapi bukan tidak mungkin). Mungkin rencana yang bagus untuk hanya menghasilkan ID acak satu kali, dan menyimpannya dengan pengaturan game. Dengan begitu, setidaknya itu tidak merusak instalasi yang ada pada mesin yang sama jika ada perubahan.
Atau, Anda mungkin hanya menggunakan nomor seri gim yang unik dan akan berfungsi jika pengguna mengubah perangkat keras (ironisnya, bagaimanapun, ini dapat mempromosikan pembajakan karena kode buka bersama yang digunakan berfungsi untuk serial bajakan tetapi tidak untuk pelanggan yang sah!).
Perhatikan bahwa mencegah pengguna dari kecurangan tidak selalu merupakan hal yang baik. Dalam permainan offline (yaitu game yang tidak bersaing) biasanya tidak ada masalah jika pengguna menipu dan mendapatkan kode dari suatu tempat daripada dari bermain. Dia hanya menipu dirinya sendiri. Siapa peduli.
Di sisi lain, terlalu banyak menghalangi mereka jika mereka benar-benar ingin menipu adalah peluang besar untuk benar - benar mengecewakan pelanggan yang membayar.
Jadi ... sebelum Anda melakukan sesuatu seperti itu, pikirkan dengan seksama apakah Anda benar-benar menginginkan itu, dan apa yang Anda inginkan. Sangat mungkin, memiliki string yang dapat dibaca manusia (atau secara sepele membuat "tidak dapat dibaca" dengan xor) cukup baik dan memang lebih disukai.
sumber
hash(serial + 1)
mendapatkan nomor yang sesuai dengan kode pertama. Kemudian masukkan itu ke dalam generator kata Anda, yang menarik, katakanlah, satu suku kata dari daftar 16 untuk setiap 4 bit input. Ini dia, "kata-kata" individual untuk setiap pengguna.hash(serial+1)
setelah diunduh, apa yang membuat pengguna berhenti menghitunghash(serial+1)
? Setelah program diunduh, pengguna memiliki akses ke semua yang dilakukan oleh program.hash(serial + 1)
. Terus? Ini bukan masalah. Dengar, jika seseorang berinvestasi satu hingga dua jam (mungkin 6-8 jam untuk "pengguna" yang khas tanpa latar belakang pengembang perangkat lunak) hanya untuk menipu dirinya sendiri, yah ... biarkan dia. Masalahnya, ini bekerja untuk satu orang, tetapi tidak untuk semua orang, dan itu tidak kompetitif ... jadi, tidak masalah.Jika Anda tidak perlu menunjukkan string, maka ide hashing mungkin adalah cara yang harus dilakukan. Jika, di sisi lain, Anda perlu menunjukkannya kepada pengguna, ada beberapa cara lain untuk menghindarinya agar tidak langsung muncul di DLL Anda.
Salah satu cara untuk mengatasinya selain mengenkripsi atau mengaburkan string adalah dengan memecahnya. Mungkin hanya memiliki kamus yang diurutkan berdasarkan abjad dari semua kata yang mungkin dari semua string dalam permainan. Kemudian miliki array di suatu tempat yang memungkinkan Anda untuk menyatukan kata-kata ke dalam string yang Anda butuhkan dengan mengindeks ke dalam array kata-kata. Dengan cara ini Anda tidak memiliki string lengkap di mana pun dalam permainan. Tidak diperlukan kunci utama untuk mendekripsi string. Dan data yang memberi tahu urutannya bisa di seluruh sumber Anda, jika, misalnya, setiap fungsi yang menggunakan string hanya memiliki array indeks lokal ke fungsi. Saya tidak yakin seberapa praktis itu dalam kasus spesifik Anda, tapi itu salah satu cara untuk melakukannya.
Anda bahkan mungkin memiliki string yang terdiri dari beberapa kata, tetapi kata-kata tersebut akhirnya dimasukkan dalam urutan berbeda. Misalnya, Anda mungkin memerlukan 2 string berikut:
Daftar frasa Anda akan berisi "beruang" dan "rumah saya", tetapi Anda akan memiliki daftar besar frasa lain yang dapat dimasukkan di antara mereka, jadi mencari tahu mana yang akan sama sulitnya dengan benar-benar mencari tahu teka-teki dalam game (atau apa pun). Misalnya, frasa tindakan dapat "berjalan melalui", "dibakar", "didorong", "melindungi saya dari", "memisahkan saya dari", "diproduksi secara ajaib", dll.
Anda bisa mengerjakan ini dalam gim Anda dengan membuat indeks berdasarkan pada sesuatu yang telah dikumpulkan atau dilakukan pemain. Jadi tidak akan ada daftar utama indeks di mana pun di dalam permainan. Mereka akan dihasilkan oleh pemain yang memainkan game.
sumber
strings
terhadap dieksekusi sekalipun.