Global puanlama tablolarına yanlış puan raporlarını nasıl önleyebilirim?


44

Tarayıcı ve mobil oyunlarda genel olarak global yüksek skor tabloları bulunur. Ayrıca, bu tabloların 2.147.483.647'lik puanları içermesi de yaygındır - burada insanlar webservice çağrısı aradıklarında skorları bildirir ve onu hayali bir skoru kaydetmek için kullanırlar.

Basit bulmaca oyunları için, oyuncuya yapılan her hareketin (ve seviyeyi oluşturmak için kullanılan rastgele tohumların) skor raporlama aramasına bir kaydını ekleyerek buna karşı savunabiliriz. Daha sonra oyunun tamamı sunucuda çoğaltılabilir ve doğrulanabilir.

Ancak, bu hızlı bir şekilde Pac-man'dan daha büyük bir şey için olanaksız hale gelir.

Bu tür hile yapmak başka nasıl önlenebilir?


Küresel bir yüksek skor tablosu oluşturmak için aynı tekniği kullanarak iPhone oyunları ile ilgili bu aynı soruyu vardı.
deft_code 30:10

Tekrar göndermenin mümkün olmayacağından emin misiniz ?
'.

Evet eminim. :)
teedyay

Yanıtlar:


9

Moblox için kullandığımız iç sistem (daha sonra OpenFeint ile değiştirildi) şöyle çalıştı:

  • Düz HTTP üzerinden bir JSON mesajı gönderin (HTTPS değil). Tüm alanların bir MD5 karması ve bir sihirli dize ekleyin.
  • Sunucuda, aynı işlemle mesajın bütünlüğünü kontrol edin.

Sistemi kırmak için, bu sihirli ipi bulmak zorundasın. Tersine mühendislik ile mümkündür, ancak acı verir.

OpenFeint, ScoreLoop ve CocosLive, hepsi aynı numarayı kullanır, ancak HTTPS ile birlikte kullanılır. Uygulaması çok kolay.


29
Sihirli ipinizi bulmak için tersine mühendislik bu kadar zor olacağını oldukça şüpheliyim.
Kylotan

4
Bu yerel C ++ dilinde bir Android uygulamasıdır. Sembol yok, ne de iyi hata ayıklayıcı mevcut. Böylece ARM kodunu okuyabilirsiniz, ancak kolayca izleyemezsiniz. Anahtar birden fazla işlemden oluşuyor, bu nedenle tüm dizeleri bulmak yeterli değil. Bu mükemmel değil ama çok acı verici.
Ellis

3
En azından ABD üniversitelerindeki standart bir lisans çalışması, tanımladığınız şekilde oluşturulan şifreleri y86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/… ) montaj kodunu okuyarak tersine çevirmektir .

12
Bu, geliştiricilere çok yanlış bir güvenlik hissi verecek olan çok zayıf bir tekniktir.
'.


21

Karmaşık oyunlar için sunucuya tüm tekrarları göndermek her zaman mümkün olmamakla birlikte, benzer bir sistem, sunucunun periyodik olarak (ve yarı rasgele) durumunun bir kısmını istemesini istemesi için kullanılabilir. oyun çalışıyor.

Örneğin, bir FPS'de her dakika "Kaç tane öldürücünüz var?", "Bütün düşmanlar nerede?" Diye sorabilirsiniz. Müşteri, bir yarışmada makul bir cevapla geri gelmezse Makul bir süre, hile yapıyorlar.

Elbette, bu yalnızca oyun tüm oyun oturumu boyunca çevrimiçi olduğunda çalışır. Buradaki amaç çevrimiçi bir lider panosuna yüklenebildiğinden, bunun makul olduğunu düşünüyorum - yanlış cevap verirse oyuncuyu oyundan atmayın, sadece skor listesine girmelerine izin vermeyin.

Bununla birlikte, tekrar göndermeyi yeniden gözden geçirmenizi tavsiye ederim. Tek ihtiyacınız olan ilk rastgele tohum ve zaman damgalı giriş. Bu gerçekten en fazla birkaç yüz KB olmalı. Birçok arcade oyunu zaten oyuncu incelemesi amacıyla tekrar oynatmak için bunu yapıyor; Sunucunuzun bunları doğrulaması önemsiz olmayabilir, ancak botlama dışında her türlü hileyi önler.


10

En üst puan tablosundaki en yüksek sonuçları izleyerek en çok kötüye kullananları sınırlayabilirsiniz. Oyununuza bağlı olarak, yukarıda herhangi bir puanın hileli olması gereken "mükemmel bir skor" olabilir. Değilse, en düşük "imkansız puanı" nı hesaplayabilirsiniz. oyuncu saniyede 10 atış yapabilir, oyun 1 dakika sürer ve öldürülen her düşman 100 puan değerinde midir? O zaman 60.000'den yüksek puanlar hileli olmalıdır.

Ayrıca bazı meta veriler göndererek sorunu hafifletmeye de yardımcı olabilirsiniz; tanımladığınız gibi oyun geçmişinin tamamı değil, sadece skoru oluşturan bileşenler. Diyelim: 60000 puan, 500 düşman öldürüldü ve bir bonus ürün ele geçirildi. Daha sonra basit kontroller yapabilirsiniz. Bu "gizlilik yoluyla güvenlik" dir ve bu nedenle hiçbir şekilde güvenli değildir, ancak saldırganların en naifliğini ortadan kaldırmaya yardımcı olur.


Bir kullanıcıyı, meta verileriyle eşleşmeyen bir puan gönderirse (muhtemelen IP ile) de işaretleyebilirsiniz. Sonra, DOES'in doğru meta verilere sahip olduğunu tekrar dener ve puanlar gönderirlerse, onu inceleyebilir ve muhtemelen tamamen yasaklayabilirsiniz. Ayrıca oradan arsız bir mesaj da gönderebilirsiniz, skor talebi gönderin :)
Adam Harte

Bence bu cevap kabul edilen cevaptan daha iyi. Oyuncularınızın elde edebileceği sayıyı bulmanız yeterli. Herhangi bir şey daha yüksek, sadece atın.

6
Bir üniversiteye hile yapan bir oyuncu varsa, ağdaki herkes artık bir "dolandırıcı" dır
AttackingHobo

6

Nihayetinde, sadece inanılmaz derecede yüksek puanları ekarte edebilirsiniz, çünkü geri kalanlar (tanım gereği ile) yalnızca mantıksızdır ve bu nedenle meşru (ve harika) bir oyuncu olabilir.

Aksi takdirde, şaşırtma tekniklerine güvenmek zorundasınız (şifreleme ve sadece puanın ötesinde diğer istatistikleri gönderme gibi).

Ayrıca, oyun oynanırken skoru periyodik olarak gönderebilirsiniz, bu da hile yapmak için başka bir karmaşıklık seviyesi ekler - yani, sunucu oyunun belirli bir skoru garanti edecek kadar uzun süre oynanıp oynanmadığına karar verebilir ve ayrıca yeterli ara raporların alınmasını sağlayabilir oyun sırasında alındı ​​(sadece% 100'ünü yapmayın ya da eve giderken bir tünele giden tren telefonu pencereden fırlatmama neden olur).

Nihayetinde birisi onu kırmanın bir yolunu bulacaktır, bu yüzden onları durdurmaya çalışırken kendinizi öldürmeyin.


6

Bir süre önce bir projeye hızlı / kirli yüksek skor tablosu ekledim ve internet güvenliğinde ustalaşılmamıştım. Şaşırtıcı bir şekilde, yaklaşık 1.200.000 kaydedilmiş skorla, sadece 5 veya 6 kez kesin olarak hatalı puanları topluyordum. Skorların çoğu bile gerçek bir "hack" den ziyade oyunda bir aksaklık gibi gözüküyordu.

Bu yüzden önemli bir nokta olduğunu tahmin ediyorum: oyununuzun puanlama sisteminin hava geçirmez olduğundan emin olun veya en azından gerçekten iyi bir puan fizibilite kontrolü yapın; Şimdi, bahsettiğim bu oyun bir Ludum Dare 48hr girişi oldu, bu yüzden etrafındaki en istikrarlı şey değildi .. ama genel olarak sıradan oyuncunun oyun içi bir aksaklıktan daha fazla keşfedilmesi / istismar edilmesinin daha muhtemel olduğunu düşünüyorum. birinin doğrudan afişe "hack" etmesi.

Bununla birlikte, şu anda bu projenin bir tekrarı üzerinde çalışıyorum ve şaşkınlıkla dışarı çıkıyorum. Çok fazla ayrıntıya girmeyeceğim, ancak temel olarak tüm puanların bir grup rastgele değere ve hash değerine ve sihirli bir dizgeye dayanan önemli bir değer sunmasını istiyorum, daha sonra bu kontrolü geçen ve gerçek olacak kadar yüksek olan herhangi bir puan En iyi X "afiş panosunda başka bir onaylama turu geçmesi gerekiyor (bu sefer sunucu ucunda üretilen zaman aşımına uğramış bir anahtar değeri ve daha ayrıntılı fizibilite kontrolleri ile).

Ayrıca , ne tür şeylerin görünür olduğunu test etmek için bir tür paket izleyici kullanmanızı öneririm (başlangıçta, yüklenen bir skorun http isteğini bulmak ve çoğaltmak için birinin paket izleyiciyi kullanmadan kullanabileceği anlamına gelen daha basit bir doğrulama işlemi yapıyordum) sihirli dize ya da herhangi bir şey (önce okunaklı bir puana ihtiyaç duyduğunuz anlamına gelir, ancak bu puanın kopyalarını istediğiniz kadar gönderebilirsiniz ..). Bunu test etmek için Wireshark kullandım .

Huh, bu biraz uzun sürdü, ama umarım yardımcı olur ...


Kesinlikle öyle. Tuzlu bir karma gitmek için iyi bir yol gibi görünüyor. Aynı geçerli puanı tekrar tekrar göndereceklerini düşünmemiştim. Bir GUID ve pakete dahil edilen bir zaman damgası (ve karma) buna ödenmelidir - sunucuda dupe olup olmadığını kontrol edebilirim. Teşekkür ederim.
teedyay

3

Bu alanda uzman değilim, ancak siz yerdeysem, kodu kodunuza gömülü bir anahtarla şifrelemeye çalışacağım. Bu kişilerin web servisleri için kullanılan düz metin yerine kodunuz üzerinde tersine mühendislik uygulamasına ihtiyaç duyacaklar.


2
Bir tane daha giderdim. Exe dosyasını (veya bunun bir bölümünü) karma alarak koddan bir karma oluşturun. Puan gönderirken sürüm numarasını gönderin ve sunucu, sürüm numarası-> karma kodunun basit sabitleri olan bir tablo kullanarak doğrulayabilir. Ardından, birileri programı değiştirerek hile yaparsa, yüksek puanının saymayacağı bir bonus kazanırsınız.
konfigüratör,

7
Birisi programı değiştiriyorsa, istedikleri anahtarı zaten gönderebilir.

2
@Joe Wreschnig, istedikleri herhangi bir anahtarı gönderebilirler, ancak sunucu yalnızca geçerli anahtarları kabul edecek şekilde ayarlanmalıdır.
AttackingHobo

5
Bence Joe'nun amacı, yeni değiştirilen programın karma kodunu kullanmak zorunda olmadıklarını, fakat önceki karmaşanın ne olduğunu gönderebildikleriydi.
Kylotan

1
@ gd1: Bu nasıl yardımcı olur?
Kylotan

1

Speedruns temelde her tuş vuruşunun kaydını tutuyor ve bir WHOLE oyunu hakkında kayıt yapıyorlar. Yani, evet, tüm oyunu kaydedebilirsiniz, bu mümkün değil. Herhangi yapmak için başka bir yol ters mühendislik yoluyla crackable (Ben yeterince stres olamaz: Eğer güvenlik, sen bilinmezlik ekliyoruz katamazsın).

Yine de, bu şekilde yapsanız bile, aslında bir speedrun sunabilirler. Bunu önlemek için hiçbir şey yapamazsın.


2
Genellikle kayıttan yürütme değil, kayıttan yürütme, sunucu için uygun olan bölümdür. Eğer müşteri birkaç saattir oyun oynuyorsa, sunucu tarafı resimülasyonu CPU-dakikalar sürebilir veya daha da kötüye gidebilir. Puan gönderen çok kişi varsa, bu gerçekten kabul edilebilir değil.

2
Veri paketinin boyutu mobil oyunlar için bir sorun haline gelecektir - özellikle de oyuncu byte tarafından bant genişliğini ödediğinde.
teedyay

İkinizin de söylediği doğru. Yine de, başka hiçbir "gerçek" çözüm yok.
'.

11
Gönderilen her kaydı doğrulamak zorunda değilsiniz, sadece ilk 10'a girenleri doğrulamak zorundasınız. # Olmak için çok fazla hile yapmak yok. Ve bunu gerçek zamanlı olarak yapmak zorunda değilsiniz. Periyodik parti işlemi iyi olurdu.
gri,

@teedyay Oyuncunun saniyede ortalama 5 işlem gerçekleştirdiğini ve her işlemin 32 bit olarak tamamen tanımlanabileceğini söyleyin. Bu saniyede 20 bayt veya saatte 72 kB'dir. ABD'de tipik mobil veri fiyatı GB başına 10 ABD Doları veya 1000 kB başına 1 cent'tir.
Damian Yerrick

1

Sen varken, yüksek bir puanın sadece bir istismara uğrayan bir oyuncu olup olmadığı sorusu var (örneğin, oyundaki bazı şeyler bir puan cezası verirse ve bir böcek negatif bir puanın "sarılması" sonucunu doğurursa) son derece olumlu olmak için ... ya da sadece tahtada oturmak ve sonsuza dek kaybetmekten endişe etmek zorunda kalmayacakları, tahtada güvenli bir nokta gibi belirli bir oyun koşulu bulan bir oyuncu).

Bir hack ile oyunun istismar edilmesi arasındaki farkı söylemek için en azından bazı oyun verilerini yüklemek iyi olacaktır. En azından istismarları çözmene yardım edecek.

Bazı oyunlar için (özellikle sıra tabanlı olanlar için), aslında oyun tarafında tüm oyun mantığının sunucu tarafında olduğu ve istemcinin sadece bir arayüz olduğu sunucu üzerinden oynanmasını sağlayabilirsiniz. Bu, sadece puan kesmeyi çok zorlaştırmakla kalmaz, aynı zamanda sunucudaki tüm oyuncu işlemlerini önemsiz bir şekilde kaydetmenize ve böylece istediğiniz zaman herhangi bir oyunu tekrar oynatmanıza olanak sağlar. Bir seğirme aksiyon oyunu gibi bir şeyin farkına vardım, bu pratik olmayabilir.


1

Tüm rastgeleliklerin kaynağını tek bir tohumdan yapın ve her kare için girişi saklayın. Herhangi bir puanınız yüksekse (en iyi 50 diyelim), tohum ve tam girişi sunucuya gönderin. Oyunu sunucuda tekrar oynatın ve yüksek bir puan alırsanız büyük tabloyu güncelleyin.

İsteğin boyutundan dolayı daha karmaşık oyunlar için bunun uygun olmadığını düşünüyorsanız, bu örneğe bir göz atın.

Oyunun 8 tuş girişi (1 tuş ve 4 tuş) olduğunu ve 60 fps'de çalıştığını söyleyin. Sıkıştırma olmadan bir saatlik oyun girişi 3.6KB ile iletilebilir. Oturumunuz muhtemelen bir saatten daha az sürecek ve sıkıştırma, insan girdisinde çok fazla fazlalık olduğundan dolayı çok fazla küçülmeli.

Buradaki zorluk, oyunu deterministik, kaydedilen girdilerden oynanabilir ve sunucu üzerinde çalıştırılabilir hale getirmektir.


0

Bunu daha önce hiç uygulamamıştım ama ...

Zaman damgaları ile puanları aşamalı olarak gönderin. Bu, skorun ne kadar sıklıkla geliştiğini ve skorun "momentumunu" izlemek için bir yol olduğunu gösteren bir günlük sunar.

Daha sonra puanlarınız için kilometre taşları / kriterleri belirlersiniz.

Örneğin: 20.000'den büyük bir puan oyunun ilk 20 saniyesinde gelemez. 250.000'den büyük bir puan, 200.000'den büyük bir giriş olmadan ulaşılamaz.

Bu oyun gönderme durumuyla tam olarak aynı değil, buna yakın.

Yan Yarar: Bundan alabileceğiniz tüm faydalı oyun istatistiklerini düşünün. Birisi prob bunun için iyi para ödeyecek.

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.