2016-03-28 12 views
6

Tôi đang triển khai tính năng chống gian lận cơ bản (chỉ dành cho kiddies) cho trò chơi của mình. Tôi đã bao gồm một dấu thời gian cho mỗi gói chuyển động của tôi và kiểm tra sanity ở phía máy chủ để có sự khác biệt về thời gian giữa các gói đó.Vòng lặp x giây một lần dựa trên tốc độ xử lý

Tôi cũng đã bao gồm gói gửi dấu thời gian cứ sau 5 giây dựa trên tốc độ xử lý. Nhưng có vẻ như đây là một vấn đề khi PC bị trễ.

Vì vậy, tôi nên sử dụng thông tin gì để kiểm tra xem thời gian xử lý có nhanh hơn do "hack tốc độ" không?

hiện kiểm tra tốc độ vòng lặp của tôi trên máy khách:

this_time = clock(); 
time_counter += (double)(this_time - last_time); 
last_time = this_time; 

if (time_counter > (double)(5 * CLOCKS_PER_SEC)) 
{ 
    time_counter -= (double)(5 * CLOCKS_PER_SEC); 

    milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch()); 
    uint64_t curtime = ms.count(); 

    if (state == WALK) { 
     // send the CURTIME to server 
    } 
} 

// other game loop function 

Đoạn mã trên hoạt động tốt nếu khách hàng PC không tụt hậu có lẽ vì RAM hoặc CPU vấn đề này. Họ có thể đang chạy quá nhiều ứng dụng.

server side code để tham khảo: (GoLang)

// pktData[3:] packet containing the CURTIME from client 
var speed = pickUint64(pktData, 3) 
var speedDiff = speed - lastSpeed 
if lastSpeed == 0 { 
    speedDiff = 5000 
} 
lastSpeed = speed 

if speedDiff < 5000 /* 5000 millisec or 5 sec */ { 
    c.hackDetect("speed hack") // hack detect when speed is faster than the 5 second send loop in client 
} 
+0

Tôi đang sử dụng VisualStudio2015 – majidarif

+0

@MikeMB không tôi đã không cố gắng steady_clock – majidarif

+0

Mã của bạn gửi 'thời gian system_clock' máy tính của khách hàng - họ có thể không được đồng bộ hóa máy tính của họ với bất kỳ tài liệu tham khảo (thậm chí nếu bạn có), trong trường hợp có mà có thể là một đồng bằng giữa thời gian máy chủ của bạn và của chúng, ngay cả khi không có bất kỳ sự chậm trễ nào liên quan đến tải. Bạn sẽ tốt hơn trong việc xử lý thông điệp của họ là "nhịp tim" - mong đợi mỗi người trong vòng 10 giây sau cùng. –

Trả lời

1

Hệ thống của bạn có một lỗ hổng quan trọng mà làm cho nó dễ dàng để phá vỡ cho gian lận: Nó dựa trên dấu thời gian được cung cấp bởi khách hàng. Bất kỳ dữ liệu nào bạn nhận được từ máy khách đều có thể bị thao tác bởi một kẻ gian lận, vì vậy nó không được tin cậy.

Nếu bạn muốn kiểm tra tốc độ hack trên máy chủ:

  1. log vị trí hiện tại của các cầu thủ avatar theo chu kỳ bất thường. Lưu dấu thời gian của mỗi nhật ký theo thời gian máy chủ.
  2. Đo tốc độ giữa hai mục nhập nhật ký như vậy bằng cách tính toán khoảng cách và chia khoảng cách này bằng chênh lệch dấu thời gian.

Khi tốc độ lớn hơn giới hạn tốc độ của trình phát thì bạn có thể có kẻ lừa đảo. Nhưng hãy nhớ rằng độ trễ có thể dẫn đến đột biến đột ngột, vì vậy có thể tốt hơn để đo tốc độ trung bình của nhiều mẫu để phát hiện xem trình phát có đang tăng tốc hay không. Điều này có thể làm cho việc phát hiện speedhack kém đáng tin cậy hơn, nhưng điều đó có thể thực sự là một điều tốt, bởi vì nó làm cho các tin tặc khó hiểu hơn về cách thức mà bất kỳ phương thức trốn nào đáng tin cậy mà họ sử dụng đang hoạt động.

Để tránh bị lỗi giả, hãy nhớ theo dõi mọi cách di chuyển nhân tạo xung quanh mà không tuân thủ giới hạn tốc độ (như dịch chuyển đến đẻ trứng sau khi bị giết). Khi một sự kiện như vậy xảy ra, phép đo tốc độ hiện tại là vô nghĩa và cần được loại bỏ.

+0

Có nguồn nào tôi có thể tham khảo một cách thích hợp để lấy mẫu không? Trò chơi nguồn mở có thể? – majidarif

+0

Bạn chỉ có thể lưu trữ kết quả của mình qua một số khung thời gian (nói 30 giây) và sau đó là trung bình những gì bạn đã lưu trữ. –

+0

@majidarif Tất cả những gì bạn cần lưu là một vị trí và dấu thời gian. Đó không hẳn là khoa học tên lửa. – Philipp

Các vấn đề liên quan