Làm thế nào một trò chơi có thể ngăn mọi người chạy nhiều phiên bản của chính nó?


15

Starcraft II hạn chế tôi chạy nhiều phiên bản, nhưng nếu tôi chạy phiên bản thứ hai được sandbox trong Sandboxie , nó hoạt động. Điều gì có thể giải thích cho điều này?

Làm thế nào tôi có thể sao chép hành vi này cho các trò chơi của riêng tôi?

Câu trả lời:


15

Ngoài Starcraft 2, câu trả lời chung cho vấn đề này là: Mua lại (và khóa, nếu bản thân việc mua lại chưa tương đương với khóa) một tài nguyên cụ thể từ hệ điều hành. Thoát khỏi trò chơi nếu việc mua / khóa thất bại. Ví dụ về các tài nguyên đó là:

  1. Các cổng TCP hoặc UDP cụ thể.
  2. Các khóa loại trừ lẫn nhau ("mutexes") hoặc semaphores (hai loại này thường liên quan đến cấp độ hệ điều hành)
  3. Tệp (tệp nhật ký thường là lựa chọn rõ ràng nhất)

Trên đỉnh cao, hầu hết các ứng dụng dành cho khách hàng, phần cứng chuyên dụng (đôi khi nhất thiết, như đối với một số thành phần điều khiển robot) chỉ có thể được sử dụng riêng cho một chủ đề theo cách này.


5
Ngoài ra, có thể hữu ích khi ghi nhớ các biến chứng bảo mật có thể xảy ra: " Một chương trình đơn lẻ là từ chối dịch vụ riêng ".
EnoughTea

Vì nó hoạt động trong sandboxie, có lẽ nó không phải là lần đầu tiên. 2 hoặc 3 là những khả năng tốt, xem xét những tập tin nào được mở cho quy trình của họ có thể sẽ xác định chính xác nó.
Doug-W

3
@ Doug-W Tôi không thấy nó hoạt động như thế nào trong quy tắc sandboxie # 1.
Tấn

@AttackingHobo trừ khi tôi bỏ lỡ hiểu sự phức tạp của sandboxie, thực tế là một cổng bị ràng buộc bên ngoài sandboxie có ngăn cản nó ràng buộc bên trong không? Hay sandboxie cung cấp một giao diện ảo cho mỗi chương trình chạy bên trong nó?
Doug-W

@Vigil Theo như tôi quan tâm, bạn có thể trích dẫn Raymond Chen cả ngày, nhưng vui lòng không thêm lỗi ngữ pháp vào trích dẫn của anh ấy. : P (Chỉ cần sao chép / dán chúng thay thế.)
hheimbuerger

4

Tôi khuyên bạn nên sử dụng phương pháp mutex, nhưng:

Một phương pháp khác thường được sử dụng chỉ đơn giản là kiểm tra xem một quy trình khác có cùng tên đang chạy hay không.

Ưu điểm là nó cực kỳ dễ dàng - bạn không phải lo lắng về quyền truy cập tệp hoặc biết mutex là gì. Nhược điểm là, bạn sẽ có kết quả dương tính giả nếu một chương trình khác được gọi starcraft2.exeđang chạy trên máy.


2
Hehe, hoặc nếu người dùng quyết định đổi tên chương trình.
Brandon

@Jonathan: Sau đó, đừng mã hóa tên thực thi ...
BlueRaja - Danny Pflughoeft

1
Ý tôi là giống như, nếu người dùng sao chép chương trình và đổi tên chương trình & chạy nó hai lần thì sao?
Brandon

3

Nếu bạn đang sử dụng C ++ và API Windows, một cách bạn có thể làm là sử dụng FindWindow, nơi bạn có thể truyền các tham số như tên lớp và / hoặc tên cửa sổ. Sau đó, nếu bạn tìm thấy một trận đấu, chỉ cần thoát khỏi chương trình của bạn trước khi bạn tải hoặc tạo một cửa sổ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.