Strategi untuk Mengalahkan Editor Memori untuk Berselingkuh - Game Desktop [ditutup]


35

Saya berasumsi kita sedang berbicara tentang permainan desktop - sesuatu yang pemain unduh dan jalankan di komputer lokal mereka. Banyak di antaranya adalah editor memori yang memungkinkan Anda mendeteksi dan membekukan nilai, seperti kesehatan pemain Anda.

Bagaimana Anda mencegah kecurangan melalui modifikasi memori? Strategi apa yang efektif untuk memerangi kecurangan seperti ini?

Untuk referensi, saya tahu bahwa pemain dapat: - Mencari sesuatu berdasarkan nilai atau rentang - Mencari sesuatu yang mengubah nilai - Mengatur nilai memori - Membekukan nilai memori

Saya mencari beberapa yang bagus. Dua yang saya gunakan yang biasa-biasa saja adalah:

  • Menampilkan nilai sebagai persentase alih-alih angka (mis. 46/50 = 92% kesehatan)
  • Kelas tingkat rendah yang menyimpan nilai dalam array dan memindahkannya dengan setiap perubahan. (Misalnya, alih-alih int, saya memiliki kelas yang merupakan array int, dan setiap kali nilainya berubah, saya menggunakan item array yang dipilih secara acak untuk menyimpan nilai)

Gim ini offline, gratis, dan pemain tunggal.

Sunting: untuk anak cucu, saya memecahkan ini (dalam C #) dan memposting solusi saya di sini , di blog saya.

Jawaban:


21

Kemungkinan lain (untuk nilai integer) adalah memiliki variabel anggota kedua yang memegang pelengkap bitwise dari variabel yang ada.

Jadi bayangkan Anda punya health, Anda juga akan punya healthComplement. Implementasi Anda dapat terlihat seperti ini:

// 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;
}

Seseorang yang ingin menyontek harus mengatur kesehatan dan pelengkapan kesehatan dengan benar, jika tidak game akan macet.

Saya pikir agak sia-sia mencoba mencegah hal-hal seperti ini. Orang-orang telah berhasil membuat hacks / menipu untuk hal-hal yang jauh lebih kompleks dan itu hanya mengaburkan kode Anda atau membuat permainan Anda berkinerja lebih buruk.


12

Inilah satu skema yang saya buat ketika seseorang memintanya di papan sejak lama. Menggunakan persentase atau dua kali lipat variabel tidak benar-benar berfungsi, karena Anda dapat mencari nilai "apa saja" dan membekukannya.

Sebagai gantinya, buat monster dari tipe data.

Pada dasarnya, simpan nilai-nilai penting Anda sebagai struktur dengan:

  • 32 pointer ke bit
  • Untuk membaca cepat, minta struct menyertakan nilai saat ini juga sebagai int polos

Untuk manipulasi, kumpulkan nilai saat ini dari bit yang dialokasikan secara terpisah (yang dapat berupa true / false ints), ubah nilainya, lalu simpan kembali.

Inilah bagian buruknya: setiap kali Anda memanipulasi nilainya, bebaskan dan alokasikan kembali bit tersebut. Alokasi harus terjadi dalam urutan acak , sehingga data melompat-lompat di memori dan tidak dapat dibekukan dengan mudah.

Perlindungan tambahan akan menyimpan checksum dari nilai-nilai (serta int "polos") dan membandingkannya selama panggilan manipulasi juga. Jika ketidakcocokan ditemukan, lakukan sesuatu yang halus, seperti menghapus kunci acak yang diperlukan untuk membuka kunci pintu untuk maju dalam permainan.

Sunting: Untuk pergerakan memori lebih lanjut, pastikan Anda mengalokasikan "bit" baru sebelum membebaskan yang lama.

Sunting: Untuk game multi-pemain, dimungkinkan untuk membuat serialisasi struktur data, mengompresnya, dan mengirimkannya melalui jaringan. Bukan penggunaan jaringan yang paling efisien, tetapi jelas sulit untuk mencari tahu melalui packet sniffing.


9

Bagaimana kalau Anda menyimpan kesehatan yang dilengkapi dengan nilai acak yang dihasilkan setiap kali Anda menyimpannya. Ini setidaknya akan mengalahkan mekanisme sederhana untuk mencari peningkatan / penurunan nilai dalam memori untuk menemukan kesehatan.

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;
    }
  }
}

Selain itu, Anda mungkin ingin mengatur ulang nilai setiap frame, meskipun kesehatannya tidak berubah. Ini akan mencegah orang mencari alamat yang diubah ketika kesehatan mereka berubah dan itu tetap sama ketika kesehatan mereka tetap sama.

Bonus: Buat objek baru setiap kali itu berubah sehingga memori addresess berubah, dan atur kesehatan untuk mengubah angka acak, nilai xored, dan alamat dalam memori setiap kali Anda membacanya :

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

Meskipun saya membuat komentar pertama yang mempertanyakan titik merendahkan pengalaman sebagian audiens Anda tanpa keuntungan yang jelas, saya masih menemukan itu pertanyaan yang menarik dari sudut pandang teknis.

Saya hanya punya ide ini: Apa yang dilakukan curang adalah menemukan nilai yang mengubah dan membekukannya. Pencarian kemudian akan terjadi hanya antara kematian atau peristiwa yang mengubah kesehatan pemain. Selain itu, penipu bisa menyempurnakan pencarian dengan menyaring apa yang berubah ketika dia "tidak sekarat".

Bagaimana jika penghitung "kesehatan" berubah sepanjang waktu? Jadikan sebagai pointer dan realokasi setiap frame atau setiap frame N jika hit kinerja terlalu besar. Atau XOR dengan nilai acak yang mengubah setiap frame (XOR lagi terhadap nilai yang sama untuk mendekripsi sebelum mengenkripsi dengan nilai acak baru).

Jika Anda memiliki data dalam game lainnya yang juga mengubah seluruh waktu (termasuk posisi x dan y dari karakter pemain, atau penghitung waktu), yang mungkin membuat lebih sulit untuk mengetahui dari mana semua data yang berubah adalah kesehatan. Dan membekukan seluruh kondisi permainan adalah hal yang tidak boleh dilakukan oleh penipu.

Untuk menyesatkan lebih lanjut, Anda sebenarnya dapat menyimpan kesehatan dalam variabel hanya-tulis yang berarti pot madu.

Edit :

Namun, penipu mungkin mencoba menemukan variabel mana yang berubah sepanjang waktu yang dibekukan melalui coba-coba. Solusi yang mungkin adalah menggabungkan pasangan variabel.

Sebuah contoh:

Alih-alih menyimpan kesehatan (h) dan posisi (x), Anda menyimpannya dalam dua variabel a dan b, dari mana Anda dapat mengambil nilai nanti:

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

Dengan cara ini, jika penipu hanya membekukan salah satu dari mereka dan kemudian memindahkan karakter, posisi terpengaruh dan, tergantung pada yang dibekukan, h menjadi negatif (kematian instan). Anda dapat beralih di antara rumus di atas dan:

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

Dalam frame yang berurutan, dan Anda menjamin bahwa paling banyak 2 frame setelah salah satu variabel dibekukan, kesehatan akan berubah 0 saat x berubah. Ingatlah bahwa Anda hanya menyimpan a dan b. Gabungkan ini dengan XOR kontinu seperti yang disebutkan di atas. Hasilnya adalah kumpulan variabel yang mengubah setiap frame ke nilai yang tampaknya acak, dan membekukan satu atau sebagian dari mereka hanya menghasilkan efek samping yang tidak diinginkan dalam permainan, kematian instan menjadi salah satunya.


7

Salah satu opsi yang mungkin saya pikir mungkin berhasil (saya tidak terlalu terbiasa dengan alat curang ini): jangan sembunyikan. Lakukan operasi Anda dan harapkan hasil tertentu. Setelah operasi (mungkin frame berikutnya), periksa untuk memastikan bahwa hasilnya seperti yang Anda harapkan. Jika Anda mengurangi kesehatan lalu memverifikasinya, hanya untuk menemukan kesehatan tidak pernah berubah, Anda bisa sangat yakin (asalkan Anda tidak memiliki bug yang tidak jelas) bahwa itu dikunci.

Jika Anda mendeteksi kecurangan, Anda sekarang dapat mengubah aturan permainan sesuai keinginan Anda untuk mendapatkan kesedihan yang maksimal, jika itu adalah keinginan Anda. Jika niat Anda adalah untuk mengabaikan kecurangan dan membuat game terus bekerja, realokasi kesehatan di tempat lain dalam memori dan ubah pointer Anda sehingga nilai baru digunakan dan yang lama diabaikan. Ulangi tak terhingga iklan.


6

Setiap upaya kebingungan semata-mata pasti gagal dalam teori, tetapi dalam praktiknya Anda hanya perlu membuatnya cukup sulit untuk dipecahkan sehingga tantangan menjadi kurang menyenangkan daripada berhasil dalam permainan. Saya tidak tahu apa permainan Anda, jadi saya tidak akan mengambil risiko menyarankan metode kebingungan data, apalagi karena saya percaya itu tidak ada gunanya.

Yang mengatakan, dan Anda mungkin tidak akan menyukainya, saya yakin Anda sedang mencari penghilang memori , yang merupakan konsep Trusted Computing .


3

Salah satu teknik yang sangat efektif digunakan oleh beberapa roguelikes (DoomRL, Brogue) adalah untuk menutupi variabel aktual. Ini berarti bahwa alih-alih menunjukkan kesehatan sebagai "2/10," menunjukkannya sebagai "20%."

Ingat, sebagian besar editor memori bekerja dengan baik dengan pencarian / penyaringan nilai tertentu. Jika Anda tidak tahu nilai spesifiknya, Anda masih bisa melacaknya (mis. Mencari nilai yang berubah / berkurang setelah kesehatan pemain turun), meskipun perlu waktu lebih lama untuk melakukannya dengan cara itu.

Saya juga menyarankan serangan anti-cheat. Misalnya, jika Anda memiliki permainan di mana pemain mengalami kerusakan non-positif dan kesehatannya tidak turun, Anda dapat dengan mudah dan akurat memeriksanya dan mengetahui bahwa pemain tersebut curang. Lakukan sesuatu yang menarik, seperti menelurkan beberapa musuh uber di sekitarnya :)


2

Tulis driver ring 0 yang mengaitkan SSDT dan log / blok ketika ReadProcessMemory / WriteProcessMemory dipanggil pada aplikasi Anda. Akan lebih baik untuk hanya login sehingga Anda dapat secara perlahan mengubah perilaku game mereka dari waktu ke waktu daripada hanya crash.


Kedengarannya Anda berbicara tentang detail implementasi tingkat rendah (Windows API?) Saya bertanya tentang strategi tingkat tinggi secara umum.
ashes999

2

Mengapa Anda mencegah pemain dari menipu diri mereka sendiri (yang curang dalam permainan pemain tunggal berarti)? Dalam lingkungan multipemain, itu adalah tugas server untuk mendeteksi perubahan yang tidak wajar dan melawannya (biasanya dengan mengabaikan input atau memblokir pelakunya sepenuhnya dari server), tetapi dalam lingkungan pemain tunggal tidak ada yang terjadi kecuali penipu melakukan sendiri tindakan merugikan.

TKI, kecuali Anda membuat game multi-pemain, itu hanya membuang-buang uang, dan jika Anda berpikir untuk memperkeras tempat yang salah.


2

Penelitian alat kecurangan yang dikenal - dan sering memeriksa apakah ada yang paling umum terdeteksi berjalan (periksa nama proses?)

Jika ada yang terdeteksi, biarkan pemain curang (jika offline, tidak berbahaya), tetapi pastikan tidak ada skor / pencapaian akan diposting ke sistem papan peringkat / pencapaian online - buat saja gagal secara diam-diam?

Tidak akan menghentikan lebih banyak peretas yang gigih, tetapi akan mengurangi kemungkinan lebih banyak cheat biasa mengacaukan papan peringkat Anda.

(Mungkin para pembuat kode yang menjengkelkan yang memiliki perangkat dev terbuka dan diminimalkan untuk tujuan yang sah dan sedang istirahat sejenak, ...)


7
Saya adalah penggemar berat Steam sebagai platform distribusi, dan memainkan banyak Team Fortress II beberapa tahun yang lalu. Suatu malam, saya mengambil istirahat dari sesi pengkodean panjang dan meninggalkan Visual Studio terbuka dan debugger saat saya bermain. Saya menemukan diri saya dilarang TF2 karena "menipu." Tidak ada banding, tidak ada kerangka kerja untuk mencabut larangan. Satu "pelanggaran" dan bersifat permanen untuk akun tersebut. Saya masih tidak tahu mengapa - dan percayalah, saya marah - kecuali bahwa saya melihat terkubur dalam sebuah FAQ yang membuka "editor memori" saat bermain game merupakan kecurangan dan dilarang. Wow.

1

Saya pikir solusi paling sederhana untuk ini adalah menerapkan opsi cheat. Nonaktifkan scoring saat dalam opsi cheat.

Ide bagus lainnya, yang saya tidak tahu bagaimana Anda akan menerapkan. Adalah mematikan game ketika ada variabel memori beku atau sesuatu seperti itu :)

Semoga berhasil (y)


3
Menerapkan cheat adalah opsi yang bagus. Mematikan permainan, tidak terlalu banyak ... (bayangkan jika Anda salah, dan matikan pemain yang sah.)
ashes999
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.