Bir gün yine internette dolaşırken, önüme bir yarışma linki geldi.

Yarışma ünlü bir antivirüs şirketi tarafından yapılıyordu ve basit bir arcade oyundu. Tek yapmanız gereken en uzun süre engellerden kaçmak ve en yüksek skoru yapan yurtdışı tatili kazanıyordu.

Şöyle basit bir oyun

Koskoca antivirüs şirketi düzenlemiş, bu işte bir iş vardır diyerek daldım oyunun içine. Aklıma ilk gelen şey, yapay zekaya oyunu öğretip ona oynatmak oldu, MarI/O gibi.

Yapay zeka algoritmasının öğrenmesine yardımcı olmak için, oyunun içindeki görselleri toplamam gerekiyordu (ekran görüntüsü almak aklıma sonradan geldi). Oyunun hangi motorla yapıldığını öğrenmek zor olmadı. F12 (Developer Console) ile kayıtlara bakar bakmaz Phaser ile yazıldığını gördüm.

Geliştirici Konsolu, Chrome
Phaser, HTML5 ve Javascript bazlı bir oyun motoru https://phaser.io/tutorials/getting-started-phaser3

Phaser'in dökümanlarını biraz karıştırdıktan sonra şöyle basit bir mantıkla, yaratıklara çarptıktan sonra bir olayın tetiklendiğini düşündüm.

Çarpışma Olayı - https://phaser.io/examples/v2/arcade-physics/on-collide-event

Oyunun resim parçalarını ararken kendimi Phaser öğrenirken buldum.

İşte bu anda anladım! Aslında yapay zekayla uğraşmama falan gerek yokmuş, sadece şu fizik çarpışmalarını durdursam, basitçe ölümsüz oluyordum.

engine.gif
Her şey için yapay zeka kullanmaya gerek yok

Tekrar oyun açıkken konsoldan oyunun değişkenlerini kurcalamaya başladım.

Phaser'in örnek kodlarını okuduktan sonra birkaç muhtemel değişken adı daha edindim. game ve scene.

game.scene.scenes altında 3 tane obje, yani 3 tane sahne bulunuyor. Bunları tek tek incelediğimizde ilki Check, ikincisi Boot, üçüncüsü de Game olarak geçiyor. Game sahnesi bizim ihtiyacımız olan sahne olmalı.

Bu sahnenin içinden fizik olayları (physics events) katmanına ulaşmamız gerekiyor. Bu da fazla uzun sürmüyor, yaşasın düzgün isimlendiren yazılımcılar.

Oyun sahnesindeki fizik olayları

9 eventin içindeki bütün değişkenleri kontrol ettikten sonra en son postupdate eventi imdadıma yetişiyor.

Postupdate içindeki çarpışma elemanları

Colliders yani çarpışmanın sağlanmasına olana sağlayan objenin açıp kapatma düğmesi var.

Active özelliğini false yapıyoruz.

50li36qIjI.gif

Bu kadar. Artık tek yapmam gereken oyunu birkaç saat açık bırakmak :)

Tabii ki bunu yapmayacağım, ne de olsa oyun basit. Sadece yarım saatlik bir antrenmanla en yüksek skora ulaştım bile. Çocukken başlayan arcade sevgim meyvesini veriyor.

Ancak oyun kurallarını incelediğimde, ne yapay zeka/otomasyon, ne de oyunun modifiye edilmesi hakkında hiçbir madde göremedim. Yani bir başkası bunu yaparak kazansa, aslında haklı sayılır. Hatta bunu biri yapıp skorumu geçecek diye her gün korkuyla skor tablosunu incelemedim dersem yalan olur.

Peki bunu nasıl önleyebilirlerdi?

Singleplayer oyunlarda bu tarz "hile"lerin yapılmasını engellemek neredeyse imkansızdır. Alınabilecek önlemlerin çoğu sadece karşınızdaki kişinin işini zorlaştırmak ve uzatmaktır.

Bir ürünü, oyunu veya cihazı kullanıcının eline verdiğiniz anda o şeyin üstünde aklınıza hayalinize gelmeyecek şeyler yapılacaktır, bu kaçınılmazdır. Günümüzde çoğu lisans anahtarı doğrulama sisteminin kırılma şekli de bu basit prensibe dayanmaktadır.

Hatta bu davranış tarihe Oracle9i sisteminin ilk piyasa sürülüşüyle adını altın harflerle yazdırmıştır. Sistem piyasaya "Hacklenemez, kırılamaz ve girilemez" gibi reklamlarla çıkmasından kısa bir süre sonra önce sistem, sonra da Oracle'ın web sitesi onbinlerce saldırıya maruz kaldı ve hacklendi. Abi Mac'lere virüs girmiyor, kardeşim ben Fedora kullanıyorum Virus-free ve asla hacklenemez gibi sözler tamamiyle yalan olmakla birlikte, sadece bilgisiz insanların kullandıkları ürünler hakkında iyi hissetmelerini sağlayan bir pazarlama stratejisidir. Bunları da unutmamak gerekiyor.

Kullanıcı tarafında (client-side) yapılabilecek tek şey obfuscationdur. O da koruma sağlamaz.

Obfuscation, dürüst insanları dürüst tutar.

Yukarıda verdiğim oyunda yapılabilecek en basit koruma yöntemi, değişken isimlerini rastgeleleştirmekti. Örneğin

Orjinal Kod
Obfuscated Kod - https://obfuscator.io/ > http://www.jsnice.org/

Hangisini okumak daha kolay?

Obfuscation bir şifreleme yöntemi değildir, sadece işleri biraz daha zorlaştırır ve en azından dürüst insanları dürüst tutar.

Diğer bir çözüm de, oyunu tamamen single-player tutmak yerine, sunucuyla etkileşime sokmaktır.

Basitçe, turuncu ok etkileşimini eklemek yeterli. Basılan tuşlar, geçen zaman, çarpılan engeller gibi bütün olayları kullanıcı tarafında işlemenin yanında, sunucuya da göndererek hile kaydını sunucu tarafında yapmak yeterli olacaktır.

Genellikle geliştirdiğiniz oyuna sunucu katmanı eklediğiniz zaman geliştirme süresi 2 katına çıkar, ancak sadece kayıt tutmak ve basit şekilde bu kayıtları kontrol etmek için eklenecek bu katman, hile girişimlerini büyük ölçüde azaltacaktır.

Bu yazıda anlattıklarım aslında o kafamızda yer etmiş hacker portresine pek benzemese de, aslında düşünce yöntemi olarak "hack" kavramıyla örtüşüyor. Yaptığımız şey basitçe bir şeyin nasıl çalıştığını öğrenmek, ve onu istediğimiz gibi çalışmaya zorlamaktı. Bizim kullanacağımızı düşündükleri kalıbın dışına çıkmaktı. Bu yönden hackerlar ve ressamlar birbirlerine çok benzerler. Hatta bu görüşü derinlemesine anlatan, okumanızı şiddetle tavsiye ettiğim bir kitap var, Hackers & Painters, Paul Graham.

İnternet böyle basit açıklarla dolu yüzbinlerce yarışma ve oyunla dolu. Her gün kullandığımız cep telefonları, modemler ve hatta televizyonlar da öyle. Sadece birinin çıkıp onu bulmasını bekliyorlar.

Okuduğunuz için teşekkürler!

Bir dahaki yazıda görüşmek üzere, sağlıcakla kalın.