Hile İçin Bellek Editörleri Yenmek İçin Stratejiler - Masaüstü Oyunları [kapalı]


35

Sanırım masaüstü oyunlarından bahsediyoruz - oyuncunun indirdiği ve yerel bilgisayarında çalıştırdığı bir şey. Çoğu, oynatıcınızın sağlığı gibi değerleri algılamanıza ve dondurmanıza izin veren bellek editörleridir.

Bellek değiştirmeyle hile yapmayı nasıl önlersiniz? Bu tür hile ile mücadelede hangi stratejiler etkilidir?

Başvuru için, oyuncuların yapabileceklerini biliyorum: - Değer veya aralığa göre bir şey ara - Değer değiştiren bir şey ara - Bellek değerlerini ayarla - Bellek değerlerini dondur

Ben iyi olanları arıyorum. Kullandığım iki vasat:

  • Değerleri sayı yerine yüzde olarak görüntüleme (örn. 46/50 =% 92 sağlık)
  • Bir dizideki değerleri tutan ve bunları her değişiklikle taşıyan düşük seviyeli bir sınıf. (Örneğin, int yerine, bir ints dizisinden oluşan bir sınıfa sahibim ve değer değiştiğinde, değeri tutmak için rastgele seçilen farklı bir dizi öğesi kullanıyorum)

Oyun çevrimdışı, ücretsiz ve tek oyunculu.

Düzenleme: gelecek nesil için, bunu (C # 'da) çözdüm ve çözümümü buraya yazdım, blogumda.

Yanıtlar:


21

Diğer bir olasılık (tamsayı değerleri için), mevcut bir değişkenin bitsel bir tamamlayıcısını tutan ikinci bir üye değişkenine sahip olmaktır.

Öyleyse health, sahip olduğunu hayal et healthComplement. Uygulamanız şöyle görünebilir:

// setter sets value and complement
void setHealth(int value){
    health = value;
    healthComplement = ~value;
}

// getter checks if value was changed outside of the setter
int getHealth(){
    if(value != ~healthComplement){
        // launch some cheat-counter-measure, like crashing the game?
        exit;
    }
    return health;
}

Hile yapmak isteyen biri sağlık ve sağlık kodunu doğru bir şekilde belirlemek zorunda kalacak, aksi takdirde oyun çökecek.

Bence böyle şeyleri önlemeye çalışmak anlamsız. İnsanlar çok daha karmaşık şeyler için başarılı bir şekilde hack / hileler yarattılar ve kodunuzu gereksiz yere engeller veya oyununuzun daha kötü performans göstermesini sağlar.


12

İşte birileri uzun zaman önce bir gemide bunu isterken ortaya çıktığım bir şema. Yüzdeleri veya iki katına çıkmış değişkenleri kullanmak gerçekten işe yaramaz, çünkü “herhangi” değerlerini arayabilir ve bunları dondurabilirsiniz.

Bunun yerine, veri türünden bir canavar yaratın.

Temel olarak, önemli değerlerinizi aşağıdaki gibi bir yapı olarak depolayın:

  • 32 işaretçi bit
  • Hızlı okuma için, yapıya geçerli değeri düz bir int olarak da ekleyin.

Manipülasyon için, ayrı ayrı tahsis edilmiş bitlerden (doğru / yanlış inç olabilir) mevcut değeri toplayın, değeri değiştirin ve ardından bunları tekrar saklayın.

İşte bu iğrenç bit: değeri her kullanışınızda, özgür ve bitleri yeniden tahsis ediyorsunuz. Tahsis rastgele sırada yapılmalıdır , böylece veriler bellekte atlar ve kolayca dondurulamaz.

Ek korumalar, değerlerin sağlama toplamlarını ("düz" int) olduğu gibi depolamak ve bunları manipülasyon çağrıları sırasında karşılaştırmak olacaktır. Uyuşmazlık bulunursa, oyunda ilerlemek için kapıları açmak için gereken rastgele bir anahtarı kaldırmak gibi ince bir şey yapın.

Düzenleme: Daha fazla hafıza hareketi için, eskileri serbest bırakmadan önce yeni "bitleri" ayırdığınızdan emin olun.

Düzenleme: Çok oyunculu oyunlar için, veri yapısını serileştirmek, sıkıştırmak ve ağ üzerinden göndermek de mümkündür. Ağın en verimli kullanımı değil, paket koklama yoluyla bunu çözmek kesinlikle daha zor.


9

Her sakladığınızda üretilen rastgele bir değerle tamamlanan sağlığı saklamanız nasıl olur. Bu, en azından sağlığı bulmak için bellekteki değerleri arttırma / azaltma arayışındaki basit mekanizmayı yenecektir.

class Player
{
  int m_Health;
  int m_RandomHealth;
  Random m_Rnd = new Random();

  public int Health {
    get
    {
      return m_Health ^ m_RandomHealth;
    }

    set
    {
      m_RandomHealth = m_Rnd.Next();
      m_Health = value ^ m_RandomHealth;
    }
  }
}

Ayrıca, sağlık değişmese bile her karenin değerini sıfırlamak isteyebilirsiniz. Bu, insanların sağlıkları değiştiğinde değişen adresleri aramasını ve sağlıkları aynı kaldığında aynı kalmasını önler.

Bonus: Her değiştirilişinde yeni bir nesne oluşturun, böylece hafıza adres değiştirir ve sağlığı her okuduğunuzda rasgele sayı, xored değer ve adres değiştirilecek şekilde ayarlanır :

class Player
{
  int [] m_HealthArray; // [0] is random int, [1] is xored health
  Random m_Rnd = new Random();

  public Player() {
    this.Health = 100;
  }

  public int Health {
    get
    {
      int health = m_HealthArray[0] ^ m_HealthArray[1];
      Health = health; // reset to move in memory and change xor value
      return health;
    }

    set
    {
      m_HealthArray = new int[2];
      m_HealthArray[0] = m_Rnd.Next();
      m_HealthArray[1] = m_HealthArray[0] ^ value;
    }
  }
}

8

İlk yorumu, izleyicinizin bir kısmının deneyimini belirgin bir kazanç elde etmediği için düşürme noktasını sorgulamasam da, teknik açıdan yine de ilginç bir soru buluyorum.

Ben sadece bu fikre sahiptim: Dolandırıcıların yaptığı, onları değiştiren ve donduran değerleri bulmak. Arama daha sonra sadece oyuncunun sağlığını değiştiren ölümler veya olaylar arasında gerçekleşecekti. Ayrıca, dolandırıcı, "ölmediğinde" neyin değiştiğini filtreleyerek aramayı daraltabilir.

Ya "sağlık" sayacı sürekli değişiyorsa? Bir işaretçi yapın ve performans vuruşu çok büyükse, her kareyi veya her N kareyi yeniden konumlandırın. Veya her kareyi değiştiren rastgele bir değerle XOR (XOR, yeni bir rasgele değerle şifrelemeden önce şifresini çözmek için aynı değere karşı tekrar XOR).

Oyun içi verileriniz de bütün zaman boyunca değişiyorsa (oyuncu karakterinin x ve y pozisyonları veya zaman sayacı dahil), değişen tüm verinin sağlık durumunun hangisi olduğunu bulmayı zorlaştırabilir. Ve tüm oyun durumunu dondurmak dolandırıcı için bir yol değildir.

Daha fazla yanıltmak için, aslında sağlığı bir bal kabağı olarak adlandırılan salt salt okunur bir değişkende saklayabilirsiniz.

Düzenle :

Yine de dolandırıcı, bütün zamanı değiştiren değişkenlerden hangisinin deneme yanılma yoluyla donacak olanı bulmaya çalışabilir. Muhtemel bir çözüm değişkenleri bir araya getirmek olabilir.

Bir örnek:

Sağlık (h) ve konum (x) depolamak yerine, bunları daha sonra değerleri alabileceğiniz a ve b değişkenlerinde saklarsınız:

a = x+h; b = x-h
x = (a+b)/2; h = (a-b)/2

Bu şekilde, dolandırıcı bunlardan yalnızca birini dondurur ve ardından karakteri hareket ettirirse, pozisyon etkilenir ve hangisinin donmuş olduğuna bağlı olarak, h negatif olur (anlık ölüm). Yukarıdaki formüller arasında geçiş yapabilirsiniz:

a = x-h; b = x+h
x = (a+b)/2; h = (b-a)/2

Ardışık karelerde ve değişkenlerden birinin donmuş durumundan sonra en fazla 2 karede x'in değiştiği anda 0'a döneceğini garanti edersiniz. Sadece a ve b sakladığınızı unutmayın. Bunu, yukarıda belirtildiği gibi sürekli XOR ile birleştirin. Sonuç, her kareyi görünüşte rastgele değerlere değiştiren ve herhangi birini veya alt kümesini dondurmak, oyunda yalnızca istenmeyen yan etkilere neden olan, anlık ölüm onlardan biri olan değişkenlerin bir koleksiyonudur.


7

Çalışabileceğimi düşündüğüm olası bir seçenek (bu hile araçlarına aşina değilim): saklamayın. İşlemlerinizi gerçekleştirin ve kesin sonuçlar bekleyin. Operasyondan sonra (muhtemelen sonraki kare), sonuçların beklediğiniz gibi olduğundan emin olun. Sağlığı çıkarır ve sonra doğrularsanız, yalnızca hiçbir zaman değişmeyen sağlığı bulmak için kilitli olduğundan (belirsiz bir hata olmaması koşuluyla) emin olabilirsiniz.

Hile tespit ederseniz, oyunun kurallarını değiştirmek için artık özgürsünüz. Amacınız hile yapmaktan kaçınmak ve oyunun çalışmaya devam etmesini sağlamaksa, hafızanın başka bir yerinde sağlığı yeniden konumlandırın ve işaretçilerinizi yeni değerin kullanılacağı ve eskisinin göz ardı edileceği şekilde değiştirin. Reklamı infinitum tekrarlayın.


6

Sadece şaşırtma girişimlerinin teorik olarak başarısızlığa uğraması zorunludur, ancak pratikte mücadelenin oyunda başarılı olmaktan daha az eğlenceli hale gelmesini sağlamak için yeterince zorlaştırmanız gerekir. Oyununun ne olduğunu bilmiyorum, bu yüzden anlamsız olduklarına inandığımdan daha az veri gizleme yöntemleri önerme riskini almayacağım.

Dedi ve muhtemelen bundan hoşlanmayacaksınız , bir Güvenilir Bilgi İşlem konsepti olan hafıza perdesi aradığınızı düşünüyorum .


3

Bazı roguelikes (DoomRL, Brogue) tarafından kullanılan çok etkili bir teknik , gerçek değişkenleri maskelemektir. Bunun anlamı, sağlığı "2/10" olarak göstermek yerine, "% 20" olarak göstermesidir.

Unutmayın, çoğu bellek editörü belirli değer arama / filtreleme ile iyi çalışır. Belirli bir değeri bilmiyorsanız, hala izleyebiliyorsunuz (örneğin, oyuncu sağlığı düştükten sonra değişen / azalan değerleri arayın), ancak bu şekilde yapması çok uzun sürüyor.

Aynı zamanda hile karşıtı bir tepki göstermesini öneriyorum. Örneğin, oyuncunun pozitif hasar almadığı ve sağlığının düşmediği bir oyununuz varsa, bunu kolayca ve doğru bir şekilde kontrol edebilir ve oyuncunun hile yaptığını bilirsiniz. İlginç bir şey yapın, etrafındaki uber düşmanları ortaya çıkarmak gibi :)


2

Uygulamanızda ReadProcessMemory / WriteProcessMemory çağrıldığında SSDT'yi bağlayan ve günlükleri / blokları gösteren bir halka 0 sürücüsü yazın. Sadece giriş yapmak daha iyi olur, böylece oyundaki davranışlarını sadece çarpışma yerine yavaşça değiştirebilirsiniz.


Düşük seviye uygulama detaylarından (Windows API?) Bahsediyorsunuz gibi geliyor. Genel, üst düzey stratejiler hakkında sorular soruyorum.
ashes999

2

Neden oyuncuların kendilerini aldatmalarını önlüyorsun (tek oyunculu bir oyunda hile yapmak)? Çok oyunculu bir ortamda, doğal olmayan değişiklikleri tespit etmek ve bunlara karşı koymak (genellikle girişi yok sayarak veya suçluyu sunucudan tamamen engelleyerek) engellemek sunucunun görevidir, ancak tek bir oynatıcı ortamında dolandırıcıların kendisi dışında başka hiçbir şey olmaz. kötülük.

Çok oyunculu bir oyun yaratmadığınız sürece, bu para harcamak ve eğer yanlış yeri sertleştirmeyi düşünüyorsanız.


2

Bilinen hile araçlarını araştırın - sıkça rastlananlardan herhangi birinin çalışma tespit edilip edilmediğini kontrol edin (işlem adlarını kontrol edin?)

Herhangi bir tespit olursa, oynatıcının hile yapmasına izin verin (çevrimdışıysa zararsızdır), ancak herhangi bir çevrimiçi afiş / başarı sistemine hiçbir puan / başarı gönderilmediğinden emin olun;

Daha kararlı bilgisayar korsanlarını durduramaz, ancak daha sıradan hilelerin liderlik tablolarınızı karıştırmasını engeller.

(Dev araçlarının okunaklı olması ve okunaklı olması için en aza indirgenmiş kodlayıcılar olabilir, ancak oyun molası veriyorlar ...)


7
Bir dağıtım platformu olarak Steam'in büyük bir hayranıydım ve birkaç yıl önce çok fazla Team Fortress II oynadım. Bir akşam, uzun bir kodlama oturumundan ara verdim ve oyun oynarken Visual Studio ve hata ayıklayıcıyı açık bıraktım. Kendimi TF2'den "aldatma" için yasaklanmış buldum. İtiraz yok, yasağın kaldırılması için çerçeve yok. Bir "suç" ve hesap için kalıcıdır. Neden hala hiçbir fikrim yoktu - ve inan bana, tökezledi - sadece bir SSS'ye gömüldüğümde, oyunu oynarken açık bir "hafıza editörü" almanın hile oluşturduğunu ve yasaklanabileceğini gördüm. Vay.

1

Bence bunun en basit çözümü bir hile seçeneği uygulamak. Hile seçeneğindeyken puanlamayı devre dışı bırakın.

Başka bir iyi fikir, nasıl uygulayacağınız hakkında hiçbir fikrim yok. Donmuş bir bellek değişkeni veya bunun gibi bir şey olduğunda oyunu kapatmak olur :)

İyi şanslar (Y)


3
Hileleri uygulamak iyi bir seçenektir. Oyunu kapatmak, o kadar da değil ... (bunu yanlış yaptığını hayal et ve meşru bir oyuncuyu kapat.)
ashes999
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.