Bir Flash oyununun PHP tabanlı yüksek puanlar tablosunu hacklemenin en iyi yolu nedir?


212

Üst puan limiti olmayan ve hamleleri tekrarlayarak sunucudaki puanı doğrulamanın hiçbir yolu olmayan bir aksiyon oyunundan bahsediyorum.

Gerçekten ihtiyacım olan Flash / PHP'de mümkün olan en güçlü şifreleme ve insanların Flash dosyası dışında PHP sayfasını çağırmasını önlemenin bir yolu. Geçmişte tek bir puan için birden fazla çağrı yapmak ve bir checksum / fibonacci dizisini tamamlamak ve aynı zamanda SWF'yi Amayeta SWF Encrypt ile şaşırtmak için basit yöntemler denedim, ama hepsi hacklendi.

StackOverflow yanıtları sayesinde artık Adobe'den daha fazla bilgi buldum - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html ve https://github.com/mikechambers/as3corelib - sanırım ben şifreleme için kullanabilirsiniz. Bu beni CheatEngine etrafında alacak emin değilim.

Farklıysa, hem AS2 hem de AS3 için en iyi çözümleri bilmem gerekiyor.

Ana sorunlar TamperData ve LiveHTTP başlıkları gibi şeyler gibi görünüyor, ama daha gelişmiş hack araçları da olduğunu anlıyorum - CheatEngine gibi (teşekkürler Mark Webster)


puan limitleri koymak gerekir, bunu yapamaması için hiçbir neden yoktur, seviye başına, toplam, vb ...
mpm

İlk bağlantı artık mevcut değil
Mike

Yanıtlar:


415

Bu, Internet oyunları ve yarışmalarında klasik bir sorundur. Flash kodunuz bir oyunun skorunu belirlemek için kullanıcılarla birlikte çalışır. Ancak kullanıcılar güvenilir değildir ve Flash kodu kullanıcının bilgisayarında çalışır. SOL'sunuz. Bir saldırganın yüksek puanlar çıkarmasını önlemek için yapabileceğiniz hiçbir şey yoktur:

  • Flash mühendisliği tersine çevirmek düşündüğünüzden daha da kolaydır, çünkü bayt kodları iyi belgelenmiştir ve üst düzey bir dili (Actionscript) tanımlamaktadır; bir Flash oyun yayınladığınızda, ister kaynak kodunuzu yayınlıyorsunuz, ister bilmek ya da bilmemek.

  • Saldırganlar, Flash yorumlayıcısının çalışma zamanı belleğini kontrol eder, böylece programlanabilir bir hata ayıklayıcının nasıl kullanılacağını bilen herkes herhangi bir değişkeni (geçerli puan dahil) istediği zaman değiştirebilir veya programın kendisini değiştirebilir.

Sisteminize karşı mümkün olan en basit saldırı, oyun için HTTP trafiğini bir proxy üzerinden çalıştırmak, yüksek puan tasarrufunu yakalamak ve daha yüksek bir puanla tekrar oynatmaktır.

Her bir yüksek puanı kaydetmeyi oyunun tek bir örneğine bağlayarak bu saldırıyı engellemeye çalışabilirsiniz, örneğin oyun başlangıcında istemciye şifreli bir jeton göndererek:

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(Aynı etkiye sahip bir oturum çerezi de kullanabilirsiniz).

Oyun kodu, bu jetonu yüksek puan tasarrufuyla sunucuya geri yansıtır. Ancak bir saldırgan yine de oyunu tekrar başlatabilir, bir jeton alabilir ve hemen bu jetonu tekrar oynatılan yüksek puanlı bir tasarrufa yapıştırabilir.

Bundan sonra sadece bir jeton veya oturum çerezi değil, aynı zamanda yüksek puan şifreleme oturum anahtarını da beslersiniz. Bu, Flash oyununa sabit kodlanmış bir anahtarla şifrelenmiş 128 bit AES anahtarı olacaktır:

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

Şimdi oyun yüksek puanı göndermeden önce, yüksek puan şifreleme oturumu anahtarının şifresini çözer, çünkü yüksek puan şifreleme-oturum-anahtarı-şifre çözme anahtarını Flash ikili koduna sabit olarak kodlamışsınızdır. Yüksek puanı, bu şifresi çözülmüş anahtarla ve yüksek puanın SHA1 karmasıyla şifrelersiniz:

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

Sunucudaki PHP kodu, isteğin geçerli bir oyun örneğinden geldiğinden emin olmak için jetonu kontrol eder, ardından yüksek skorun yüksek skorun SHA1'iyle eşleştiğinden emin olmak için şifrelenmiş yüksek skorun şifresini çözer (bu adımı atlarsanız) , şifre çözme sadece rastgele, muhtemelen çok yüksek, yüksek puanlar üretecektir).

Bu yüzden şimdi saldırgan Flash kodunuzu açar ve ağrılı bir başparmak gibi görünen AES kodunu hızlı bir şekilde bulur, ancak olmasa bile bir bellek araması ve bir izleyici ile 15 dakika içinde izlenecektir ("biliyorum bu oyun için puanım 666, bu yüzden bellekte 666 bulalım, o değere dokunan herhangi bir işlemi yakalayalım --- oh bak, yüksek puan şifreleme kodu! "). Oturum anahtarıyla saldırganın Flash kodunu çalıştırması bile gerekmez; bir oyun başlatma jetonu ve bir oturum anahtarı alır ve keyfi bir yüksek puan geri gönderebilir.

Şu anda çoğu geliştiricinin vazgeçtiği noktadasınız - saldırganlarla birkaç ay uğraşın veya şu şekilde yapın:

  • AES tuşlarını XOR işlemleriyle karıştırma

  • Anahtar bayt dizilerini, anahtarı hesaplayan işlevlerle değiştirme

  • İkili boyunca sahte anahtar şifrelemeleri ve yüksek puan ilanları saçılıyor.

Tüm bunlar çoğunlukla zaman kaybıdır. Söylemeye gerek yok, SSL de size yardımcı olmayacak; İki SSL uç noktasından biri kötü olduğunda SSL sizi koruyamaz.

Yüksek puan sahtekarlığını gerçekten azaltabilecek bazı şeyler şunlardır:

  • Oyunu oynamak, oturum açmak için oturum açma çerezi oluşturmak ve bir oturumda aynı oturumda birden fazla oyuna veya aynı kullanıcı için birden fazla eşzamanlı oturum açmasına izin vermemek.

  • Şimdiye kadar oynadığınız en kısa gerçek oyunlardan daha az süren oyun oturumlarından yüksek puanları reddedin (daha sofistike bir yaklaşım için, ortalama oyun süresinin altında 2 standart sapmadan daha az süren oyun oturumları için yüksek puanları "karantinaya almayı" deneyin. Oyun sürelerini sunucuda izlediğinizden emin olun.

  • Saldırganların oluşturdukları her giriş için makul görünümlü bir oyun "kağıt izi" üretmek zorunda kalmaları için, oyunu yalnızca bir veya iki kez oynamış girişlerden yüksek puanları reddedin veya karantinaya alın.

  • Oyun sırasında "Heartbeat" puanları, böylece sunucunuz bir oyunun ömrü boyunca skor büyümesini görür. Makul puan eğrilerini takip etmeyen yüksek puanları reddedin (örneğin, 0'dan 999999'a atlama).

  • Oyun sırasında "Anlık Görüntü" oyun durumu (örneğin, mühimmat miktarı, seviyedeki konum, vb.), Daha sonra kaydedilen ara puanlarla uzlaşabilirsiniz. Başlamak için bu verilerdeki anormallikleri tespit etmenize gerek yoktur; sadece toplamak zorundasınız ve sonra geri dönüp işler balık gibi görünüyorsa analiz edebilirsiniz.

  • Güvenlik denetimlerinizden birini geçemeyen kullanıcıların hesabını devre dışı bırakın (örneğin, doğrulamayı geçemeyen şifreli bir yüksek puan göndererek).

Burada sadece yüksek skor sahtekarlığını caydırdığınızı unutmayın. Orada hiçbir şey eğer önlemek için ne yapabilirim. Oyununuzda hatta para varsa, birisi sizin bulduğunuz herhangi bir sistemi yenecek. Amaç bu saldırıyı durdurmak değil ; saldırıyı oyunda gerçekten iyi olmak ve yenmekten daha pahalı hale getirmek.


23
Çevrimiçi bir oyun topluluğu oluşturdum ve tüm ödül sistemimizi sadece en yüksek skorer yerine en yüksek 10. persentil puanını ödüllendirecek şekilde tasarladık ve harika çalıştı, bu yüzden problemin etrafında dolaşmaya çalışmak da yardımcı oluyor!
grapefrukt

1
Güzel! Kısacası, oyun sürece çalışır sunucuda, kötüye engelleyemez (ya da en azından sunucu üzerinde çalışan Sağlık denetimi vardır). Çok oyunculu atıcılarla aynı sorun: İstemci daha iyi nişan almak için değiştirilirse, bunu ağ protokolünde engelleyemezsiniz.
Kerrek SB

3
Bir de tüm kullanıcı eylemleri günlüğü ve yüksek puanı doğrulamak / belirlemek için sunucuda onları tekrar olabilir
I3ck

25

Yanlış soruyu soruyor olabilirsiniz. İnsanların yüksek puan listesinde yukarı çıkmak için kullandıkları yöntemlere odaklanmış görünüyorsunuz, ancak belirli yöntemleri engellemek sadece şimdiye kadar devam ediyor. TamperData ile hiçbir deneyimim yok, bu yüzden bununla konuşamam.

Sormanız gereken soru: "Gönderilen puanların geçerli ve gerçek olduğunu nasıl doğrulayabilirim?" Bunu yapmanın özel yolu oyuna bağlıdır. Çok basit bulmaca oyunları için, belirli başlangıç ​​durumu ve bitiş durumu ile sonuçlanan hamle sırası ile birlikte skoru gönderebilir ve daha sonra aynı hamleleri kullanarak oyunu sunucu tarafında yeniden çalıştırabilirsiniz. Belirtilen puanın hesaplanan puanla aynı olduğunu onaylayın ve yalnızca eşleşmeleri durumunda puanı kabul edin.


2
Bu, oylama sistemi için de geçmişte kullandığım bir teknik. İnsanların hile yapmasını engellemenin bir yolu yoktur, ancak yapabileceğiniz şey davranışlarını kaydetmektir, böylece hile olup olmadığını kontrol edebilirsiniz. Oylama sistemimiz için zaman damgalarını ve IP adreslerini saklardık. [devamı]
Luke

1
Bu şekilde en azından hile davranışı kalıplarını görebilir ve gerektiğinde insanları diskalifiye edebiliriz. Birkaç kez başarıyla kullandık.
Luke

19

Bunu yapmanın kolay bir yolu, kendi puanınızla birlikte yüksek puan değerinizin bir şifreleme karmasını sağlamaktır. Örneğin, sonuçları HTTP GET yoluyla gönderirken: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

Bu sağlama toplamı hesaplanırken, paylaşılan bir sır kullanılmalıdır; bu sır asla ağ üzerinden iletilmemelidir, ancak hem PHP arka ucunda hem de flash ön ucunda sabit kodlanmış olmalıdır. Yukarıdaki sağlama toplamı, " gizli " dizesini " 500 " skoruna ekleyerek ve md5sum üzerinden çalıştırarak oluşturuldu.

Bu sistem bir kullanıcının rastgele skorlar göndermesini engelleyecek olsa da, daha önce hesaplanmış bir skor ve karma kombinasyonunu yeniden gönderdiği bir "tekrar saldırısı" nı engellemez. Yukarıdaki örnekte, 500 puanı her zaman aynı karma dizeyi üretir. Bu riskin bir kısmı, birleştirilecek dizeye daha fazla bilgi (kullanıcı adı, zaman damgası veya IP adresi gibi) eklenerek azaltılabilir. Bu, verilerin tekrar oynatılmasını engellemese de, bir veri kümesinin yalnızca tek bir kullanıcı için aynı anda geçerli olmasını sağlar.

Önlemek için herhangi meydana gelmesini tekrarlama atakları, meydan-yanıt sisteminin bazı tip Aşağıdaki gibi, yaratılmış gerekecektir:

  1. Flash oyun ("istemci") http://example.com/highscores.php HTTP GET'i parametresiz olarak gerçekleştirir. Bu sayfa iki değer döndürür: rastgele oluşturulan bir tuz değeri ve bu tuz değerinin kriptografik karması, paylaşılan sır ile birleştirilir. Bu tuz değeri, beklemedeki sorguların yerel bir veritabanında saklanmalı ve bununla ilişkili bir zaman damgasına sahip olmalıdır, böylece belki bir dakika sonra "süresinin dolması" gerekir.
  2. Flash oyun, tuz değerini paylaşılan sır ile birleştirir ve bunun sunucu tarafından sağlananla eşleştiğini doğrulamak için bir karma hesaplar. Bu adım, tuz değerinin sunucu tarafından gerçekten oluşturulduğunu doğruladığından, kullanıcılar tarafından tuz değerlerine müdahale edilmesini önlemek için gereklidir.
  3. Flash oyun, tuz değerini paylaşılan sır, yüksek puan değeri ve diğer ilgili bilgilerle (takma ad, ip, zaman damgası) birleştirir ve bir karma hesaplar. Daha sonra bu bilgiyi tuz değeri, yüksek puan ve diğer bilgilerle birlikte HTTP GET veya POST yoluyla PHP arka ucuna geri gönderir.
  4. Sunucu, alınan bilgileri istemcideki ile aynı şekilde birleştirir ve istemcinin sağladığı bilgilerle eşleştiğini doğrulamak için bir karma hesaplar. Daha sonra, tuz değerinin bekleyen sorgu listesinde listelendiği gibi hala geçerli olduğunu da doğrular. Bu koşulların her ikisi de doğruysa, yüksek puanı yüksek puan tablosuna yazar ve istemciye imzalı bir "başarı" iletisi döndürür. Ayrıca, tuz değerini bekleyen sorgu listesinden de kaldırır.

Paylaşılan sır kullanıcıya erişilebiliyorsa yukarıdaki tekniklerden herhangi birinin güvenliğinin ihlal edildiğini lütfen unutmayın

Alternatif olarak, istemciyi sunucuyla HTTPS üzerinden iletişim kurmaya zorlayarak ve istemcinin yalnızca erişiminiz olan belirli bir sertifika yetkilisi tarafından imzalanan sertifikalara güvenecek şekilde önceden yapılandırıldığından emin olarak bu ileri geri bazılarından kaçınılabilir. .


11

TPQF'nin söylediklerini seviyorum, ancak hile keşfedildiğinde bir hesabı devre dışı bırakmak yerine, bir bal küpü uygulayın, böylece her giriş yaptıklarında saldırıya uğramış puanlarını görürler ve hiçbir zaman trol olarak işaretlendiklerinden şüphelenmezler. Google için "phpBB MOD Troll" ve ustaca bir yaklaşım göreceksiniz.


1
Bu yaklaşımla ilgili sorun, bu hilelerin mesaj panolarında vb. Birbirlerine övünmesidir, bu yüzden onları gerçekten caydırmaz.
Iain

7
Katılmıyorum. Bu çok zekice bir yaklaşım gibi geliyor.
bzlm

4

Kabul edilen cevapta tqbf, sadece skor değişkeni için bir bellek araması yapabileceğinizden bahseder ("Puanım 666'dır, bu yüzden bellekte 666 sayısını ararım").

Bunun etrafında bir yol var. Burada bir dersim var: http://divillysausages.com/blog/safenumber_and_safeint

Temel olarak, puanınızı saklayacak bir nesneniz var. Ayarlayıcıda, ilettiğiniz değeri rastgele bir sayıyla (+ ve -) çarpar ve alıcıda, orijinali geri almak için kaydedilen değeri rastgele çoğaltıcıyla bölersiniz. Çok basit, ancak bellek aramasının durdurulmasına yardımcı oluyor.

Ayrıca, PushButton motorunun arkasındaki, bilgisayar korsanlığıyla mücadele etmenin farklı yollarından bazıları hakkında konuşan bazı videolardan da göz atın: http://zaa.tv/2010/12/the-art-of-hacking-flash- oyunlar . Onlar sınıfın ardındaki ilham kaynağıydı.


4

Bir çeşit geçici çözüm yaptım ... Puanların arttığı bir yer verdim (her zaman +1 puan alırsınız). İlk olarak, rastgele num'dan saymaya başladım (diyelim ki 14) ve skorları görüntülediğimde, sadece puanları eksi 14 olarak gösterdim. bellekte 34 olacaktır). İkincisi, bir sonraki noktanın ne olması gerektiğini bildiğimden ... Bir sonraki noktanın ne olması gerektiğinin karmasını oluşturmak için adobe kripto kütüphanesini kullandım .. Puanları artırmak zorunda olduğumda, artan puanların karmasının karmaya eşit olup olmadığını kontrol etmeliyim. Eğer kraker bellekteki noktaları değiştirirse, karmalar eşit değildir. Sunucu tarafı doğrulaması yapıyorum ve oyundan ve PHP'den farklı puanlar aldığımda hile yapıldığını biliyorum. İşte kodumu snippet (Adobe Crypto libraty MD5 sınıfı ve rasgele şifreleme tuzu kullanıyorum. CallPhp () benim sunucu tarafı doğrulamamdır)

private function addPoint(event:Event = null):void{
            trace("expectedHash: " + expectedHash + "  || new hash: " + MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt) );
            if(expectedHash == MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt)){
                SCORES +=POINT;
                callPhp();
                expectedHash = MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt);
            } else {
                //trace("cheat engine usage");
            }
        }

Bu tekniği + SWF engellemesini kullanarak, krakerleri durdurabildim. Ayrıca, sunucu tarafına puanları gönderirken, kendi küçük şifreleme / şifre çözme işlevimi kullanıyorum. Böyle bir şey (sunucu tarafı kodu dahil değildir, ancak algoritmayı görebilir ve PHP'de yazabilirsiniz):

package  {

    import bassta.utils.Hash;

    public class ScoresEncoder {

        private static var ranChars:Array;
        private static var charsTable:Hash;

        public function ScoresEncoder() {

        }

        public static function init():void{

            ranChars = String("qwertyuiopasdfghjklzxcvbnm").split("")

            charsTable = new Hash({
                "0": "x",
                "1": "f",
                "2": "q",
                "3": "z",
                "4": "a",
                "5": "o",
                "6": "n",
                "7": "p",
                "8": "w",
                "9": "y"

            });

        }

        public static function encodeScore(_s:Number):String{

            var _fin:String = "";

            var scores:String = addLeadingZeros(_s);
            for(var i:uint = 0; i< scores.length; i++){
                //trace( scores.charAt(i) + " - > " + charsTable[ scores.charAt(i) ] );
                _fin += charsTable[ scores.charAt(i) ];
            }

            return _fin;

        }

        public static function decodeScore(_s:String):String{

            var _fin:String = "";

            var decoded:String = _s;

            for(var i:uint = 0; i< decoded.length; i++){
                //trace( decoded.charAt(i) + " - > "  + charsTable.getKey( decoded.charAt(i) ) );
                _fin += charsTable.getKey( decoded.charAt(i) );
            }

            return _fin;

        }

        public static function encodeScoreRand(_s:Number):String{
            var _fin:String = "";

            _fin += generateRandomChars(10) + encodeScore(_s) + generateRandomChars(3)

            return _fin;
        }

        public static function decodeScoreRand(_s:String):Number{

            var decodedString:String = _s;
            var decoded:Number;

            decodedString = decodedString.substring(10,13);         
            decodedString = decodeScore(decodedString);

            decoded = Number(decodedString);

            return decoded;
        }

        public static function generateRandomChars(_length:Number):String{

            var newRandChars:String = "";

            for(var i:uint = 0; i< _length; i++){
                newRandChars+= ranChars[ Math.ceil( Math.random()*ranChars.length-1 )];
            }

            return newRandChars;
        }

        private static function addLeadingZeros(_s:Number):String{

            var _fin:String;

            if(_s < 10 ){
                 _fin = "00" + _s.toString();
            }

            if(_s >= 10 && _s < 99 ) {
                 _fin = "0" + _s.toString();
            }

            if(_s >= 100 ) {
                _fin = _s.toString();
            }           

            return _fin;
        }


    }//end
}

Sonra değişkeni diğer sahte varislerle gönderiyorum ve sadece yol boyunca kayboluyor ... Sadece küçük bir flash oyun için çok iş var, ama ödüllerin dahil olduğu bazı insanlar sadece açgözlü. Yardıma ihtiyacınız olursa bana bir PM yazın.

Şerefe, Ico


3

Bilinen (özel) tersinir bir anahtar kullanarak şifrelemek en basit yöntem olacaktır. Ben AS kadar tüm bu yüzden ne tür şifreleme sağlayıcıları olduğundan emin değilim.

Ancak oyun uzunluğu (tekrar şifrelenmiş) ve bir tıklama sayısı gibi değişkenler ekleyebilirsiniz.

Bu gibi tüm şeyler olabilir ters böylece koku insanları atmak için önemsiz bir sürü veri atarak düşünün mühendisliğe tabi.

Düzenleme: Bazı PHP oturumlarında da chucking değer olabilir. Oturumu, oyunu başlat'ı tıkladıklarında başlatın ve (bu gönderinin yorumunun söylediği gibi) zamanı günlüğe kaydedin. Puanı gönderdiklerinde aslında açık bir oyun olup olmadığını ve çok yakında veya çok büyük bir puan göndermediklerini kontrol edebilirsiniz.

Saniyede / dakika başına maksimum skorun ne olduğunu söylemek bir skaler üzerinde çalışmaya değer olabilir.

Bunların hiçbiri devredilemez, ancak Flash'ta insanların görebileceği bir mantığa sahip olmaya yardımcı olacaktır.


Bu yaklaşımı izleyen herkes de bir zaman içermeli ve zamanı doğrulamalıdır, aksi takdirde saldırıları tekrarlamaktan savunmasızsınız.
Tom Ritter

3

Deneyimlerime göre, bu en iyi programlama probleminden ziyade bir sosyal mühendislik problemi olarak ele alınmaktadır. Hile yapmayı imkansız hale getirmeye odaklanmak yerine, hile yapmaya yönelik teşvikleri kaldırarak sıkıcı olmaya odaklanın. Örneğin, ana teşvik kamuya açık yüksek puanlar ise, sadece yüksek puanlar gösterildiğinde gecikme yapmak hileler için olumlu geri bildirim döngüsünü kaldırarak hileyi önemli ölçüde azaltabilir.


12
Ancak bu, gerçek oyuncular için anında yüksek bir puanın olumlu geri bildirimini de ortadan kaldırır, böylece oyun oynamanın kalitesini düşürürsünüz.
Chris Garrett

3

İstemcinin döndürdüğü verilere güvenemezsiniz. Doğrulamanın sunucu tarafında yapılması gerekir. Ben bir oyun geliştiricisi değilim, ama iş yazılımı yapıyorum. Her iki durumda da para dahil edilebilir ve insanlar müşteri tarafındaki gizleme tekniklerini kıracaktır.

Verileri düzenli aralıklarla sunucuya geri gönderebilir ve doğrulama yapabilirsiniz. Başvurunuzun bulunduğu yer burası bile müşteri koduna odaklanmayın.


2

Yüksek puan sisteminiz, Flash uygulamasının ağ üzerinden şifrelenmemiş / imzasız yüksek puan verisi göndermesine dayanıyorsa, bu önlenebilir ve manipüle edilebilir / yeniden oynatılabilir. Bunun cevabı şöyledir: yüksek puanlı verileri şifrelemek (düzgünce!) Veya kriptografik olarak imzalamak. Bu, en azından, insanların yüksek puan sisteminizi kırmasını zorlaştırır, çünkü SWF dosyanızdan gizli anahtarı çıkarmaları gerekir. Birçok insan muhtemelen orada pes edecek. Öte yandan, tek gereken anahtarı çıkarmak ve bir yere göndermek için tek bir kişidir.

Gerçek çözümler, Flash uygulaması ve yüksek puanlı veritabanı arasında daha fazla iletişim gerektirir, böylece ikincisi belirli bir puanın biraz gerçekçi olduğunu doğrulayabilir. Ne tür bir oyuna sahip olduğunuza bağlı olarak bu muhtemelen karmaşıktır.


2

SWF'leri koda etmek kolay olduğu için bunu tamamen hacklenemez hale getirmenin bir yolu yoktur ve yetenekli bir geliştirici hacker kodunuzdan izleyebilir ve kullanabileceğiniz herhangi bir şifreli sistemi nasıl atlayabileceğinizi öğrenebilir.

TamperData gibi basit araçlarla hile yapmayı durdurmak istiyorsanız, başlangıçta SWF'ye ilettiğiniz bir şifreleme anahtarı oluşturabilirsiniz. Daha sonra PHP koduna geri göndermeden önce yüksek puanı şifrelemek için http://code.google.com/p/as3crypto/ gibi bir şey kullanın . Sonra veritabanında saklamak önce sunucu sonunda şifresini çözmek.


2

"Müşteri güveni" sorunu denen şeyden bahsediyorsunuz. Çünkü istemci (bu nakitte, tarayıcıda çalışan bir SWF) yapmak için tasarladığı bir şeyi yapıyor. Yüksek bir puan kaydedin.

Sorun, bazı rastgele HTTP istekleri değil, flash filminizden "skor kaydet" isteklerinin geldiğinden emin olmak istemenizdir. Bunun için olası bir çözüm, istek sırasında sunucu tarafından oluşturulan bir belirteci SWF'ye kodlamaktır ( flasm kullanarak ) ), yüksek bir skor kaydetme talebine eşlik etmesi gereken şekilde . Sunucu bu skoru kaydettiğinde, jetonun süresi dolar ve istekler için artık kullanılamaz.

Bunun dezavantajı, bir kullanıcının flash filmin her yükü için yalnızca bir yüksek puan gönderebilmesidir - yeni bir puan için tekrar oynatmadan önce SWF'yi yenilemeye / yeniden yüklemeye zorlamanız gerekir.


2

Ben genellikle yüksek puanlar girişi ile oyun oturum "hayalet veri" dahil. Eğer bir yarış oyunu yapıyorsam, tekrar veriyi ekliyorum. Tekrar oynatma işlevselliği veya hayalet yarış işlevselliği için genellikle tekrar oynatma verileriniz vardır (son yarışınıza karşı oynayın veya liderlik tablosundaki 14 numaralı adamın hayaletine karşı oynayın).

Bunları kontrol etmek çok el emeğidir, ancak amaç bir yarışmadaki ilk 10 girişin yasal olup olmadığını doğrulamaksa, bu, başkalarının belirttiği güvenlik önlemlerinin cephaneliğine yararlı bir ek olabilir.

Eğer hedef kimseye bakmak zorunda kalmadan yüksek puan listesini çevrimiçi tutmaktır.


2

Yeni bir popüler arcade modunun yaptığı yol, flaştan php'ye, flash'a geri (veya yeniden yükler), sonra da php'ye veri göndermesidir. Bu, verileri karşılaştırmak istediğiniz her şeyi yapmanıza izin verir, ayrıca post verilerini / şifre çözme kesmek ve benzerlerini atlar. Bunu yapmanın bir yolu, php'den flash'a 2 gerçek zamanlı flash değeri atamaktır (gerçek zamanlı flash veri yakalayıcısı çalıştırsanız bile göremezsiniz), rastgele değerlerle skor eklemek için matematiksel bir formül kullanarak ve sonunda sonunda php gittiğinde puan eşleşip eşleşmediğini görmek için aynı formül ters. Bu rastgele değerler hiçbir zaman görünmez, aynı zamanda gerçekleşen işlemin ve

Bana sorarsanız bu oldukça iyi bir çözüm gibi görünüyor, bu yöntemi kullanırken herhangi bir sorun gören var mı? Ya da etrafındaki olası yollar?


Wireshark. Wireshark her zaman deliktir.
aehiilrs

evet, ive tam olarak bu yöntemi denedim ... iyi ... ben bir şekilde yasal kullanıcılar hile olarak giriş var (fonksiyon bilgisayarımda her zaman çalışır, ancak diğer bazı bilgisayarlarda çalışmıyor) ... şimdi ben sadece hile için izin verildi ... Yukarıdaki kontrolü geçmeyen insanları günlüğe kaydederim ve gerçekten yüksek puanları olan kişileri kaydeder ve sonra onları manuel olarak kötüye kullanırım ... puanlarını yaparak * -1: P genellikle şakayı iyi alırlar.
Sigtran

1
"Bunu yapmanın bir yolu php flash içine 2 rastgele değer atamak (gerçek zamanlı flash veri yakalayıcı çalıştırsanız bile göremezsiniz)" - Lütfen beni aydınlatın, php için değerleri geçmek için bir yolu var mı kundakçı veya başka bir araç tarafından izlenmeden flaş?
mkto

2

Bence en basit yol, oyunun eklenecek bir skor kaydettiği ve daha sonra kodladığı, paketlediği ve bir php betiğine dize olarak gönderdiği her seferinde RegisterScore (skor) gibi bir fonksiyona çağrı yapmak olacaktır. Php betiği düzgün bir şekilde nasıl çözüleceğini bilecekti. Herhangi bir puan zorlama girişimleri dekompresyon hatası ile sonuçlanacağı için bu doğrudan php betiği herhangi bir çağrı durur.


2

Sadece tüm oyun mantığını , kullanıcının bilgisi olmadan skoru dahili olarak saklayan sunucu tarafında tutmak mümkündür . Ekonomik ve bilimsel nedenlerden dolayı, insanlık bu teoriyi sıra tabanlı olanlar hariç tüm oyun türlerine uygulayamaz. Çünkü fiziğin sunucu tarafında tutulması hesaplama açısından pahalıdır ve el hızı kadar hızlı tepki vermek zordur. Hatta satranç oynarken herkes AI satranç oyununu rakiple eşleştirebilir. Bu nedenle, daha iyi çok oyunculu oyunlar da isteğe bağlı yaratıcılık içermelidir.


1

İstediğinizi başarmak gerçekten mümkün değil. Flash uygulamasının iç kısımlarına her zaman kısmen erişilebilir, özellikle de CheatEngine gibi şeyleri nasıl kullanacağınızı bildiğinizde , yani web siteniz ve tarayıcı <-> sunucu iletişiminiz ne kadar güvenli olursa olsun, üstesinden gelmek nispeten basit olacaktır.


1

AMFPHP üzerinden arka uç ile iletişim kurmak iyi bir fikir olabilir . En azından tembel olanların sonuçları tarayıcı konsolu aracılığıyla zorlamaya çalışmasını engellemelidir.

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.