Làm cách nào tôi có thể ngăn báo cáo điểm sai cho các bảng điểm cao toàn cầu?


44

Trình duyệt và trò chơi di động thường có bảng điểm cao toàn cầu. Các bảng này cũng chứa các điểm số 2.147.483.647 - nơi mọi người đã tìm ra cuộc gọi dịch vụ web báo cáo điểm số và sử dụng nó để ghi điểm số giả tưởng.

Đối với các trò chơi giải đố đơn giản, chúng ta có thể bảo vệ chống lại điều này bằng cách bao gồm một bản ghi về mọi di chuyển mà người chơi thực hiện (và bất kỳ hạt giống ngẫu nhiên nào được sử dụng để tạo cấp độ) với cuộc gọi báo cáo điểm số. Toàn bộ trò chơi sau đó có thể được sao chép và xác minh trên máy chủ.

Tuy nhiên, điều này nhanh chóng trở nên không khả thi đối với bất cứ thứ gì lớn hơn Pac-man.

Làm thế nào khác có thể ngăn chặn gian lận của loại này?


Tôi đã có câu hỏi tương tự chính xác về các trò chơi iPhone sử dụng cùng một kỹ thuật để tạo ra một bảng điểm cao toàn cầu.
deft_code

Bạn có chắc chắn sẽ không thể gửi lại?
o0 '.

Vâng tôi chắc chắn. :)
teedyay

Câu trả lời:


9

Hệ thống nội bộ mà chúng tôi đã sử dụng cho Moblox (sau này được thay thế bằng OpenFeint) hoạt động như thế này:

  • Gửi tin nhắn JSON qua HTTP đơn giản (không phải HTTPS). Bao gồm MD5-băm của tất cả các trường cộng với chuỗi ma thuật.
  • Trên máy chủ, kiểm tra tính toàn vẹn của tin nhắn với thao tác tương tự.

Để bẻ khóa hệ thống, bạn phải tìm chuỗi ma thuật này. Có thể với kỹ thuật đảo ngược, nhưng đau đớn.

OpenFeint, ScoreLoop và CocosLive đều sử dụng cùng một mẹo, nhưng với HTTPS. Rất dễ thực hiện.


29
Tôi khá mơ hồ rằng kỹ thuật đảo ngược để tìm chuỗi ma thuật của bạn sẽ khó khăn đến thế.
Kylotan

4
Đây là một ứng dụng Android trong C ++ bản địa. Không có biểu tượng, cũng không có trình sửa lỗi tốt. Vì vậy, bạn có thể đọc mã ARM, nhưng không dễ dàng theo dõi nó. Khóa được soạn bởi nhiều thao tác nên tìm tất cả các chuỗi là không đủ. Điều đó không hoàn hảo nhưng khá đau đớn.
Ellis

3
Một bài tập đại học tiêu chuẩn, ít nhất là trong các trường đại học Hoa Kỳ, là kỹ thuật đảo ngược mật khẩu được xây dựng như bạn mô tả, bằng cách đọc mã lắp ráp y86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/ đấm ).

12
Đây là một kỹ thuật cực kỳ yếu , sẽ mang lại cho các nhà phát triển cảm giác an toàn rất sai lầm.
o0 '.

2
Đây là một ví dụ rất hay về en.wikipedia.org/wiki/Security_ENC_obscurity
kaoD

21

Mặc dù bạn đúng rằng không phải lúc nào cũng có thể gửi toàn bộ replay đến máy chủ cho các trò chơi phức tạp, một hệ thống tương tự có thể được sử dụng bằng cách yêu cầu máy chủ định kỳ (và bán ngẫu nhiên) yêu cầu khách hàng cho một phần trạng thái của nó, trong khi Trò chơi đang chạy.

Ví dụ: trong một FPS, mỗi phút bạn có thể hỏi "Bạn có bao nhiêu giết chết?", "Tất cả kẻ thù ở đâu?", V.v. Nếu khách hàng không quay lại với câu trả lời hợp lý cho thử thách trong một số lượng thời gian hợp lý, họ đang gian lận.

Tất nhiên, điều này chỉ hoạt động nếu trò chơi trực tuyến trong toàn bộ phiên chơi. Vì mục tiêu ở đây là có thể tải lên bảng xếp hạng trực tuyến, tôi nghĩ điều đó hợp lý - đừng đuổi người chơi ra khỏi trò chơi nếu họ trả lời sai, chỉ cần đừng để họ vào danh sách điểm.

Tôi sẽ khuyến khích bạn xem xét lại gửi replay tuy nhiên. Tất cả những gì bạn thực sự cần là hạt giống ngẫu nhiên ban đầu và đầu vào dấu thời gian. Điều này thực sự nên là vài trăm KB. Nhiều game arcade đã làm điều này rồi để lưu replay cho mục đích đánh giá của người chơi; có máy chủ của bạn xác nhận những điều này có thể không tầm thường, nhưng nó ngăn chặn tất cả các loại gian lận ngoại trừ đóng chai.


10

Bạn có thể hạn chế sự lạm dụng nhất bằng cách theo dõi kết quả cao nhất trong bảng điểm cao nhất. Tùy thuộc vào trò chơi của bạn, bạn có thể có "điểm hoàn hảo", trên đó bất kỳ điểm nào cũng phải là gian lận. Nếu không, bạn có thể tính "điểm không thể" thấp nhất; Người chơi có thể bắn 10 phát mỗi giây, trò chơi kéo dài 1 phút và mỗi kẻ thù bị giết có giá trị 100 điểm không? Sau đó, bất kỳ điểm nào cao hơn 60.000 phải là gian lận.

Bạn cũng có thể giúp giảm thiểu vấn đề bằng cách gửi cùng một số siêu dữ liệu; không phải là toàn bộ lịch sử trò chơi, như bạn mô tả, mà chỉ là các thành phần tạo nên điểm số. Nói: điểm 60000, 500 kẻ thù bị giết và một vật phẩm thưởng lấy được. Sau đó bạn có thể thực hiện kiểm tra đơn giản. Đây là "bảo mật thông qua che khuất", và do đó không an toàn chút nào, nhưng nó giúp loại bỏ những kẻ tấn công ngây thơ nhất.


Bạn cũng có thể gắn cờ người dùng (có thể bằng IP) nếu họ gửi điểm không phù hợp với siêu dữ liệu. Sau đó, nếu họ cố gắng và gửi lại điểm số mà DOES có siêu dữ liệu chính xác, bạn có thể xem xét kỹ lưỡng và có thể chỉ cấm họ hoàn toàn. Bạn cũng có thể gửi tin nhắn táo tợn trở lại từ đó gửi yêu cầu điểm số :)
Adam Harte

Tôi nghĩ rằng câu trả lời này tốt hơn câu trả lời được chấp nhận. Chỉ cần tìm ra con số nào là tối đa mà người chơi của bạn có thể đạt được. Bất cứ điều gì cao hơn, chỉ cần loại bỏ.

6
Vì vậy, nếu một người chơi vào trường đại học gian lận, tất cả mọi người trên mạng bây giờ là "kẻ lừa đảo"
AttackHobo

6

Cuối cùng, bạn chỉ có thể loại trừ điểm số cao không tưởng, bởi vì phần còn lại (theo định nghĩa) chỉ đơn thuần là không thể tin được, và do đó có thể là một người chơi hợp pháp (và tuyệt vời).

Nếu không, bạn phải dựa vào các kỹ thuật che giấu (như mã hóa và gửi các số liệu thống kê khác ngoài điểm số).

Bạn cũng có thể gửi điểm theo định kỳ khi trò chơi đang được chơi, điều này sẽ thêm một mức độ phức tạp khác để gian lận - tức là máy chủ có thể quyết định xem trò chơi đã được chơi đủ lâu để đảm bảo một số điểm cụ thể chưa và cũng đảm bảo đủ báo cáo trung gian đã được nhận trong thời gian chơi (chỉ cần không thực hiện 100% hoặc tàu đi vào đường hầm trên đường về nhà sẽ dẫn đến việc tôi ném điện thoại ra khỏi cửa sổ).

Cuối cùng, ai đó sẽ tìm cách phá vỡ nó, vì vậy đừng tự sát khi cố ngăn họ lại.


6

Tôi đã thêm một bảng điểm cao nhanh chóng / bẩn thỉu cho một dự án của tôi một thời gian trước và không thành thạo về bảo mật internet / v.v ... nó hóa ra không hoàn hảo. Đáng ngạc nhiên, với gần 1.200.000 điểm được ghi lại, tôi chỉ có thể có 5 hoặc 6 lần các lô điểm không chính xác ngang nhiên đạt đến đỉnh bảng. Hầu hết các điểm số thậm chí trông giống như một trục trặc trong trò chơi, hơn là một "hack" thực sự.

Vì vậy, tôi đoán một điểm quan trọng là: đảm bảo hệ thống tính điểm của trò chơi của bạn kín gió , hoặc ít nhất là thực hiện một số kiểm tra tính khả thi thực sự tốt; Bây giờ, trò chơi này tôi đang nói đến là một mục nhập Ludum Dare 48hr, vì vậy nó không phải là thứ ổn định nhất xung quanh .. nhưng về tổng thể tôi nghĩ rằng nhiều khả năng người chơi bình thường sẽ phát hiện / khai thác một trục trặc trong trò chơi có người trực tiếp "hack" bảng xếp hạng.

Điều đó nói rằng, tôi đang làm việc để viết lại dự án này ngay bây giờ, và tôi sẽ làm tất cả với sự xáo trộn. Tôi sẽ không đi sâu vào chi tiết, nhưng về cơ bản, tất cả các điểm đều gửi một giá trị chính dựa trên một loạt các giá trị ngẫu nhiên và băm và một chuỗi ma thuật, sau đó bất kỳ điểm nào vượt qua kiểm tra đó và đủ cao để thực hiện " Bảng xếp hạng Top X "phải vượt qua một vòng xác nhận khác (lần này với giá trị khóa hết hạn được tạo ở cuối máy chủ và kiểm tra tính khả thi kỹ lưỡng hơn).

Tôi cũng khuyên bạn nên sử dụng một trình theo dõi gói nào đó để kiểm tra những thứ có thể nhìn thấy (ban đầu tôi đang thực hiện một xác minh đơn giản hơn nhiều có nghĩa là ai đó có thể sử dụng trình theo dõi gói để tìm và sao chép yêu cầu http của điểm đã tải lên mà không cần biết chuỗi ma thuật hoặc bất cứ điều gì (có nghĩa là trước tiên bạn cần một số điểm hợp pháp, nhưng bạn có thể gửi các bản sao của số điểm đó nhiều như bạn muốn ..)). Tôi đã sử dụng Wireshark để thử nghiệm điều này.

Huh, điều này hóa ra hơi lâu, nhưng hy vọng nó sẽ giúp ...


Chắc chắn là. Có vẻ như một băm muối là một cách tốt để đi. Tôi đã không nghĩ rằng họ sẽ gửi lại số điểm hợp lệ nhiều lần. Một GUID và dấu thời gian được bao gồm trong gói (và trong hàm băm) sẽ được trả tiền cho điều đó - Tôi có thể kiểm tra các bản sao trên máy chủ. Cảm ơn bạn.
teedyay

3

Tôi không phải là chuyên gia trong lĩnh vực này nhưng nếu tôi là bạn, tôi sẽ cố gắng mã hóa điểm số bằng một khóa được nhúng trong mã của bạn. Những người đó sẽ cần áp dụng kỹ thuật đảo ngược trên mã của bạn thay vì văn bản đơn giản được sử dụng cho các dịch vụ web.


2
Tôi sẽ đi xa hơn nữa. Tạo một hàm băm từ mã bằng cách băm tệp exe (hoặc một phần của nó). Khi gửi điểm gửi số phiên bản và máy chủ có thể xác thực bằng cách sử dụng bảng có số phiên bản hằng số đơn giản-> mã băm. Sau đó, bạn nhận được phần thưởng bổ sung mà nếu ai đó gian lận bằng cách sửa đổi chương trình, điểm cao của anh ta sẽ không được tính.
cấu hình

7
Nếu ai đó đang sửa đổi chương trình, họ có thể gửi bất kỳ khóa nào họ muốn.

2
@Joe Wreschnig, họ có thể gửi bất kỳ khóa nào họ muốn, nhưng máy chủ nên được đặt thành chỉ chấp nhận các khóa hợp lệ.
Tấn côngHobo

5
Tôi nghĩ rằng quan điểm của Joe là họ không phải sử dụng hàm băm của chương trình mới được sửa đổi, nhưng chỉ có thể gửi bất cứ thứ gì băm trước đó.
Kylotan

1
@ gd1: Làm thế nào để giúp đỡ?
Kylotan

1

Speedruns về cơ bản là ghi lại mọi tổ hợp phím và họ đang ghi lại về một trò chơi WHOLE. Vì vậy, vâng, bạn có thể ghi lại toàn bộ trò chơi, điều đó không khả thi. Bất kỳ cách nào khác để làm điều đó là có thể bẻ khóa thông qua kỹ thuật đảo ngược (tôi không thể nhấn mạnh đủ: bạn không thêm bảo mật, bạn đang thêm sự tối nghĩa).

Tuy nhiên, ngay cả khi bạn làm theo cách này, họ thực sự có thể gửi tốc độ. Bạn không thể làm gì để ngăn chặn điều đó.


2
Thông thường, phát lại, không phải ghi âm, là phần không khả thi cho máy chủ. Nếu khách hàng đã chơi trò chơi trong một vài giờ, việc mô phỏng lại phía máy chủ có thể mất nhiều phút CPU hoặc tệ hơn. Điều đó không thực sự được chấp nhận nếu bạn có nhiều người gửi điểm.

2
Kích thước của gói dữ liệu sẽ trở thành một vấn đề đối với các trò chơi di động - đặc biệt là nếu người chơi trả tiền cho băng thông của họ bằng byte.
teedyay

Ồ, những gì cả hai bạn nói là đúng. Tuy nhiên, không có giải pháp "thực sự" nào khác.
o0 '.

11
Bạn không phải xác thực mọi bản ghi được gửi, bạn chỉ cần xác thực những bản ghi đó để lọt vào top 10. Không có nhiều điểm gian lận để trở thành # 11. Và bạn không phải làm điều đó trong thời gian thực. Quá trình hàng loạt định kỳ sẽ tốt.
màu xám

@teedyay Giả sử người chơi thực hiện trung bình 5 hành động mỗi giây và mỗi hành động có thể được mô tả hoàn toàn trong 32 bit. Đó là 20 byte mỗi giây hoặc 72 kB mỗi giờ. Giá dữ liệu di động thông thường ở Hoa Kỳ là $ 10 mỗi GB, hoặc 1 xu cho mỗi 1000 kB.
Damian Yerrick

1

Trong khi bạn đang ở đó, có một câu hỏi là liệu điểm số cao chỉ đơn giản là một người chơi tìm thấy khai thác (ví dụ: nếu một số thứ trong trò chơi đưa ra một hình phạt điểm và một lỗi khiến điểm số âm tính "bao bọc" để trở nên tích cực cao ... hoặc chỉ là một người chơi tìm thấy một điều kiện trò chơi nhất định như một điểm an toàn trên bảng nơi họ có thể chỉ cần ngồi ở đó và không phải lo lắng về việc thua, vô thời hạn).

Để cho biết sự khác biệt giữa hack và khai thác trò chơi, tải lên ít nhất một số dữ liệu chơi sẽ tốt. Nó sẽ giúp bạn sửa chữa các khai thác, ít nhất.

Đối với một số trò chơi (đặc biệt là trò chơi theo lượt), bạn thực sự có thể chơi trò chơi thông qua máy chủ, trong đó tất cả logic trò chơi tồn tại ở phía máy chủ và máy khách chỉ là một giao diện. Điều này không chỉ khiến việc hack điểm trở nên khó khăn hơn rất nhiều mà còn cho phép bạn ghi lại tất cả các hành động của người chơi trên máy chủ một cách tầm thường, và do đó phát lại bất kỳ trò chơi nào bất cứ lúc nào. Tôi nhận ra đối với một cái gì đó giống như một game bắn súng hành động co giật, điều này có thể không thực tế.


1

Tạo tất cả nguồn gốc ngẫu nhiên từ một hạt giống và lưu trữ đầu vào cho mỗi khung. Bất cứ khi nào bạn có điểm cao được yêu cầu (ví dụ top 50), hãy gửi hạt giống và đầu vào đầy đủ đến máy chủ. Phát lại trò chơi trên máy chủ và cập nhật bảng xếp hạng nếu bạn đạt điểm cao.

Nếu bạn cho rằng điều này không khả thi đối với các trò chơi phức tạp hơn vì quy mô của yêu cầu, hãy xem ví dụ này.

Giả sử trò chơi có 8 nút nhập (1 pad và 4 nút) và chạy ở tốc độ 60fps. Một đầu vào trò chơi một giờ có thể được truyền với 3,6KB mà không cần nén. Phiên của bạn có thể sẽ có ít hơn một giờ và quá trình nén sẽ thu nhỏ lại rất nhiều, vì đầu vào của con người có rất nhiều dư thừa.

Thách thức là làm cho trò chơi mang tính quyết định, có thể chơi được từ đầu vào được ghi lại và có thể thực hiện được trên máy chủ.


0

Chưa bao giờ thực hiện điều này trước đây nhưng ...

Gửi điểm số tăng dần với dấu thời gian. Điều này cung cấp cho bạn một bản ghi để xem mức độ thường xuyên cải thiện điểm số cũng như một cách để theo dõi "động lực" của điểm cao.

Sau đó, bạn sẽ đặt các mốc / tiêu chí cho điểm số của bạn.

Ví dụ: Điểm lớn hơn 20.000 không thể đến trong 20 giây đầu tiên của trò chơi. Một số điểm lớn hơn 250.000 không thể đến mà không có mục lớn hơn 200.000.

Điều này không hoàn toàn giống như gửi một trạng thái trò chơi, nhưng gần với nó.

Lợi ích phụ: Hãy nghĩ về tất cả các số liệu thống kê chơi trò chơi hữu ích mà bạn sẽ nhận được từ việc này. Ai đó sẽ trả tiền tốt cho điều đó.

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.