글로벌 최고 점수 테이블에 대한 잘못된 점수 보고서를 어떻게 방지 할 수 있습니까?


44

브라우저 및 모바일 게임에는 일반적으로 글로벌 최고 점수 테이블이 있습니다. 또한이 테이블에는 2,147,483,647의 점수가 포함되어 있습니다.이 점수는 사람들이 점수를보고하는 웹 서비스 호출을 파악하여 가상 점수를 기록하는 데 사용되었습니다.

간단한 퍼즐 게임의 경우, 점수보고 통화와 함께 플레이어가 한 모든 움직임 (및 레벨을 생성하는 데 사용되는 임의의 시드)의 기록을 포함하여이를 방어 할 수 있습니다. 그런 다음 서버에서 전체 게임을 재현하고 확인할 수 있습니다.

그러나 Pac-man보다 큰 제품에는 이것이 불가능합니다.

이런 종류의 부정 행위를 어떻게 방지 할 수 있습니까?


전 세계 최고 점수 테이블을 만들기 위해 동일한 기술을 사용하는 iPhone 게임과 관련하여 똑같은 질문이있었습니다.
deft_code

당신이 있습니까 장해야 는 재생을 보낼 불가능한 것입니까?
o0 '.

그래 확실해. :)
teedyay

답변:


9

Moblox에 사용한 내부 시스템 (나중에 OpenFeint로 교체)은 다음과 같이 작동했습니다.

  • 일반 HTTP (HTTPS 아님)를 통해 JSON 메시지를 보냅니다. 모든 필드의 MD5 해시와 매직 문자열을 포함합니다.
  • 서버에서 동일한 조작으로 메시지의 무결성을 점검하십시오.

시스템을 크랙하려면이 마법의 끈을 찾아야합니다. 리버스 엔지니어링으로 가능하지만 고통 스럽습니다.

OpenFeint, ScoreLoop 및 CocosLive는 모두 동일한 트릭을 사용하지만 HTTPS를 사용합니다. 구현하기 매우 쉽습니다.


29
나는 당신의 마술 줄을 찾기위한 리버스 엔지니어링이 그렇게 어려울 것이라는 것은 매우 모호합니다.
Kylotan

4
이것은 네이티브 C ++의 Android 애플리케이션입니다. 사용할 수있는 기호 나 좋은 디버거가 없습니다. 따라서 ARM 코드를 읽을 수 있지만 쉽게 추적 할 수는 없습니다. 키는 여러 작업으로 구성되므로 모든 문자열이 충분하지 않습니다. 그것은 완벽하지는 않지만 매우 고통 스럽습니다.
Ellis

3
최소한 미국 대학에서 표준 학부 운동은 y86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/… ) 어셈블리 코드를 읽어서 설명한대로 구성된 비밀번호를 리버스 엔지니어링하는 것 입니다.

12
이것은 매우 약한 기술로 개발자에게 매우 잘못된 보안 감각을 부여합니다.
o0 '.


21

복잡한 게임을 위해 서버로 전체 리플레이를 보내는 것이 항상 가능한 것은 아니라는 것이 맞지만, 서버는 주기적으로 (반 무작위로) 클라이언트에게 상태의 일부를 요청함으로써 비슷한 시스템을 사용할 수 있습니다. 게임이 실행 중입니다.

예를 들어, FPS에서 매 분마다 "얼마나 많은 적을 사살합니까?", "모든 적은 어디에 있습니까?"등을 물을 수 있습니다. 합리적인 시간, 그들은 속임수입니다.

물론, 이것은 전체 플레이 세션 동안 게임이 온라인 인 경우에만 작동합니다. 여기서 목표는 온라인 리더 보드에 업로드 할 수있는 것이기 때문에 합리적인 것으로 생각합니다. 플레이어가 틀린 답변을하더라도 게임에서 쫓아 내지 말고 점수 목록에 올리지 마십시오.

그러나 리플레이 전송을 다시 고려하는 것이 좋습니다. 실제로 필요한 것은 초기 랜덤 시드 및 타임 스탬프 입력입니다. 실제로 최대 수백 KB가되어야합니다. 많은 아케이드 게임은 이미 플레이어 리뷰 목적으로 리플레이를 저장하기 위해이 작업을 수행합니다. 서버가 이것들을 검증하도록하는 것은 사소한 것이 아니지만 봇팅을 제외한 모든 종류의 부정 행위를 방지합니다.


10

최고 점수 표에서 가장 높은 결과를 모니터링하여 가장 악용 사례를 제한 할 수 있습니다. 게임에 따라 "완벽한 점수"를 가질 수 있으며 그보다 높은 점수는 사기 여야합니다. 그렇지 않은 경우 가장 낮은 "불가능한 점수"를 계산할 수 있습니다. 플레이어는 초당 10 발의 탄을 발사 할 수 있고, 게임은 1 분 동안 지속될 수 있으며, 사망 한 적의 점수는 100 점입니다. 그런 다음 60,000보다 높은 점수는 사기 여야합니다.

일부 메타 데이터를 전송하여 문제를 완화 할 수도 있습니다. 전체 게임 히스토리가 아니라 점수를 구성하는 구성 요소입니다. 말하기 : 점수 60000, 적 500 명 사망, 보너스 아이템 1 개 획득 그런 다음 간단한 확인을 수행 할 수 있습니다. 이것은 "불분명 한 보안"이므로 전혀 안전하지는 않지만 가장 순진한 공격자를 제거하는 데 도움이됩니다.


메타 데이터와 일치하지 않는 점수를 제출 한 사용자 (IP에 의해)를 플래그 할 수도 있습니다. 그런 다음 DOES가 올바른 메타 데이터를 가지고 있다는 점수를 다시 제출하려고하면이를 면밀히 조사하고 완전히 금지 할 수 있습니다. 또한 점수 요청을 제출하여 건방진 메시지를 다시 보낼 수도 있습니다 :)
Adam Harte

이 답변이 허용되는 답변보다 낫다고 생각합니다. 플레이어가 달성 할 수있는 최대 값을 알아 내십시오. 더 높은 것은 버립니다.

6
따라서 대학에가는 한 명의 선수가 속임수를 쓰면 네트워크상의 모든 사람들이 이제 사기꾼이됩니다
AttackingHobo

6

나머지는 (정의 적으로는) 믿기 어려워서 합법적 인 (그리고 멋진) 플레이어 일 수 있기 때문에 궁극적으로 당신은 엄청나게 높은 점수만을 배제 할 수 있습니다.

그렇지 않으면 난독 화 기술 (예 : 암호화 및 점수 이외의 다른 통계 전송)에 의존해야합니다.

또한 게임이 진행되는 동안 주기적으로 점수를 보내 부정 행위에 복잡성을 가중시킬 수 있습니다. 즉, 서버가 특정 점수를 보증 할만큼 오랫동안 게임을 진행했는지 여부를 판단하고 충분한 중간 보고서를 보장 할 수 있습니다 재생 시간 동안 수신되었습니다 (단, 100 %로 만들지 마십시오.

궁극적으로 누군가는 그것을 깨는 방법을 찾을 것이므로 그들을 막으려 고 자살하지 마십시오.


6

나는 잠시 동안 내 프로젝트에 빠른 / 더러운 높은 점수 테이블을 추가하고 인터넷 보안 등에 정통하지 않은 등 결함이있는 것으로 판명되었습니다. 놀랍게도 거의 1,200,000 개의 기록 된 점수로 5 ~ 6 번 정도의 명백한 부정확 한 점수가 보드 상단에 도달했을뿐입니다. 대부분의 점수는 실제 "해킹"보다 게임에서 결함처럼 보입니다.

따라서 중요한 점은 다음과 같습니다. 게임의 스코어링 시스템이 완벽한 지 확인 하거나 적어도 실제로는 좋은 타당성 검사를 수행해야합니다. 지금, 내가 말하고있는이 게임은 Ludum Dare 48hr 입장이었습니다. 그래서 가장 안정적인 것은 아니 었습니다. 그러나 전반적으로 저는 캐주얼 플레이어가 게임 내 결함을 발견 / 탐구 할 가능성이 더 높다고 생각합니다 누군가 리더 보드를 직접 "해킹"하는 것.

즉, 지금이 프로젝트를 다시 작성하고 있으며 난독 화로 처리하고 있습니다. 너무 자세하게 설명하지는 않지만 기본적으로 모든 점수가 임의의 값과 해싱 및 마법 문자열을 기반으로 주요 값을 제출하도록합니다. 그런 다음 해당 확인을 통과하고 실제 " 상위 X "리더 보드는 다른 검증 라운드를 통과해야합니다 (이번에는 서버 측에서 만료 키 값이 생성되고보다 철저한 타당성 검사가 수행됨).

또한 어떤 종류의 패킷 추적기를 사용하여 어떤 종류의 가시성이 보이는지 테스트하는 것이 좋습니다 (원래는 패킷 추적기를 사용하여 업로드 된 점수의 http 요청을 알지 못하고 복제하기 위해 패킷 추적기를 사용할 수 있음을 의미하는 훨씬 간단한 검증을 수행했습니다) 마술 줄 또는 무엇이든 (합법적 인 점수가 먼저 필요하지만 원하는만큼 중복 점수를 보낼 수 있음). 이것을 테스트하기 위해 Wireshark 를 사용 했습니다.

허, 이것은 조금 길지만, 희망이 있습니다 ...


확실합니다. 소금에 절인 해시가 좋은 방법입니다. 나는 그들이 동일한 유효한 점수를 여러 번 재전송한다고 생각하지 않았습니다. 패킷 (및 해시)에 포함 된 GUID와 타임 스탬프는 지불해야합니다. 서버에서 듀프를 확인할 수 있습니다. 감사합니다.
teedyay

3

나는이 분야의 전문가는 아니지만 내가 당신이라면 코드에 포함 된 키로 점수를 암호화하려고 노력할 것입니다. 이러한 사람들은 웹 서비스에 사용되는 일반 텍스트 대신 코드에 리버스 엔지니어링을 적용해야합니다.


2
한 번 더 나아가겠습니다. exe 파일 (또는 그 일부)을 해싱하여 코드에서 해시를 생성하십시오. 송신 점수가 버전 번호를 보내면 서버는 간단한 상수 버전 번호-> 해시 코드가있는 테이블을 사용하여 유효성을 검사 할 수 있습니다. 그런 다음 프로그램을 수정하여 누군가가 속임수를 쓰면 그의 높은 점수는 계산되지 않습니다.
구성자

7
누군가 프로그램을 수정하는 경우 원하는 키를 이미 보낼 수 있습니다.

2
@Joe Wreschnig, 원하는 키를 보낼 수 있지만 서버는 유효한 키만 허용하도록 설정해야합니다.
AttackingHobo

5
Joe의 요점은 새로 수정 된 프로그램의 해시를 사용할 필요는 없지만 이전 해시가 무엇이든 보낼 수 있다는 것입니다.
Kylotan

1
@ gd1 : 어떻게 도움이됩니까?
Kylotan

1

스피드 런은 기본적으로 모든 키 입력을 기록하고 있으며 WHOLE 게임에 대한 기록입니다. 예, 게임 전체를 기록 할 수는 없습니다. 모든 것을 할 수있는 다른 방법은 리버스 엔지니어링을 통해 깰 수있다 (나는 그것을 충분히 강조 수 없습니다 : 보안, 당신은 무명을 추가하는 추가하지 않는).

여전히, 당신이 이런 식으로해도 실제로 스피드 런을 제출할 수 있습니다. 이를 막기 위해 아무것도 할 수 없습니다.


2
일반적으로 녹화가 아닌 재생은 서버에서 실행할 수없는 부분입니다. 클라이언트가 몇 시간 동안 게임을 한 경우 서버 측 재 시뮬레이션에 많은 CPU 시간이 소요될 수 있습니다. 많은 사람들이 점수를 제출하는 경우 실제로 받아 들일 수 없습니다.

2
데이터 패킷의 크기는 모바일 게임에서 문제가 될 수 있습니다. 특히 플레이어가 바이트 단위로 대역폭을 지불하는 경우.
teedyay

오, 둘 다 말이 사실입니다. 여전히 다른 "실제"솔루션은 없습니다.
o0 '.

11
제출 된 모든 기록을 검증 할 필요는 없으며, 상위 10 개까지 기록한 내용 만 검증하면됩니다. 그리고 실시간으로 할 필요는 없습니다. 정기적 인 배치 프로세스가 좋습니다.
회색

@teedyay 플레이어가 초당 평균 5 개의 작업을 수행하고 각 작업을 32 비트로 완전히 설명 할 수 있다고 가정합니다. 초당 20 바이트 또는 시간당 72kB입니다. 미국의 일반적인 모바일 데이터 가격은 GB 당 10 달러 또는 1000kB 당 1 센트입니다.
Damian Yerrick

1

당신이 그것을 가지고있는 동안, 높은 점수가 단순히 악용을 찾은 플레이어인지 여부에 대한 질문이 있습니다 (예를 들어, 게임의 일부가 점수를 부과하고 버그로 인해 부정적인 점수가 "포장됩니다" 매우 긍정적이 되려면 ... 또는 보드에 안전한 장소와 같은 특정 게임 조건을 발견 한 플레이어는 단지 거기에 앉아서 무기한으로지는 것에 대해 걱정할 필요가 없습니다).

핵과 게임 익스플로잇의 차이점을 알기 위해서는 최소한 일부 플레이 데이터를 업로드하는 것이 좋습니다. 적어도 악용을 해결하는 데 도움이 될 것입니다.

일부 게임 (특히 턴 기반 게임)의 경우 실제로 모든 게임 로직이 서버 측에 존재하고 클라이언트는 인터페이스 인 서버를 통해 게임을 할 수 있습니다. 이를 통해 점수 해킹이 훨씬 어려워 질뿐만 아니라 서버의 모든 플레이어 작업을 사소하게 기록 할 수 있으므로 언제든지 모든 게임을 재생할 수 있습니다. 나는 트 위치 액션 슈터와 같은 것을 위해 이것이 비현실적 일 수 있음을 알고 있습니다.


1

하나의 시드에서 모든 임의의 원점을 만들고 모든 프레임에 대한 입력을 저장하십시오. 높은 점수를받은 경우 (예 : 상위 50 위) 시드와 전체 입력을 서버로 보냅니다. 높은 점수를 얻으면 서버에서 게임을 재생하고 순위표를 업데이트하십시오.

요청 크기 때문에보다 정교한 게임에이 방법을 사용할 수 없다고 생각되면이 예를 살펴보십시오.

게임에 8 개의 버튼 입력 (1 개의 패드와 4 개의 버튼)이 있고 60fps로 작동한다고 가정 해보십시오. 1 시간 게임 입력은 압축없이 3.6KB로 전송할 수 있습니다. 사용자 입력에는 많은 중복성이 있기 때문에 세션에는 아마도 1 시간 미만이 소요될 수 있으며 압축으로 압축 시간이 크게 줄어 듭니다.

문제는 서버에서 기록 된 입력 및 실행 파일로 게임을 결정적이고 재생 가능하게 만드는 것입니다.


0

전에 이것을 구현 한 적이 없지만 ...

타임 스탬프와 함께 점진적으로 점수를 보냅니다. 이를 통해 점수가 얼마나 자주 향상되는지 확인할 수있을뿐만 아니라 최고 점수의 "모멘텀"을 추적 할 수 있습니다.

그런 다음 점수에 대한 이정표 / 기준을 설정합니다.

예를 들어, 20,000보다 큰 점수는 게임의 처음 20 초에 도달 할 수 없습니다. 250,000보다 큰 점수는 200,000보다 큰 항목이 없으면 도착할 수 없습니다.

이것은 게임 상태를 보내는 것과 정확히 같지는 않지만 가깝습니다.

부작용 : 이로부터 얻을 수있는 유용한 게임 플레이 통계를 모두 생각해보십시오. 누군가는 그것을 위해 좋은 돈을 지불 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.