Bagaimana gim dapat mencegah orang menjalankan banyak contoh sendiri?

15

Starcraft II membatasi saya untuk menjalankan banyak instance, tetapi jika saya menjalankan instance kedua sandbox di Sandboxie , ia berfungsi. Apa yang menyebabkan ini?

Bagaimana saya bisa meniru perilaku ini untuk permainan saya sendiri?

Brandon
sumber

Jawaban:

15

Selain dari Starcraft 2, jawaban umum untuk ini adalah: Memperoleh (dan mengunci, jika akuisisi itu sendiri belum setara dengan mengunci) sumber daya tertentu dari sistem operasi. Keluar dari game jika akuisisi / penguncian gagal. Contoh sumber daya tersebut adalah:

  1. Port TCP atau UDP tertentu.
  2. Kunci yang saling eksklusif ("mutex") atau semaphores (keduanya sering terkait pada level OS)
  3. File (file log seringkali merupakan pilihan yang paling jelas)

Di ujung atas, paling menyakitkan dalam hal pelanggan, perangkat keras khusus yang (kadang-kadang, seperti untuk beberapa komponen kontrol robot) hanya dapat digunakan secara eksklusif oleh satu utas dapat digunakan dengan cara ini juga.

Martin Sojka
sumber
5
Juga mungkin berguna untuk mengingat kemungkinan komplikasi keamanan: " Program satu-contoh adalah penolakan layanan sendiri ".
EnoughTea
Karena bekerja di sandboxie, itu mungkin bukan yang pertama. 2 atau 3 adalah kemungkinan yang baik, melihat file apa yang terbuka untuk proses mereka mungkin akan menunjukkannya.
Doug-W
3
@ Doug-W Saya tidak melihat cara kerjanya di sandboxie mengesampingkan # 1.
AttackingHobo
@AttackingHobo kecuali saya rindu memahami kompleksitas sandboxie, bukankah fakta bahwa port terikat di luar sandboxie menghalanginya dari mengikat di dalam? Atau apakah sandboxie menyediakan antarmuka virtual untuk setiap program yang berjalan di dalamnya?
Doug-W
@Vigil Sejauh yang saya ketahui, Anda mungkin mengutip Raymond Chen sepanjang hari, tapi tolong jangan menambahkan kesalahan tata bahasa pada kutipannya. : P (Cukup salin / tempel saja.)
hheimbuerger
4

Saya merekomendasikan pendekatan mutex, tetapi:

Metode lain yang sering digunakan adalah hanya memeriksa apakah proses lain dengan nama yang sama sedang berjalan.

Keuntungannya adalah sangat mudah - Anda tidak perlu khawatir tentang izin file atau tahu apa itu mutex. Kekurangannya adalah, Anda akan mendapatkan positif palsu jika berbeda program yang disebut starcraft2.exeberjalan pada mesin.

BlueRaja - Danny Pflughoeft
sumber
2
Hehe, atau jika pengguna memutuskan untuk mengganti nama program.
Brandon
@ Jonathan: Maka jangan hardcode nama yang dapat dieksekusi ...
BlueRaja - Danny Pflughoeft
1
Maksud saya lebih seperti, bagaimana jika pengguna menyalin program dan mengganti namanya & menjalankannya dua kali?
Brandon
3

Jika Anda menggunakan C ++ dan Windows API, salah satu cara yang dapat Anda lakukan adalah menggunakan FindWindow, tempat Anda dapat melewatkan parameter seperti nama kelas dan / atau nama jendela. Kemudian jika Anda menemukan kecocokan, keluar saja dari program Anda bahkan sebelum Anda memuat atau membuat jendela.

SourceTurtle
sumber