Chiến lược đánh bại các biên tập viên bộ nhớ để gian lận - Trò chơi trên máy tính để bàn [đã đóng]


35

Tôi giả sử chúng ta đang nói về các trò chơi trên máy tính để bàn - thứ mà người chơi tải xuống và chạy trên máy tính cục bộ của họ. Nhiều trình chỉnh sửa bộ nhớ cho phép bạn phát hiện và đóng băng các giá trị, như sức khỏe của người chơi.

Làm thế nào để bạn ngăn chặn gian lận thông qua sửa đổi bộ nhớ? Những chiến lược nào là hiệu quả để chống lại loại gian lận này?

Để tham khảo, tôi biết rằng người chơi có thể: - Tìm kiếm thứ gì đó theo giá trị hoặc phạm vi - Tìm kiếm thứ gì đó thay đổi giá trị - Đặt giá trị bộ nhớ - Đóng băng giá trị bộ nhớ

Tôi đang tìm kiếm một số tốt. Hai tôi sử dụng là tầm thường là:

  • Hiển thị giá trị dưới dạng phần trăm thay vì số (ví dụ: 46/50 = 92% sức khỏe)
  • Một lớp cấp thấp chứa các giá trị trong một mảng và di chuyển chúng với mỗi thay đổi. (Ví dụ: thay vì int, tôi có một lớp là một mảng int và bất cứ khi nào giá trị thay đổi, tôi sử dụng một mục mảng được chọn ngẫu nhiên khác để giữ giá trị)

Trò chơi là ngoại tuyến, miễn phí và chơi đơn.

Chỉnh sửa: cho hậu thế, tôi đã giải quyết điều này (bằng C #) và đăng giải pháp của tôi ở đây , trên blog của tôi.

Câu trả lời:


21

Một khả năng khác (đối với các giá trị nguyên) là có một biến thành viên thứ hai chứa phần bổ sung bitwise của một biến hiện có.

Vì vậy, hãy tưởng tượng bạn có health, bạn cũng sẽ có healthComplement. Việc triển khai của bạn có thể trông như thế này:

// setter sets value and complement
void setHealth(int value){
    health = value;
    healthComplement = ~value;
}

// getter checks if value was changed outside of the setter
int getHealth(){
    if(value != ~healthComplement){
        // launch some cheat-counter-measure, like crashing the game?
        exit;
    }
    return health;
}

Ai đó muốn gian lận sẽ phải thiết lập chính xác sức khỏe và sức khỏe, nếu không trò chơi sẽ bị sập.

Tôi nghĩ thật vô nghĩa khi cố gắng ngăn chặn những thứ như thế này. Mọi người đã tạo thành công các bản hack / cheat cho những thứ phức tạp hơn nhiều và nó chỉ cần làm xáo trộn mã của bạn hoặc làm cho trò chơi của bạn hoạt động kém hơn.


12

Đây là một kế hoạch tôi đã đưa ra khi ai đó yêu cầu nó trên một số bảng từ lâu. Sử dụng tỷ lệ phần trăm hoặc nhân đôi không thực sự hiệu quả, vì bạn có thể tìm kiếm các giá trị "bất kỳ" và đóng băng chúng.

Thay vào đó, tạo một quái vật của một loại dữ liệu.

Về cơ bản, lưu trữ các giá trị quan trọng của bạn dưới dạng cấu trúc với:

  • 32 con trỏ đến bit
  • Để đọc nhanh, có cấu trúc bao gồm giá trị hiện tại dưới dạng int int

Để thao tác, thu thập giá trị hiện tại từ các bit được phân bổ riêng (có thể là ints đúng / sai), thay đổi giá trị và sau đó lưu trữ chúng trở lại.

Đây là bit khó chịu: mỗi khi bạn thao tác giá trị, miễn phí và phân bổ lại các bit. Phân bổ sẽ diễn ra theo thứ tự ngẫu nhiên , vì vậy dữ liệu nhảy xung quanh trong bộ nhớ và không thể dễ dàng bị đóng băng.

Các biện pháp bảo vệ bổ sung sẽ là lưu trữ tổng kiểm tra các giá trị (cũng như int "đơn giản") và so sánh chúng trong các cuộc gọi thao tác. Nếu tìm thấy sự không phù hợp, hãy làm một cái gì đó tinh tế, như loại bỏ một khóa ngẫu nhiên cần thiết để mở khóa cửa để tiến bộ trong trò chơi.

Chỉnh sửa: Để di chuyển bộ nhớ hơn nữa, hãy đảm bảo bạn phân bổ các "bit" mới trước khi giải phóng các bộ nhớ cũ.

Chỉnh sửa: Đối với các trò chơi nhiều người chơi, bạn cũng có thể tuần tự hóa cấu trúc dữ liệu, nén và gửi qua mạng. Không phải là cách sử dụng mạng hiệu quả nhất, nhưng chắc chắn khó khăn hơn để tìm ra thông qua việc đánh hơi gói tin.


9

Làm thế nào về bạn lưu trữ sức khỏe bổ sung với một giá trị ngẫu nhiên được tạo ra mỗi khi bạn lưu trữ nó. Điều này ít nhất sẽ đánh bại cơ chế đơn giản là tìm kiếm các giá trị tăng / giảm trong bộ nhớ để tìm ra sức khỏe.

class Player
{
  int m_Health;
  int m_RandomHealth;
  Random m_Rnd = new Random();

  public int Health {
    get
    {
      return m_Health ^ m_RandomHealth;
    }

    set
    {
      m_RandomHealth = m_Rnd.Next();
      m_Health = value ^ m_RandomHealth;
    }
  }
}

Ngoài ra, bạn có thể muốn đặt lại giá trị từng khung, ngay cả khi sức khỏe không thay đổi. Điều này sẽ ngăn mọi người tìm kiếm địa chỉ thay đổi khi sức khỏe của họ thay đổi và điều đó vẫn giữ nguyên khi sức khỏe của họ giữ nguyên.

Phần thưởng: Tạo một đối tượng mới mỗi lần nó thay đổi để số lượng bộ nhớ thay đổi và thiết lập sức khỏe để thay đổi số ngẫu nhiên, giá trị xored và địa chỉ trong bộ nhớ mỗi khi bạn đọc nó:

class Player
{
  int [] m_HealthArray; // [0] is random int, [1] is xored health
  Random m_Rnd = new Random();

  public Player() {
    this.Health = 100;
  }

  public int Health {
    get
    {
      int health = m_HealthArray[0] ^ m_HealthArray[1];
      Health = health; // reset to move in memory and change xor value
      return health;
    }

    set
    {
      m_HealthArray = new int[2];
      m_HealthArray[0] = m_Rnd.Next();
      m_HealthArray[1] = m_HealthArray[0] ^ value;
    }
  }
}

8

Mặc dù tôi đã đưa ra nhận xét đầu tiên đặt câu hỏi về việc làm giảm trải nghiệm của một bộ phận khán giả của bạn mà không đạt được lợi ích rõ ràng, tôi vẫn thấy đó là một câu hỏi thú vị từ quan điểm kỹ thuật.

Tôi chỉ có ý tưởng này: Những kẻ gian lận làm gì là tìm các giá trị thay đổi và đóng băng chúng. Việc tìm kiếm sau đó sẽ chỉ xảy ra giữa những cái chết hoặc những sự kiện làm thay đổi sức khỏe của người chơi. Hơn nữa, kẻ lừa đảo có thể tinh chỉnh tìm kiếm bằng cách lọc ra những gì đã thay đổi khi anh ta "không chết".

Điều gì xảy ra nếu bộ đếm "sức khỏe" thay đổi toàn bộ thời gian? Biến nó thành một con trỏ và phân bổ lại nó cho mọi khung hình hoặc mọi khung hình N nếu hiệu năng đạt được quá lớn. Hoặc XOR nó với một giá trị ngẫu nhiên thay đổi mọi khung hình (XORing một lần nữa so với cùng một giá trị để giải mã trước khi mã hóa với một giá trị ngẫu nhiên mới).

Nếu bạn có dữ liệu trong trò chơi khác cũng thay đổi toàn bộ thời gian (bao gồm cả vị trí x và y của nhân vật người chơi hoặc bộ đếm thời gian), điều đó có thể khiến bạn khó tìm ra dữ liệu thay đổi nào là sức khỏe. Và đóng băng toàn bộ trạng thái trò chơi là không có cho kẻ lừa đảo.

Đối với sai lầm hơn nữa, bạn thực sự có thể lưu trữ sức khỏe trong một biến chỉ viết đơn giản có nghĩa là một nồi mật ong.

Chỉnh sửa :

Tuy nhiên, người gian lận có thể cố gắng tìm ra biến nào đang thay đổi toàn bộ thời gian là biến để đóng băng thông qua thử và lỗi. Một giải pháp khả thi sẽ là ghép các biến với nhau.

Một ví dụ:

Thay vì lưu trữ sức khỏe (h) và vị trí (x), bạn lưu trữ chúng theo hai biến a và b, từ đó bạn có thể truy xuất các giá trị sau:

a = x+h; b = x-h
x = (a+b)/2; h = (a-b)/2

Bằng cách này, nếu kẻ lừa đảo chỉ đóng băng một trong số họ và sau đó di chuyển nhân vật, vị trí bị ảnh hưởng và tùy thuộc vào người nào bị đóng băng, h sẽ bị âm (chết ngay lập tức). Bạn có thể chuyển đổi giữa các công thức trên và:

a = x-h; b = x+h
x = (a+b)/2; h = (b-a)/2

Trong các khung liên tiếp và bạn đảm bảo rằng trong tối đa 2 khung hình sau khi một trong hai biến đã bị đóng băng, sức khỏe sẽ chuyển sang 0 thời điểm x thay đổi. Hãy nhớ rằng bạn chỉ lưu trữ a và b. Kết hợp điều này với XOR liên tục như đã đề cập ở trên. Kết quả là một tập hợp các biến đang thay đổi mọi khung hình thành các giá trị dường như ngẫu nhiên và đóng băng bất kỳ một hoặc một tập hợp con nào trong số chúng chỉ tạo ra các tác dụng phụ không mong muốn trong trò chơi, cái chết ngay lập tức là một trong số chúng.


7

Một lựa chọn khả thi tôi nghĩ có thể hoạt động (Tôi không quá quen thuộc với các công cụ gian lận này): đừng che giấu nó. Thực hiện các hoạt động của bạn và mong đợi kết quả nhất định. Sau khi hoạt động (có thể là khung tiếp theo), hãy kiểm tra để đảm bảo rằng kết quả như bạn mong đợi. Nếu bạn trừ đi sức khỏe và sau đó xác minh nó, chỉ để thấy sức khỏe không bao giờ thay đổi, bạn có thể khá chắc chắn (với điều kiện bạn không có một số lỗi tối nghĩa) rằng nó đã bị khóa.

Nếu bạn phát hiện gian lận, bây giờ bạn có thể tự do thay đổi các quy tắc của trò chơi khi bạn thấy phù hợp với sự đau buồn tối đa, nếu đó là ý định của bạn. Nếu mục đích của bạn là bỏ qua sự gian lận và để trò chơi tiếp tục hoạt động, hãy phân bổ lại sức khỏe ở nơi khác trong bộ nhớ và thay đổi con trỏ của bạn để giá trị mới được sử dụng và cái cũ bị bỏ qua. Lặp lại quảng cáo vô hạn.


6

Bất kỳ nỗ lực nào chỉ đơn thuần là thất bại trong lý thuyết, nhưng trong thực tế, bạn chỉ cần làm cho nó đủ khó để phá vỡ rằng thử thách trở nên ít thú vị hơn là thành công trong trò chơi. Tôi không biết trò chơi của bạn là gì, vì vậy tôi sẽ không mạo hiểm đề xuất các phương pháp che giấu dữ liệu, thậm chí ít hơn vì tôi tin rằng chúng là vô nghĩa.

Điều đó nói rằng, và bạn có thể sẽ không thích nó, tôi tin rằng bạn đang tìm kiếm màn che bộ nhớ , đó là một khái niệm đáng tin cậy .


3

Một kỹ thuật rất hiệu quả được sử dụng bởi một số roguelike (DoomRL, Brogue) là che dấu các biến thực tế. Điều này có nghĩa là thay vì hiển thị sức khỏe là "2/10", hãy hiển thị nó là "20%".

Hãy nhớ rằng, hầu hết các trình soạn thảo bộ nhớ hoạt động tốt với tìm kiếm / lọc giá trị cụ thể. Nếu bạn không biết giá trị cụ thể, bạn vẫn có thể theo dõi nó (ví dụ: tìm kiếm các giá trị thay đổi / giảm sau khi sức khỏe người chơi giảm xuống), mặc dù phải mất nhiều thời gian hơn để làm theo cách đó.

Tôi cũng đề nghị một phản ứng dữ dội chống gian lận. Ví dụ: nếu bạn có một trò chơi mà người chơi chịu sát thương không tích cực và sức khỏe của họ không giảm, bạn có thể dễ dàng và kiểm tra chính xác điều này và biết rằng người chơi gian lận. Làm điều gì đó thú vị, như sinh ra một số kẻ thù uber xung quanh anh ta :)


2

Viết trình điều khiển ring 0 móc SSDT và ghi nhật ký / khối khi ReadProcessMemory / WriteProcessMemory được gọi trên ứng dụng của bạn. Sẽ tốt hơn nếu chỉ đăng nhập để bạn có thể từ từ thay đổi hành vi trò chơi của họ theo thời gian thay vì chỉ gặp sự cố.


Có vẻ như bạn đang nói về chi tiết triển khai cấp thấp (API Windows?) Tôi đang hỏi về các chiến lược chung, cấp cao.
tro999

2

Tại sao bạn lại ngăn người chơi tự lừa dối mình (mà gian lận trong một trò chơi người chơi lên tới)? Trong môi trường nhiều người chơi, nhiệm vụ của máy chủ là phát hiện các thay đổi bất thường và chống lại chúng (thường là bằng cách bỏ qua đầu vào hoặc chặn hoàn toàn thủ phạm khỏi máy chủ), nhưng trong một môi trường người chơi không có gì xảy ra ngoại trừ kẻ lừa đảo đang tự làm bất đồng.

IOW, trừ khi bạn đang tạo một trò chơi nhiều người chơi thì thật lãng phí tiền và nếu bạn đang nghĩ đến việc làm sai chỗ.


2

Nghiên cứu các công cụ gian lận đã biết - và thường xuyên kiểm tra xem có bất kỳ công cụ phổ biến nhất nào được phát hiện đang chạy hay không (kiểm tra tên quy trình?)

Nếu có bất kỳ phát hiện nào, hãy để người chơi gian lận (nếu ngoại tuyến, điều đó vô hại), nhưng đảm bảo không có điểm số / thành tích nào được đăng lên bất kỳ hệ thống bảng xếp hạng / thành tích trực tuyến nào - chỉ khiến nó âm thầm thất bại?

Sẽ không ngăn chặn các tin tặc quyết tâm hơn, nhưng sẽ làm giảm cơ hội các trò lừa đảo thông thường hơn làm rối tung bảng xếp hạng của bạn.

(Có thể làm phiền các lập trình viên có các công cụ dev mở và thu nhỏ cho các mục đích hợp pháp và đang nghỉ chơi game, mặc dù ...)


7
Tôi là một fan hâm mộ lớn của Steam với tư cách là một nền tảng phân phối và đã chơi rất nhiều Team Fortress II vài năm trước. Một buổi tối, tôi nghỉ một phiên mã hóa dài và bỏ ngỏ Visual Studio và một trình gỡ lỗi trong khi tôi chơi. Tôi thấy mình bị cấm từ TF2 vì "gian lận". Không có kháng cáo, không có khuôn khổ để có lệnh cấm được dỡ bỏ. Một "hành vi phạm tội" và nó là vĩnh viễn cho tài khoản. Tôi vẫn không biết tại sao - và tin tôi đi, tôi đã bốc khói - ngoại trừ việc tôi thấy bị chôn sâu trong một Câu hỏi thường gặp khi mở "trình chỉnh sửa bộ nhớ" trong khi chơi trò chơi cấu thành gian lận và bị cấm. Ồ

1

Tôi nghĩ rằng giải pháp đơn giản nhất cho việc này là thực hiện một tùy chọn gian lận. Vô hiệu hóa ghi bàn trong khi trong tùy chọn gian lận.

Một ý tưởng tốt khác, mà tôi không biết bạn sẽ thực hiện như thế nào. Là tắt trò chơi khi có biến bộ nhớ bị đóng băng hoặc đại loại như thế :)

Chuc bạn may măn)


3
Thực hiện gian lận là một lựa chọn tốt. Tắt các trò chơi, không quá nhiều ... (tưởng tượng nếu bạn có thể sai, và đóng cửa một cầu thủ hợp pháp.)
ashes999
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.