문제

저는 제가 작성하고 있는 기본(웹이 아닌) 싱글 플레이어 게임을 가지고 놀고 있는데, 매일/매주/항상 게임이 있다는 생각이 들었습니다. 온라인 최고 점수 목록 (Xbox Live 리더보드를 생각해보세요) 게임을 훨씬 더 흥미롭게 만들고 (소량의) 커뮤니티와 경쟁을 추가할 것입니다.그러나 사람들이 이러한 기능을 해킹에 대한 초대로 간주하여 일반 플레이어가 엄청나게 높은 점수로 인해 사기를 잃을까 두렵습니다.

나는 그러한 시도를 방지하는 확실한 방법(예: 공개/개인 키 암호화)에 대해 생각했지만 해커가 내 모든 아이디어(바이너리에서 공개 키를 추출하여 가짜 암호화된 파일을 보내는 것)를 우회할 수 있는 합리적으로 간단한 방법을 알아냈습니다. 예를 들어 점수).

온라인 최고 점수 목록이나 리더보드를 구현해 본 적이 있나요?이것을 구현하는 합리적으로 해커 방지 방법을 찾았습니까?그렇다면 어떻게 했나요?해킹 시도에 대한 귀하의 경험은 어떻습니까?

도움이 되었습니까?

해결책

결국 고객을 신뢰하는 것입니다. 클라이언트가 리플레이를 서버로 보내면 성공적인 플레이 스루를 복제하거나 수정하여 서버로 보내기가 쉽습니다.

가장 좋은 방법은 플레이어가 극복 할 가치가 있다고 생각하는 것보다 부정 행위에 대한 기준을 높이는 것입니다. 이를 위해 사용할 수있는 입증 된 (하지만 자주 언급되지 않는) 기술이 있습니다.

  1. 블랙리스트에있는 사기꾼은 허니팟에 남겨 둡니다. 자신의 점수는 볼 수 있지만 다른 사람은 볼 수 없습니다. 다른 계정으로 로그인하여 확인하지 않는 한 게임을 성공적으로 해킹했다고 생각합니다.
  2. 누군가 사기꾼으로 신고되면 계정에 미치는 영향이 발생하지 않고 미래의 특정 시점까지 연기됩니다. 이 지점을 1 ~ 3 일 이내에 무작위로 만드십시오. 일반적으로 사기꾼은 여러 가지 방법을 시도하고 결국 성공합니다. 계정 상태 피드백을 나중으로 미루면 무엇을 포착했는지 이해하지 못합니다.
  3. 모든 게임 사용자 명령을 캡처하여 서버로 보냅니다. 주어진 델타 내의 다른 점수와 비교하여 확인하십시오. 예를 들어, 플레이어가 슛 액션을 200 번 사용했지만 200,000 점을 얻었지만 게임 내 주변 플레이어가 210,000 점을 얻기 위해 5,000 번 슛을했다면, 그 사람을 더 멀리 또는 인간으로 표시하는 임계 값이 트리거 될 수 있습니다. 조사.
  4. 사용자 계정에 가치와 지속성을 추가합니다. 사용자 계정에 게임 잠금 해제 기능이 있거나 게임에 구매가 필요한 경우 사용자가 웹 기반 프록시를 통해 새 계정을 생성하는 것만으로는 이전 계정 상태를 되 찾을 수 없기 때문에 금지의 무게가 더 큽니다.

다른 팁

사용자가 제어하는 ​​시스템에서 게임이 실행되는 동안에는 어떤 솔루션도 완벽할 수 없지만 시스템 해킹을 더욱 어렵게 만들기 위해 취할 수 있는 몇 가지 단계가 있습니다.결국 목표는 시스템 해킹을 그 가치보다 더 문제로 만드는 것일 뿐입니다.

  • 서버 측의 유효성을 검사하기 위해 높은 점수 요청과 함께 몇 가지 추가 정보를 보냅니다.모든 X에 대해 5점을 얻었고 게임에 10개의 X만 포함되어 있다면 해커가 점수를 유효하게 인정받기 위해 뛰어넘을 수 있는 추가 고리가 있는 것입니다.
  • 서버가 해당 오프셋에서 몇 바이트의 게임 바이너리로 충족되어야 하는 무작위 챌린지를 보내도록 합니다.이는 해커가 바이너리의 깨끗한 복사본을 보관해야 함을 의미합니다(조금 더 문제가 있을 뿐입니다).
  • 라이센스 키가 있는 경우 이를 포함하려면 높은 점수가 필요하므로 시스템을 해킹하다가 적발된 사람들을 금지할 수 있습니다.또한 위에 정의된 잘못된 시도를 추적하여 유효한 점수를 제출하기도 전에 프로토콜을 테스트하는 사람들을 금지할 수 있습니다.

하지만 전체적으로 사람들이 해킹에 관심을 가질 만큼 게임을 인기 있게 만드는 것은 아마도 훨씬 더 큰 도전일 것입니다.

솔직히 불가능하다고 생각합니다.

필자는 내가 요구 한 보안을 위해 충분히 잘 작동하는 압축 바이너리를 사용하여 매우 간단한 키 암호화를 사용하기 전에 해봤지만 누군가 온라인 최고 점수 테이블을 크래킹하는 것을 해킹으로 간주한다면 그렇게 될 것이라고 생각합니다.

여러분이 모두 해고 할 수 없다면 꽤 밝아지는 꽤 슬픈 사람들이 있습니다. 그것은 잃어버린 원인입니다.

게임에 리플레이 시스템이 내장 된 경우 서버에 리플레이를 제출하고 서버가 리플레이에서 점수를 계산하도록 할 수 있습니다.

이 방법은 완벽하지 않습니다. 게임 속도를 늦추거나 (액션 기반 인 경우) 봇을 작성하여 속일 수 있습니다.

저는 저의 플래시 게임으로이 중 일부를 해왔고 정말지는 싸움입니다.특히 너무 많은 노력없이 다소 읽기 쉬운 코드로 디 컴파일 할 수있는 ActionScript의 경우.

내가 해왔 던 방식은 점수와 선수 이름을 일반 텍스트로 전송 한 다음 둘의 해시 (제대로 솔트 처리)를 보내는 다소 일반적인 접근 방식입니다.그것을 알아 내기 위해 노력할만큼 결심 한 사람은 극소수이며, 어쨌든 그것을 할 사람은 거의 없으며, 당신이 그것에 투자하는 모든 시간을 부정합니다.

요약하자면, 저의 철학은 게임을 더 좋게 만드는 데 시간을 할애하고 속임수를 충분히 어렵게 만드는 것입니다.

매우 효과적인 방법은 게임을 플레이하면서 서버에 점수를 여러 번 제출하여 매번 약간의 게임 플레이 정보를 전송하여 점수가 "실제"인지 확인할 수 있도록하는 것입니다.그러나 그것은 실제로 약간 과장 될 수 있습니다.

정말 어려운 질문입니다.

나는 그런 것을 구현 한 적이 없지만 여기에 간단한 근사화가 있습니다.

주요 관심사는 해커가 애플리케이션이 수행하는 작업을 추측 한 다음 자체 결과를 보내는 것입니다.

먼저, 귀하의 신청서가 큰 성공을 거두지 않는 한 저는 걱정할 필요가 없습니다. 그런 일을하는 것은 매우 어렵습니다.

암호화는 문제에 도움이되지 않습니다. 암호화는 도중에 데이터를 보호하는 데 도움이되지만 데이터가 암호화되기 전에 (주요 취약점이있을 수있는) 트랜잭션의 어느 쪽도 보호하지 못합니다. 따라서 확실하게 암호화하면 데이터는 비공개로 유지되지만 안전하지 않습니다.

정말 걱정된다면 코드를 난독 화하고 무엇을하고 있는지 완전히 명확하지 않은 방식으로 점수 시스템을 설계하는 것이 좋습니다. 여기서 우리는 암호화 프로토콜에서 몇 가지를 빌릴 수 있습니다. 예를 들면 다음과 같습니다.

  1. 점수가 어떤 숫자 m이라고 가정 해 보겠습니다.
  2. 점수에 대해 어떤 종류의 수표를 계산합니다 (예 : CRC 또는 발이 보이는 다른 시스템. 실제로 하나를 발명하면 아무리 절름발이더라도 더 잘 작동합니다)
  3. 보안 연결을 통해 원격 서버에서 사용자 (D)의 개인 키를 얻습니다. 이 키를 아는 사람은 당신뿐입니다.
  4. X= m ^ D mod n 계산 (n은 공개 / 개인 키 알고리즘의 공개 모듈) (즉, 암호화 : P)

    보시다시피 다른 종류의 난독 화일뿐입니다. 원하는만큼 내려갈 수 있습니다. 예를 들어 X에 가장 가까운 두 개의 소수를 조회하고이를 사용하여 CRC를 암호화하고 서버로도 보낼 수 있으므로 CRC와 점수를 개별적으로 다른 암호화 체계로 사용할 수 있습니다.

    난독 화와 함께 사용하면 해킹하기 어려울 것입니다. 그럼에도 불구하고 역 엔지니어링이 될 수도 있지만, 그것은 모두 해커의 관심과 능력에 달려 있지만 ... 진지하게, 어떤 종류의 괴물이 게임에서 결과를 바꾸기 위해 그렇게 많은 노력을 기울이는가? (와우 같은 것이 아니라면)

    마지막 메모

    .NET 용 Obfuscator

    Delphi / C ++ 용 Obfuscator

    어셈블러 용 Obfuscator (x86)

다른 답변에서 알 수 있듯이 잠재적으로 악의적 인 클라이언트를 신뢰해야하며 간단한 제지 제와 약간의 사람 모니터링만으로도 작은 게임에 충분합니다.

원하는 경우 점수 데이터에서 사기 패턴을 찾아야합니다. 신용 카드 회사와 유사한 방식으로 청구 데이터를 확인합니다.클라이언트가 서버에 통신하는 상태가 많을수록 코드를 통해 정확하거나 잘못된 동작 패턴을 찾기가 더 쉬워집니다.예를 들면.클라이언트가 점수의 시간 기반 감사 로그를 업로드해야한다고 말하면 (다른 클라이언트가 상위 게임을 시청하도록 할 수도 있음) 서버는 점수 로그가 게임 규칙을 위반하는지 확인할 수 있습니다.

결국 이것은 여전히 점수 판을 속이는 것을 막을만큼 비용이 많이 드는 문제입니다.유효성 검사 시스템에 대한 모든 새로운 공격을 처리하기 위해 서버 코드를 항상 개선 할 수있는 시스템을 원할 것입니다.

@Martin.

이것은 Mario Kart Wii가 작동한다고 믿습니다.추가 된 보너스는 다른 모든 플레이어가 고득점 보유자가 고득점을 얻는 방법을 볼 수 있다는 것입니다.이것에 대한 재미있는 점은 가장 빠른 " Grumble Volcano "시간을 확인하면트랙의 95 %를 건너 뛸 수있는 바로 가기를 누군가가 발견 한 것을 볼 수 있습니다.아직 가장 빠른 기록인지 잘 모르겠습니다.

신뢰할 수없는 클라이언트 플랫폼에서는이를 수행 할 수 없습니다.실제로는 "신뢰할 수있는"플랫폼조차도 물리 칠 수 있습니다.

일반적인 경우 감지 할 수없는 다양한 공격이 있습니다. 주로 메모리의 변수를 수정합니다.자신의 프로그램의 변수를 신뢰할 수 없다면 실제로 많은 것을 성취 할 수 없습니다.

위에 설명 된 다른 기술이 도움이 될 수 있지만 신뢰할 수없는 플랫폼에서 실행하는 기본적인 문제를 해결하지는 못합니다. <시간>

관심이 없는데, 사람들이 고득점 테이블을 해킹하려고 할 것이라고 확신합니까?나는 2 년 넘게 사소한 고득점 테이블로 온라인 게임을 해왔다.많은 사람들이 그것을 연주했지만 누군가가 높은 점수를 얻으려고 시도했다는 증거는 없습니다.

일반적으로 부정 행위 및 해킹에 대한 가장 큰 방어자는 커뮤니티 감시입니다. 점수가 다소 의심 스러우면 사용자는 부정 행위에 대한 점수를보고 할 수 있습니다. 그리고 충분한 사람들이 해당 점수를보고하면 관리자가 리플레이의 유효성을 확인할 수 있습니다. 이미 많은 플레이어가 합법적으로 게임을하고 있다면 봇과 실제 플레이어의 차이를 쉽게 알 수 있습니다.

관리자는 질문이있는 점수 만 감독해야합니다. 많은 사용자가 완벽하게 힘들게 얻은 점수를 제거하기 위해 악동을 일으킬 가능성이 적기 때문입니다. 관리자는보고되는 몇 가지 점수 만 확인하면되므로 시간이 너무 많이 걸리지 않고 작은 게임의 경우에는 훨씬 적습니다.

봇을 만들기 위해 열심히 노력하면 신고 시스템에 의해 다시 격추당하는 것만으로도 그 자체로 억제력이됩니다.

아마도 리플레이 데이터를 암호화해도 문제가되지 않을 것입니다. 재생 데이터는 종종 작으며 암호화하는 데 더 많은 공간이 필요하지 않습니다. 이를 개선하기 위해 서버 자체가 제어 로그에 의한 리플레이를 시도하고 달성 한 점수와 일치하는지 확인합니다.

치트 방지 시스템에서 찾을 수없는 것이 있으면 사용자가 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top