멀티 플레이어 부정 행위 방지


10

나는 작은 인디 스타일 멀티 플레이어 게임 개발을 거의 완료했습니다. 사람들이 싱글 플레이어에서 속임수를 쓰려고하지만 멀티 플레이어에서는 이것이 허용되지 않습니다. 누구든지 평균 Joe가 Cheat-Engine과 같은 것을 사용하여 게임의 일부를 수정하는 것을 막을 수있는 방법을 알고 있습니까? 나는 현재 클라이언트가 게임에 사용하는 각 설정 파일의 MD5 해시를 XML로 저장하여 몇 초마다 확인을 위해 게임 서버에 업로드하도록 계획하고 있지만 메모리 편집기와 같은 것을 막기 위해 할 수있는 일이 있습니까? ?


2
이 기사를 추천합니다. 멀티 플레이어 게임 빌드-보안 은 멀티 플레이어 API 용으로 작성되었지만 아이디어는 훌륭하고 여전히 적용됩니다
Cyral

답변:


8

로컬에서 수정 된 코드가 걱정된다면 누군가가 예상 한 것과 동일한 MD5 해시의 정적 목록을 보내도록 알림 코드를 수정하지 않았다는 것을 어떻게 확신 할 수 있습니까? 실제로,이를 수행하기 위해 코드를 수정하지 않아도됩니다. SSL이 없다고 가정하더라도 상당히 기본적인 프록시 만 있으면됩니다.

원하는 것을 수행하는 유일한 방법은 서버를 보유하고 클라이언트를 전혀 신뢰하지 않는 것입니다. 모든 계산은 서버에서 처리해야하며 모든 작업은 적어도 어느 정도 가능한 것으로 확인되었습니다. 예를 들어, 클라이언트가 잠시 전에 다른쪽에 있다는 것을 알고있을 때 클라이언트가 맵의 한쪽으로 이동한다고 말하지 못하게합니다. 중간에 서버가 게임에 중요한 모든 일 을하지 않으면, 누군가가 항상 똑똑 할 것이므로 부정 행위를하지 않는 것은 불가능 합니다클라이언트에 구축 할 수있는 모든 방법을 찾으십시오. 하나를 사용하더라도 상황을 약간 조작하는 다른 모든 방법을 생각하지 않아도 여전히 가능합니다. 예를 들어, 이전에 언급 한 이동 유효성 검사 : 간단한 지점 간 계산을 수행하면 사람들은 여전히 ​​벽을 통해 텔레포트 할 수 있습니다.

문제는 '평균 조'가 얼마나 평균입니까? 이미 코드 편집 및 메모리 편집기에 대해 언급했습니다. 그것은 내가 개인적으로 평균 수준을 고려하는 것보다 높으며, 그 수준에 대해 걱정하고 싶다면 모든 무거운 짐을 싣는 별도의 신뢰할 수있는 서버가 필요하며 클라이언트는 본질적으로 디스플레이 및 입력 장치가 될 것입니다.


2
@ user185812 : 일반적으로 허용되는 답변을 표시하기 전에 최소한 몇 시간을 기다리는 것이 좋습니다. 개인적으로 내 대답은 꽤 훌륭하다고 생각하지만 (편견이 있습니다) 다른 사람들은 더 많은 의견을 가지고있을 것이며 받아 들여진 대답을 보는 것은 종종 다른 사람들이 대답하는 것을 방해합니다.
Matthew Scharley

@ MatthewScharley-걱정하지 마십시오. ;)
Martin Sojka

11

클라이언트는 적의 손에 달려 있습니다. ( 온라인 세계 디자인의 법칙 )

실제로, 대부분의 치트를 이길 수있는 유일한 방법은 클라이언트를 "씬 클라이언트"로 만드는 것입니다. 즉, 입력 및 출력 장치로만 작동하고 정확한 정보보다 더 많은 정보를 제공하지 않는 것입니다.

이것은 자동화를 멈추지 않으며 수동적 인 정보 수집 및 분석을 멈추지 않지만 중대한 영향을 미치지 않도록 게임을 디자인 할 수 있습니다.

이렇게해도 사람들이 서버에 의존하는 잘못된 메시지를 통해 서로를 해킹하는 것을 막을 수는 없습니다. 클라이언트는 웹 사이트를 SQL 삽입 공격으로부터 보호하는 것과 마찬가지로 서버의 메시지로부터 보호해야합니다.

싱글 플레이어 게임에 동일한 클라이언트를 사용하기를 원하기 때문에 별도의 프로세스 / 스레드에서 로컬 서버를 실행하고 내부적으로 클라이언트 / 서버 설정으로 처리하는 것이 해결책입니다. "치트"는 서버 측에서 작동합니다. Minecraft는 비슷한 방식으로 게임 엔진을 인터페이스에서 분리 한 최초의 게임이 결코 아닙니다.

제안 된 독서 :


2

치트 엔진의 종류로 속이는 기본 멀티 플레이어 게임에서는 작동하지 않습니다. 클라이언트는 데이터와 사용자가 디자인 한 작업 만 전송합니다. 일반적으로 플레이어가 무엇을했는지, 예를 들어 어떤 방향으로 슛을하는지 등이 아닙니다. 따라서 그가 메모리를 변경하면 자신의 게임에만 영향을 미치지 만 다른 플레이어는 소위 비동기라고하는 변경 사항을 볼 수 없습니다. 대부분의 게임은 이와 같은 비 동기화를 감지하고 게임에서 비 동기화 된 플레이어를 제거합니다.

또한 부정 행위의 다른 방법도 있지만 모두 게임 디자인 방식에 관한 것입니다.

네트워크 메시지를 속이는 가장 쉬운 해킹으로부터 보호하기 위해 서버는 해당 패키지가 온전한 지 확인해야합니다. "그 사람은 방금 5 화면을 뛰어 넘었습니까? 불가능합니다. 패키지를 거부하십시오." (완전히 동기화 된 경로로 이동할 수도 있습니다. 즉, 모든 것이 동기화되고 "플레이어가 어떤 버튼을 눌렀는지"만 나타납니다. 종류의 메시지가 전송되므로 가짜 네트워크 메시지가 의도적으로 쓸모 없게됩니다.

멀티 플레이어에서 부정 행위를하는 마지막 방법은 가시성 핵 (vissiblity hack)으로, 클라이언트를 수정하여 모르는 플레이어에게 데이터를 보여줍니다. 이에 대한 예는 전쟁의 안개를 나타내지 않고, 벽을 뚫고 볼 수 있고, 미니 맵이나 다른 것들을 보여줍니다. 이것들은 막을 수 없습니다.


가시성 핵에 동의하지 않습니다. 캐릭터가 인식 할 때까지 고객에게 정보를 제공하지 않으면 이러한 문제를 예방할 수 없었습니까? 나를 잘못 이해하지 마십시오. 이것은 좋은 디자인이 아닐 수도 있습니다. 그러나 그것은 막을 수없는 것과 다릅니다.
xuincherguixe

@ xuincherguixe 어떤 상황에서는 불가능하다고 생각합니다. 예를 들어 두 클라이언트 모두 동일한 IP 및 동일한 포트에서 재생됩니다. 그러한 경우, 상대방이 의도 한 데이터를 읽지 못하게하는 것은 고객의 선의 일뿐입니다.
Wodzu

1

변수 값을 조작하는 기본 치트 엔진 해킹을 방지하려면 해당 값을 숨겨야합니다. 일반적으로 치트 엔진은 해당 변수의 알려진 값을 검색하고 더 많은 게임을 플레이하고 값을 유발하도록하여 흥미로운 변수의 메모리 위치 (예 : 금의 양 또는 수명 또는 능력의 업그레이드 레벨)를 식별하는 데 사용됩니다. Cheat Engine은 새로운 값에 대한 이전 검색 결과에서 새로운 검색을 수행합니다. 이렇게하면 사기꾼이 값의 메모리 위치를 확대 할 수 있으므로 이제 Cheat Engine을 사용하여 해당 메모리 위치의 값을 변경할 수 있습니다.

예를 들어, Cheat Engine으로 245 GOLD를 가지고 있습니다. 245를 검색하고 많은 메모리 위치를 찾습니다. 그런 다음 좀 더 연주하고 금을 314까지 가져오고 이전 검색 출력에서 ​​314 값을 검색하고 GOLD가 저장된 메모리 위치를 쉽게 찾습니다.

이를 방지하는 방법은 실제 값을 메모리 위치에 저장하지 않는 것입니다. 예를 들어, 필요할 때 실제 값을 계산해야하는 객체에 값을 저장합니다. 플레이어에게 245 골드가 있다고합시다. 값이 245 인 메모리 위치를 검색하는 경우 많은 값을 찾을 수 있지만 금 값이 실제로 저장된 메모리 위치는 없습니다. 즉, 값 245를 금으로 저장하지 않기 때문입니다. 게임이 얼마나 많은 금을 알아야하는지에 따라, 그 값을 보유한 물체를 요구할 것이고, 그것은 필요할 때 계산할 것입니다.

이제 질문은 : 당신이 그것을 드러내지 않는 방식으로 정확히 어떻게 값을 저장합니까? 이것은 약간 까다 롭고 추악 해지며 수행 할 수있는 많은 방법이 있다고 확신합니다. 내가하고 싶은 것은 부울 배열 (또는 바이트 배열)을 저장하는 것입니다. 배열의 길이는 무엇이든 될 수 있지만 13이라고 가정 해 봅시다. 그러면 13이 실제 값에 몇 번 들어가는 지 나타내는 카운터가 있습니다. 245를 나타내려면 카운터의 값은 18입니다. 이제 배열은 나머지 245/13 ... 기본적으로 모듈러스에 대해 모든 부울 값을 true로 설정합니다. 이 경우에는 11이므로 배열의 처음 11 개 부울은 true로 설정되고 나머지는 false로 설정됩니다. 값을 검색하려면 카운터에 배열 길이를 곱한 다음 각 부울 세트마다 1을 true로 추가하십시오 (첫 번째 false에서 중지). 이제 숫자 245는 어디에도 저장되지 않으며 금량을 변경하기 위해 조작해야 할 메모리 위치를 찾기가 어려울 것입니다. 이 객체를 만들 때 배열 길이를 다른 크기로 설정하고 싶을 수 있습니다 (일부 범위에서 임의의 숫자를 임의로 선택할 수 있음).

편집 : 이것은 멀티 플레이어 및 싱글 플레이어에 유용합니다. 패킷의 값이 변경 될 수있는 멀티 플레이어에서도 수행 할 수있는 부정 행위가 있습니다. 이를 위해서는 각 패킷에 서명하는 것과 같은 다른 기술이 필요합니다.


1
일반적으로 부정 행위를 방지하기 위해 멀티 플레이어 게임은 서버의 모든 항목을 계산하므로 클라이언트의 값 또는 서버로 전송 된 패킷의 값을 수정해도 실제 게임의 내용은 변경되지 않습니다. 그러나 여전히 나머지 답변은 흥미 롭습니다.
Vaillancourt

@AlexandreVaillancourt 좋은 지적입니다. 서버의 CPU 계산 서명을 다운시키는 데 관심이 있습니다. 두 플레이어 사이에 패킷을 전달하여 서버를 빠르게 유지하고 싶지만 이제 지적 했으므로 자세히 살펴 보겠습니다.
호세 마르티네즈

클라이언트에서 서버로 입력을 보내는 경우 모든 패킷에 서명 할 필요는 없습니다. 서버에서 입력이 이해되지 않으면 입력이 거부되거나 클라이언트가 부정 행위로 추방됩니다. 서버는 게임의 다음 상태를 계산 한 다음 모든 플레이어에게 새로운 상태를 보냅니다. 이는 일반적으로 부정 행위를 피하는 방법입니다 (이러한 봇을 제거하지는 않지만 최소한 플레이어의 일시적인 부정 행위는 피합니다) .
Vaillancourt

1
이를 방지하기 위해 서버가 새 수명을 업데이트 한 다음 새 수명을 클라이언트에 보냅니다. 모든 것은 서버에서 계산되며 클라이언트가 중요한 모든 것들에 대해 단순히 "단순한 터미널"이되도록합니다. 시간 T "에서 버튼 X"), 서버로 전송하고 서버에서 새로운 상태를 수신 ( "플레이어는 이제 X, Y 위치", "플레이어 수명 ZZZ")하여 플레이어에 표시합니다.
Vaillancourt

1
이를 통해 사기꾼 (중간에있는 사람)은 패킷으로 원하는 모든 것을 엉망으로 만들 수 있습니다. 서버가 입력이 유효한지 확인하기 때문에 서버에서 게임 상태를 변경하지 않습니다. 마지막 0.03 초 내에 5 개의 다른 위치에서 정상이 아니므로이 클릭을 거부하겠습니다 ")하고 모든 시뮬레이션을 실행 합니다.
Vaillancourt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.