Ngăn chặn gian lận nhiều người chơi


10

Tôi gần như hoàn thành việc phát triển một game nhiều người chơi theo phong cách indie. Mặc dù tôi có ý định cho phép mọi người gian lận trong phần chơi đơn, nhưng điều này rõ ràng là không thể chấp nhận được ở nhiều người chơi. Có ai biết bất kỳ cách nào để giúp Joe bình thường sử dụng thứ gì đó như Cheat-Engine để sửa đổi các phần của trò chơi không? Tôi hiện có kế hoạch để khách hàng tải lên hàm băm MD5 của mỗi tệp cài đặt mà trò chơi sử dụng (được lưu dưới dạng XML) lên máy chủ trò chơi để xác minh cứ sau vài giây, nhưng tôi có thể làm gì để ngăn chặn những thứ như trình chỉnh sửa bộ nhớ, v.v. ?


2
Tôi sẽ giới thiệu bài viết này, Xây dựng trò chơi nhiều người chơi - Bảo mật được viết cho một số API nhiều người chơi, nhưng các ý tưởng vẫn hay và vẫn được áp dụng
Cyral

Câu trả lời:


8

Nếu bạn lo lắng về mã được sửa đổi cục bộ, thì làm sao bạn có thể chắc chắn rằng ai đó đã đơn giản sửa đổi mã thông báo của bạn để gửi một danh sách tĩnh các hàm băm MD5, giống như những gì bạn mong đợi? Trên thực tế, bạn thậm chí không cần sửa đổi mã để làm điều này, bạn chỉ cần một proxy khá cơ bản (giả sử không có SSL, nhưng thậm chí điều đó có thể bị làm giả với nỗ lực hơn một chút).

Cách duy nhất để làm những gì bạn muốn là có một máy chủ và đơn giản là không tin tưởng khách hàng. Tất cả các tính toán nên được xử lý trên máy chủ và tất cả các hành động được xác minh là ít nhất có thể. Chẳng hạn, không cho phép khách hàng nói rằng họ muốn di chuyển sang một bên của bản đồ khi bạn biết họ ở phía bên kia một lúc trước. Không có máy chủ ở giữa làm mọi thứ quan trọng cho trò chơi, không thể không gian lận, bởi vì ai đó thông minh sẽ luôn luôntìm cách xung quanh bất cứ thứ gì bạn có thể xây dựng vào máy khách. Ngay cả với một, vẫn có thể nếu bạn không nghĩ qua tất cả các cách khác nhau để điều khiển tình huống một chút. Chẳng hạn, xác nhận chuyển động mà tôi đã đề cập trước đây: Nếu bạn thực hiện một phép tính điểm đơn giản để mọi người vẫn có thể dịch chuyển tức thời qua các bức tường.

Vì vậy, câu hỏi là, "Joe trung bình" trung bình như thế nào? Bạn đã đề cập đến chỉnh sửa mã và chỉnh sửa bộ nhớ. Đó là trên mức mà cá nhân tôi sẽ xem xét ở mức trung bình, và nếu bạn muốn lo lắng về mức đó thì một máy chủ đáng tin cậy riêng biệt, tất cả các công việc nặng đều được yêu cầu và khách hàng sẽ thực sự chỉ là thiết bị hiển thị và đầu vào.


2
@ user185812: Thường thì nên đợi ít nhất vài giờ trước khi đánh dấu một câu trả lời được chấp nhận. Mặc dù cá nhân tôi nghĩ rằng câu trả lời của tôi khá tuyệt vời (tôi thiên vị), những người khác có thể sẽ có nhiều ý kiến ​​đóng góp hơn và việc nhìn thấy một câu trả lời được chấp nhận thường là một sự ngăn cản để người khác trả lời.
Matthew Scharley

@MatthewScharley - không phải lo lắng. ;)
Martin Sojka

11

Thân chủ nằm trong tay kẻ thù. ( Luật thiết kế thế giới trực tuyến )

Thực sự, cách duy nhất để đánh bại hầu hết các trò gian lận là để khách hàng trở thành một "khách hàng mỏng", đó là: Chỉ hoạt động như một thiết bị đầu vào và đầu ra, và không bao giờ cung cấp cho nó nhiều thông tin hơn nhu cầu chính xác.

Điều này sẽ không tự động hóa và điều này sẽ không dừng thu thập và phân tích thông tin thụ động, nhưng bạn có thể thiết kế trò chơi của mình sao cho chúng không có tác động đáng kể.

Điều này sẽ không ngăn mọi người hack nhau thông qua các tin nhắn không đúng định dạng được dựa trên máy chủ - khách hàng của bạn cần bảo vệ chống lại các tin nhắn từ máy chủ giống như bạn sẽ bảo vệ các trang web của mình khỏi các cuộc tấn công SQL.

Vì bạn cũng muốn sử dụng cùng một máy khách cho trò chơi một người chơi, nên một giải pháp sẽ là chạy một máy chủ cục bộ trong một tiến trình / luồng riêng biệt và coi nó là một cài đặt máy khách / máy chủ. Các "mánh gian lận" sau đó sẽ hoạt động ở phía máy chủ. Minecraft làm điều gì đó tương tự, mặc dù đây không phải là trò chơi đầu tiên tách công cụ trò chơi khỏi giao diện của nó theo cách như vậy.

Cách đọc được đề nghị:


2

Trong một trò chơi nhiều người chơi cơ bản, gian lận trong loại Cheat-Engine đơn giản là không hoạt động. Các máy khách chỉ gửi dữ liệu và các hành động bạn thiết kế để thực hiện. Thông thường, đó không nhiều hơn những gì người chơi đã "làm", ví dụ như anh ta đang chạy theo hướng nào, nếu anh ta đang bắn và cứ thế. Vì vậy, những thay đổi anh ta làm đối với bộ nhớ sẽ chỉ ảnh hưởng đến trò chơi của chính anh ta, nhưng những người chơi khác sẽ không thấy thay đổi, cái gọi là desync. Hầu hết các trò chơi phát hiện các desyncs như thế và loại bỏ trình phát bị loại bỏ khỏi trò chơi.

Bây giờ cũng có những cách gian lận khác, nhưng đó là tất cả về cách trò chơi của bạn được thiết kế.

Để bảo vệ khỏi các hack dễ dàng nhất, giả mạo tin nhắn mạng, máy chủ nên kiểm tra các gói đó xem chúng có tỉnh táo không. "Gã đó chỉ nhảy 5 màn hình? Không thể, từ chối gói." .

Cách gian lận cuối cùng trong nhiều người chơi là hack trực quan, đó là sửa đổi ứng dụng khách để nó hiển thị dữ liệu cho người chơi mà anh ta không biết. Ví dụ cho điều này không cho thấy sương mù chiến tranh, có thể nhìn xuyên qua các bức tường, hiển thị một bản đồ nhỏ hoặc những thứ khác. Đây là không thể ngăn chặn.


Tôi không đồng ý về việc hack tầm nhìn. Không thể ngăn chặn những điều này bằng cách không cung cấp thông tin cho khách hàng cho đến khi nhân vật của họ nhận thức được điều đó? Đừng hiểu sai ý tôi, đây có thể không phải là thiết kế tốt. Nhưng điều đó khác với việc không thể ngăn chặn.
xuincherguixe

@xuincherguixe Tôi nghĩ rằng điều đó là không thể trong một số trường hợp. Ví dụ, cả hai máy khách đang chơi dưới cùng một IP và cùng một cổng. Trong trường hợp như vậy, đó chỉ là thiện chí của khách hàng ngăn anh ta đọc dữ liệu dành cho người khác.
Wodzu

1

Để ngăn chặn các hack Cheat Engine cơ bản thao túng các giá trị của các biến của bạn thì bạn phải ẩn các giá trị đó. Thông thường Cheat Engine được sử dụng để xác định vị trí bộ nhớ của các biến thú vị (giả sử lượng vàng hoặc tuổi thọ hoặc mức nâng cấp của một khả năng) bằng cách tìm kiếm giá trị đã biết của biến đã nói, chơi nhiều trò chơi hơn và khiến giá trị trở thành thay đổi, sau đó Cheat Engine sẽ thực hiện một tìm kiếm mới từ kết quả của tìm kiếm trước đó cho giá trị mới. Điều này cho phép kẻ lừa đảo phóng to vị trí bộ nhớ của giá trị, giờ đây họ có thể thay đổi giá trị của vị trí bộ nhớ đó bằng Cheat Engine.

Ví dụ: tôi có 245 VÀNG ... với Cheat Engine Tôi thực hiện tìm kiếm 245 và tìm nhiều vị trí bộ nhớ. Sau đó, tôi chơi thêm một số thứ và mang số vàng của mình lên tới 314, sau đó tôi tìm kiếm đầu ra tìm kiếm trước đó cho giá trị 314 và dễ dàng tìm vị trí bộ nhớ cho nơi lưu trữ GOLD.

Cách để ngăn chặn điều này là không bao giờ có giá trị thực được lưu trữ trong một vị trí bộ nhớ. Ví dụ, tôi lưu trữ giá trị trong một đối tượng phải tính giá trị thực theo yêu cầu khi được yêu cầu. Vì vậy, hãy nói rằng người chơi có 245 VÀNG. Nếu họ thực hiện tìm kiếm vị trí bộ nhớ có giá trị 245, họ có thể tìm thấy nhiều vị trí nhưng không ai trong số họ sẽ là vị trí bộ nhớ nơi giá trị vàng thực sự được lưu trữ, đó là vì bạn không lưu trữ giá trị 245 cho vàng. Khi trò chơi cần biết bao nhiêu vàng, nó sẽ hỏi đối tượng giữ giá trị của nó, nó sẽ tính toán theo yêu cầu.

Vì vậy, câu hỏi bây giờ là: Làm thế nào chính xác để bạn lưu trữ một giá trị theo cách không tiết lộ nó? Điều này có một chút khó khăn và xấu xí và tôi chắc chắn có nhiều cách nó có thể được thực hiện. Những gì tôi muốn làm là lưu trữ một mảng boolean (hoặc mảng byte). Độ dài của mảng có thể là bất cứ thứ gì, nhưng giả sử nó là 13. Sau đó, bạn có một bộ đếm đại diện cho số lần 13 đi vào giá trị thực tế đó. Vì vậy, nếu chúng ta muốn đại diện cho 245 thì bộ đếm sẽ có giá trị 18. Bây giờ, mảng sẽ có tất cả các giá trị được đặt thành đúng cho phần còn lại của 245/13 ... về cơ bản là mô đun. Trong trường hợp này là 11, vì vậy 11 booleans đầu tiên trong mảng sẽ được đặt thành true, phần còn lại được đặt thành false. Để lấy lại giá trị, tất cả những gì bạn cần làm là nhân bộ đếm với độ dài mảng, sau đó thêm 1 cho mỗi bộ boolean thành true (dừng ở sai đầu tiên). Bây giờ, số 245 sẽ không bao giờ được lưu trữ ở bất cứ đâu và khó có thể tìm thấy vị trí bộ nhớ cần phải thao tác để thay đổi số lượng vàng. Bạn có thể muốn đặt độ dài mảng thành các kích thước khác nhau (có thể chọn ngẫu nhiên một số giữa một số phạm vi hợp lý) khi đối tượng này được tạo.

EDIT: Điều này hữu ích cho nhiều người chơi và chơi đơn. Có sự gian lận cũng có thể được thực hiện trong nhiều người chơi, trong đó các giá trị trong các gói có thể bị thay đổi. Điều này sẽ yêu cầu các kỹ thuật khác nhau để ngăn chặn, như ký từng gói.


1
Thông thường, để tránh gian lận, các trò chơi nhiều người chơi tính toán mọi thứ trên máy chủ, do đó, sửa đổi một giá trị trên máy khách hoặc trong một gói được gửi đến máy chủ, sẽ không thay đổi điều gì với trò chơi thực tế. Tuy nhiên, phần còn lại của câu trả lời là thú vị.
Vaillancourt

@AlexandreVaillancourt Điểm tốt. Tôi lo ngại về việc làm chậm chữ ký tính toán CPU của máy chủ. Tôi muốn giữ cho máy chủ nhanh bằng cách chuyển các gói giữa hai người chơi, nhưng tôi sẽ xem xét kỹ ngay bây giờ mà bạn đã chỉ ra.
Jose Martinez

Nếu bạn chỉ gửi đầu vào từ máy khách đến máy chủ, bạn không cần phải ký mỗi gói. Khi ở trên máy chủ, nếu đầu vào không có ý nghĩa, họ sẽ bị từ chối hoặc khách hàng bị đuổi vì gian lận. Máy chủ tính toán trạng thái tiếp theo của trò chơi, sau đó gửi trạng thái mới cho tất cả người chơi, đó là cách tránh gian lận (bạn không loại bỏ các bot như thế này, nhưng ít nhất bạn tránh được sự gian lận thông thường từ người chơi) .
Vaillancourt

1
Để tránh điều đó, bạn để máy chủ cập nhật cuộc sống mới, sau đó gửi cuộc sống mới cho khách hàng. Mọi thứ đều được tính toán trên máy chủ và để máy khách đơn giản là "thiết bị đầu cuối câm" cho tất cả những điều quan trọng: khách hàng sẽ chịu trách nhiệm nắm bắt các đầu vào từ trình phát ("nhấp vào x, y tại thời điểm T", "nhấn nút X tại thời điểm T "), gửi chúng đến máy chủ và nhận trạng thái mới từ máy chủ (" trình phát hiện ở vị trí X, Y "," trình phát có ZZZ ") và hiển thị cho trình phát.
Vaillancourt

1
Với điều này, kẻ lừa đảo (người đứng giữa) có thể làm rối tung tất cả những gì họ muốn với các gói, nó sẽ không thay đổi trạng thái của trò chơi trên máy chủ vì máy chủ sẽ đảm bảo rằng đầu vào là hợp lệ ("hmm máy khách đã nhấp tại năm địa điểm khác nhau trong vòng 0,03 giây cuối cùng, điều đó không bình thường, hãy từ chối các nhấp chuột này ") và tự chạy tất cả các mô phỏng.
Vaillancourt
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.