Unity'deki oyuncuları tellerden tamamen gizleyebilir ve nasıl koruyabilirim?


47

Tamamen çevrimdışı olacak bir 2D oyun oluşturmak için Unity'yi kullanıyorum (sorun bu), oyunun belirli seviyelerde belirli dizgelere girmeniz gerekiyor ve Unity kolayca değiştirilebilen DLL'leri derliyor. bu dizeleri korumanın bir yolu var (oyun çevrimdışı olduğundan başka bir kaynaktan alamıyorum)?

Oyun bu iplere dayanıyor ve evet, şaşkınlığın farkındayım ama daha sağlam bir şey istiyorum. Ve bunun kolay yolun çevrimiçi olarak her şeyi bir veri kaynağından yapacağını biliyorum ama bunun mümkün olup olmadığını merak ediyordum.

Bu gibi çözülebilir: görüntü tanımını buraya girin


10
Asla kazanamayacağın bir savaş olduğu konusunda hemfikir olsam da, küçük bir çabayla kesinlikle daha da zorlaştırabilirsin. obfuscar.codeplex.com
Jacob Persi

46
@ Gabriele Huh? Yasaklanmayan C # kodunun açılması, olabildiğince kolaydır. Neredeyse mükemmel şekilde okunabilir bir kod elde edersiniz, IDA'nın optimize edilmiş C veya C ++ kodu için ürettiği ile karşılaştırırsınız. Yeterince çabayla, yerel kodun anlaşıldığı kadarıyla anlaşılabiliyor, ancak büyüklüklerin emri daha zor. Ne kadar şaşırtmanın işe yaradığına dair hiçbir fikrim yok - normal kod çözücüleri (DotPeek, ILSpy, başka bir şey?) Normal kod çözücüler (ILPpy, ILSpy?
Voo

15
@ GabrieleVierti, bir DLL dosyasından metin çıkarmak önemsizdir: Linux veya Cygwin altında, sadece stringsprogramı işaret ederek yapabilirsiniz .
Mark

31
Burada tam olarak ne yapmaya çalışıyorsun? Bu, XY probleminin oldukça ağır bir durumu gibi geliyor. meta.stackexchange.com/questions/66377/what-is-the-xy-problem Ne yapmaya çalışıyorsanız yapın (oyun perspektifinden, teknik açıdan değil) bu dizeleri gizlemeye ve şifrelemeye çalışarak neredeyse kesinlikle en iyi şekilde hizmet edilemez .
GrandOpener

36
Dizeleri gizlemenin gerçekten bir amaca hizmet edip etmediğini merak ediyorum: Bazı oyuncular onları çözdükten sonra, büyük olasılıkla wikilerde veya benzerlerinde yayılacaklardır, bu nedenle onları tanımak isteyen herhangi biri kolayca arama yapabilecektir. Evet, oyuncuları şaşırtarak, oyuncu sadece bir metin düzenleyicide dll
dosyasını açamaz ve dizeleri arayamaz

Yanıtlar:


159

Bu dizeleri saklamayın, bunlardan (kriptografik) karma saklayın.

Şifreleme gibi bir (kriptografik) karma işlevi, bir dizgiyi "anlamsız" (hash olarak adlandırılır) haline getirmenin bir yoludur, ancak şifrelemenin aksine, orijinal dizgiyi bu karma değerden alamazsınız (kaba kuvvet veya karma zorlamadığınız sürece) işlev bozuk). Çoğu (tümü değilse) hash işlevleri, bir dizi isteğe bağlı uzunluk alır ve sabit uzunlukta bir dize döndürür (işleve bağlıdır).

Kullanıcının girdiği bir dizgenin doğru olup olmadığını nasıl kontrol edersiniz? Geçerli dizgiyi karma değerinden alamadığınız için, yapabileceğiniz tek şey kullanıcının tahminde bulunmak ve doğru karma değerle karşılaştırmaktır.

Uyarı (Eric Lippert tarafından): Yerleşik işlevi GetHashCodeböyle bir işlev olarak KULLANMAYIN - sonucu farklı .NET sürümleri ve platformları arasında farklılık gösterebilir ve kodunuzu yalnızca belirli .NET framework sürümleri ve platformlarında çalıştırabilir.


81
Bu gerçekten en iyi cevap. Ancak, kesinlikle pozitif olarak dizelerdeki yerleşik karma algoritmayı kullanmamanız gerektiğini unutmayın . bir şeyi ve bir şeyi yalnızca yapmak için tasarlanmıştır ve bu bir karma tabloyu dengelemek içindir. Dizelerin hash'lerini saklayamaz ve bunları paylaşılan bir sırın doğrulayıcıları olarak kullanamazsınız, çünkü .NET çalışma zamanı yazarları dize hash algoritmasını herhangi bir zamanda herhangi bir nedenle ve daha önce yapmış olmaları üzerinde değiştirme hakkını saklı tutar . Kripto gücü olan standart bir karma kullanın veya kendi basit karma değerinizi uygulayın.
Eric Lippert

4
Bu. Kesinlikle. Eğer sha256 gibi bir algoritma kullanıyorsanız (bunu uygulayan birçok kütüphane vardır, bu yüzden kendiniz yazmak zorunda kalmazsınız) o zaman kolayca kırılamayan ve çok güvenilir bir şeyiniz olur.
Micheal Johnson

12
@Michael Johnson bir tuz kullanarak gökkuşağı tabloları kullanmayı çok zorlaştıracak ve bcrypt gibi bir şifre karma kullanarak çok daha yavaş ve bu yüzden kırmak için zor yapacaktır. Fakat nihayetinde günün sonunda bu, gitmek için çok fazla çaba gibi görünüyor; Kullanıcı kendi tercihi olan hile yapmak istiyorsa oyunu satın aldı
Melkor

2
@MichealJohnson: Anahtar germe , bu kaba kuvvetin biraz daha sert saldırıları zorlaştırabilir (örneğin, milyarlarca faktöre göre). Ancak bu cevabın asıl sorunu, muhtemelen bir noktada oyunun, oyuncuya hangi ipi girmeleri gerektiğini söyleyebilmesi gerektiğidir. Bu karakter dizileri aslında oyuncunun çözmesi gereken bir bulmacanın çözümü olmadıkça, sanırım. Veya dizgiler çevrimiçi olmadıkça, oyun çevrimdışı olsa bile eski tarz lisans anahtarlarına benzer.
Ilmari Karonen

5
@Sentinel Bu, oyunun farklı oyuncular için farklı olabileceği anlamına gelir. Ne tür iplerden bahsettiğimizi, oyunun içinde kitaplar / işaretler / diyaloglar içeriyorlarsa, asıl cevabın doğrudan oyuncuya verilmediği bilmecelere çözüm olup olmadığını bilmemiz gerekir. veya rastgele oluşturulmuşlarsa. Ve eğer kelimeler, cümleler veya rastgele karakterler ise.
Micheal Johnson

106

Yapmaya çalıştığın şey hem boş hem de anlamsız.

Bu boş, çünkü kullanıcının makinesinde olan bilgileri doğru şekilde gizlemenin bir yolu yoktur. Yeterince adanmış herkes onu bulacak. Bunu zorlaştırabilirsin, ama asla önleyemezsin. Şifreliyorsanız, şifreleme anahtarını saklamanız ve algoritmayı bir yere koymanız gerekir. Kaç şifreleme katmanı eklediğiniz önemli değildir, oyunun çalışması için en üstteki katmanın her zaman şifrelenmemiş olması gerekir.

Aynı zamanda anlamsız, çünkü internet çağında yaşıyoruz. Oyununuz uzaktan popüler hale geldiğinde, bu şifreler tüm web'de yayınlanacak.

Yapabileceğiniz tek şey, oyuncunun kendilerine henüz söylemesi gerekmeyen bilgilere bakarak kendi oyun deneyimlerini mahvetmediği konusunda güvenmektir. Oyuncuların büyük çoğunluğu yine de oyununuzu tersine çevirmeye başlamayacak. Ve gerekli becerilere sahip olan birkaç kişi bunu yaparsa, bu onların suçu.


38
Tersine mühendislik kendi başına bir oyundur! Bu tek doğru cevap - kişi bugünlerde tek oyunculu oyunlarda bilgiyi gizlememeli, isterlerse oyuncular erişebilir.
Mephy

27
@ TheBinaryGuy Neye göre güvenlik? Kullanıcılarınız çevrimdışı bir oyun oynuyor . Kodu açığa çıkarmak ne gibi bir tehdit oluşturuyor? Oyuncu sonunda oyunu oynayabilmek için onu keşfetmesi gerekiyordu! Önemli bir güvenlik kuralı , korunmakta olduğunuz davranışı tanımlamanız gerektiğidir ; buna "tehdit modeli" denir.
jpmc26

7
@ TheBinaryGuy Diğer noktalara ek olarak, "sabit" şifreler kullanmanın duyarlılığını da sorgularım - çevrimiçi / tersine mühendislik yoluyla çevrimiçi kodları aramadan bile, sadece oyunu ikinci kez oynamanın, oyuncuların sadece doğrudan atlama yapmasına izin vermesi Oyunun bölümleri (zaten kodları bildikleri gibi). Eğer oyuncuları bu kodları kazanmaları için "zorlamak" istiyorsanız, her oyunda değiştirmelerini sağlamalısınız (örneğin: bir tür rasgele
biçimleme

6
Bu cevabın bazı iyi noktaları vardır, ancak ikinci paragraf yanlıştır. Dizeyi şifrelemeniz gerekmez. Buna sahip olabilirsin. Bir oyuncu karmayı kırabilirse, o zaman banka hesaplarını soyuyor olacak, FBI tarafından kiralanacak ya da onun gibi bir şey. Diğer noktalar olsa da geçerlidir.
Pedro A

5
@ Hamstericic Cevap sanırım cevabı saklamak için gerçek dizgilere ihtiyacınız olduğunu varsayar, örneğin oyuncuya bir noktada göstermek için, ki bu karmaşanın işe yaramayacağı anlamına gelir.
Frank Hopkins

4

Böyle bir şey gerçekten isteniyorsa, karma yerine, dizeleri çalışma zamanında sayısal bir giriş değerinden oluşturmayı düşünebilirsiniz.

Bunun avantajı, @Philipp'in belirttiği gibi, yine de internette yayınlanmasını bekleyebiliyorsanız, çalıştırılabilir kodları denemenin ve saklamanın bir anlamı yoktur. Haşlanmış ya da değil, internette bulunan ve oyuna giren aynı kelime aynı hastayı verecek ve her iki şekilde de çalışacaktır.

Hariç ... hariç başkasının kod eğer çalışma değil senin için. Önemsizce yapabileceğiniz -% 100 kurcalamaya dayanıklı değil, ortalama bir kullanıcı için çalışmak oldukça zor. "Online Elf isim jeneratörü" kadar basit olan herhangi bir şey yapacaktır (keyfi olarak basit olabilir, gerçekten bir markov metin gen motoruna çok ihtiyaç duymaz, rastgele bir listeden 4-5 heceyi çekmek yeterlidir).

Sadece kullanıcıya özel veya makineye özgü bir sayı oluşturun, tamamen benzersiz veya kurcalamaya karşı dayanıklı olması bile gerekmez. Bilgisayarın ağ adı, MAC adresi veya sistem disk sürücüsünün GUID'si ne olursa olsun, çoğu insan için muhtemelen farklı ve düzenli olarak değişmesi muhtemel olmayan bir şey (GPU seri numarası çok kötü olabilir)çünkü kullanıcıların GPU’ları yükseltmesi muhtemeldir. Kilit açma kodunun referans aldığı sayı koduna ekleyin ve bunu kelime üreticinize ekleyin. Ancak, oyuncular iki bilgisayar kullandıklarında veya ağ kartlarını değiştirdiklerinde (sıra dışı ancak imkansız olmayan) destek sorgularını yanıtlamaya hazır olun. Rastgele kimliği yalnızca bir kez oluşturmak ve oyunun ayarlarında saklamak iyi bir plan olabilir. Bu şekilde, en azından bir şey değişirse aynı makinedeki mevcut kurulumları bozmaz.

Veya oyunun sadece benzersiz olan ve kullanıcı donanımı değiştirirse işe yarayacak olan seri numarasını kullanabilirsiniz (ancak, ironik olarak, bu korsanlığı teşvik edebilir, çünkü paylaşılan kilit açma kodları korsan diziler için çalışır, ancak meşru müşteriler için değil!).

Kullanıcıların aldatmalarını önlemenin mutlaka iyi bir şey olmadığını unutmayın. Çevrimdışı (yani rekabet etmeyen bir oyunda), kullanıcının kodları çalmaktan başka bir yerden aldatması ve alması genellikle sorun olmaz . Sadece kendini aldatıyor. Kimin umrunda.
Diğer taraftan, gerçekten hile yapmak isterlerse yollarına çok fazla yaklaşmak, ödeme yapan müşterileri tamamen kızdırmak için harika bir fırsattır .

Yani ... böyle bir şey yapmadan önce, gerçekten istediğinizi ve ne istediğinizi çok iyi düşünün. Oldukça büyük olasılıkla, insan tarafından okunabilen dizgelere sahip olmak (veya xor ile önemsiz bir şekilde "okunamaz hale getirilmiş" olmak) yeterince iyi ve gerçekten tercih edilir.


Hangi süreci düşünüyorsunuz? Program indirildikten sonra karma değerini oluşturursa, indirilirken net olmayan dizgeye sahip olması gerekir. Öyleyse sunucu bilgiyi tanımlamak için istemciyi sorgulayacak ve ardından hash sunucu tarafını oluşturacak mı?
Birikim

@ Toplama: Hangi sunucu? Q "tamamen çevrimdışı" diyor. Muhtemelen bir DVD (veya belki bir indirme) bir program artı bir seri numarası anlamına gelir. Yani bir şifrenin bulunması gereken 1,2,3,4 olayınız var. Örneğin hash(serial + 1), birinci koda karşılık gelen bir numara almak için hesaplarsınız . Sonra bunu, her 4 bit giriş için 16'lık bir listeden heceli bir tane çeken kelime jeneratörünüze besleyin. Her kullanıcı için ayrı ayrı “kelimeler” var.
Damon,

Bir indirme ise, o zaman bir sunucudan indiriliyor. Program indirildikten hash(serial+1) sonra hesaplarsa , kullanıcının hesaplama yapmasını engelleyen hash(serial+1)nedir? Program indirildikten sonra, kullanıcı programın yaptığı her şeye erişebilir.
Birikim

@ Toplama: Hiçbir şey, kullanıcının önce programı çözmesini ve sonra hesaplamasını engellemez hash(serial + 1). Ne olmuş yani? Bu sorun değil. Bakın, birisi yazılım geliştirici altyapısı olmadan bir ila iki saat (muhtemelen tipik bir "kullanıcı" için 6-8 saat) yatırım yaparsa, sadece kendini kandırmak için, izin verin. Mesele şu ki, bu bir kişi için çalışıyor, ama herkes için değil ve rekabetçi değil ... yani, sorun değil.
Damon,

3

Eğer dizeleri göstermeniz gerekmiyorsa, karma fikir muhtemelen gitme yoludur. Öte yandan, bunları kullanıcıya göstermeniz gerekiyorsa, doğrudan DLL'nizde görünmelerini engellemenin başka yolları da vardır.

Bununla başa çıkmanın bir yolu, dizeleri şifrelemenin veya başka bir şekilde karıştırmanızı engellemenin yanı sıra, bunları ayırmaktır. Belki sadece bir oyunda tüm dizelerden tüm olası kelimelerin alfabetik olarak sıralanmış bir sözlüğü var. Ardından, sözcükleri bir sözcük dizisine dizine sokarak ihtiyacınız olan dizgiyi bir araya getirmenize izin veren bir diziye sahip olun. Bu şekilde oyunun hiçbir yerinde tam dizginiz yoktur. Dizelerin şifresini çözmek için ana anahtar gerekmez. Ve onların sırasını söyleyen veri, kaynağınızın her yerinde olabilir; örneğin, bir dizgiyi kullanan her bir işlev, işlev için yerel bir dizin dizisine sahipse. Bunun sizin durumunuzda ne kadar pratik olduğundan emin değilim, ama bunu yapmanın bir yolu.

Birkaç sözcükten oluşan bir dizgeye bile sahip olabilirsiniz, ancak sonuçta farklı sıralar veriyorlar. Örneğin, aşağıdaki 2 dizeye ihtiyacınız olabilir:

  1. Evimde bir ayı yürüdü
  2. Evim beni bir ayıdan korudu

İfadeler listenizde hem "ayı" hem de "evim" bulunur, ancak hangisinin gerçekte olduğunu bulmak kadar zor olacağını bulmak için aralarında girebilecek geniş bir öbek listesi vardır. Oyunda bulmacayı (ya da her neyse). Örneğin, eylem cümleleri "beni", "yanmış", "itti", "beni korudu", "beni", "sihirli bir şekilde üretilmiş", vb.

Dizinleri, oyuncunun topladığı veya yaptığı bir şeye dayanarak yaparak oyuna dahil edebilirsiniz. Yani oyunun hiçbir yerinde ana indeks listesi olmazdı. Oyunu oynayan oyuncu tarafından üretilirler.


4
Böylece, belirli bir dizgeye referans veren işlevi bulmak yerine, dizilere indekslere başvuran işlevi bulup dizgiyi yeniden yaratırsınız. Bu, fazladan 30 saniyelik bir korumadan daha fazlası değil. Buna karşı koruduğu şey, sadece stringsçalıştırılabilir olana karşı kullanan biri .
Voo

Dediğim gibi, dizgelere başvuran diziler, gereksinim duyan tüm işlevlere dağıtılmışsa, o zaman tek bir işlevde tek bir dizi bulmaktan biraz daha zordur. İmkansız değil, ama fazladan iş gerektirmeyen daha geniş bir alanı kapsıyor.
user1118321

Bu sadece daha küçük bir şifreleme şekli değil mi?
Arturo Torres Sánchez

2
Bekle, şifrelemeyi bile değil. Sadece kodlama.
Arturo Torres Sánchez

2
Daha net olması için cevabı güncelledim. Temel olarak, dizinler oyuncunun yaptığı bir şeye dayanıyorsa, aslında oyunda saklanmazlar. Yine, aptal veya mükemmel olmayabilir, ancak buraya insanların keşfetmek isteyebileceği bir seçenek olarak koyuyorum.
user1118321
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.