2013-03-14 2 views
5

나는 점수가 서버로 보내지는 C++ 11 게임을 만들고있다. 점수를 간단한 플로트로 저장하므로 서버에 보내기 전에 Cheat Engine과 같은 소프트웨어를 사용하는 사람들은 쉽게 점수 값을 변경할 수 있습니다.메모리 스캐너에서 게임을 보호하기 (치트 엔진과 같은)

어떻게 이런 종류의 공격으로부터 게임을 보호 할 수 있습니까?

+0

수 없습니다. 서버 측 서버로 전송되는 데이터의 유효성을 검사해야합니다. – meagar

+0

동시에 소금에 절인 해시를 보내십시오 ... –

답변

8

할 수있는 옵션이 많이 있지만 클라이언트의 중요한 값을 허용하지 않는 것이 가장 좋습니다. 서버가 모든 계산을 수행하고 클라이언트에 값을 전송하십시오.

+0

이것은 항상 옵션이 아닙니다. – supertonsky

+0

@supertonsky 어떻게 그렇게? 나는 이것을하지 않는 단일 게임을 생각할 수 없다. – Caesar

+0

클라이언트에서 연산을 수행하는 게임이 있지만 치트 엔진을 사용하여 게임을 할 때와 상관없이 단순히 게임을 해킹 할 수는 없습니다. 웬일인지 나는 메모리에 접근 할 수 없었다. 이제 그게 뭔가 있습니다. 그것이 무엇이든, 그것은 훌륭합니다. 메모리에 액세스 할 수있는 게임이 있지만 주소를 얻은 후에는 "변수"가 메모리 주소를 변경하는 것처럼 보이므로 엔진을 쓸모없는 엔진처럼 쓸모 없게 만듭니다. – supertonsky

2

처음부터 클라이언트 측에서해야 할 일이 있으면 관심있는 모든 데이터 (또는 가능하면 모든 데이터)를 암호화하십시오.

중요한 것은 서버에서 계산하는 것이 더 나을 것입니다. 예를 들어, Call of Duty에서는 서버가 개별 플레이어의 컴퓨터/지연 시간 등을 촬영할 대상을 결정하기를 원합니다. 참여하지 않는다.

로컬 PC 전용 게임을하고 끝에 점수를 업로드하려는 경우 서버 계산은 옵션이 아닙니다. 이 경우 암호화를 고수하고 중요한 값을 모호하게 사용해야합니다. 네가 할 수있는 일은 너무 많아. 100 % 고객 측에서 계산 한 경우에는 절대 불확실성이 없을 것입니다.

+1

그리고 클라이언트에서 암호화 키를 사용하지 않고도 그렇게 할 수있을 것으로 기대합니까? ;) –

+1

정교한 사용자가 암호화 키를 추출하여 서버에 전송하려는 모든 점수를 암호화하는 데 사용할 수 있습니다 –

3

값이 변경되지 않았 음을 보장 할 수있는 방법이 없습니다. 당신이 할 수있는 것은 서버에 "이것이 가능합니다"라고 판단 할 수있는 충분한 정보를 보내는 것입니다. 예를 들어, 게임이 "Pac-Man"스타일의 게임 인 경우, Pac- 사람이 식사를했거나 각 레벨을 완료하는 데 걸린 레벨과 시간을 계산합니다. 치터가 필요한 모든 추가 데이터를 재생할 수는 없지만 더 많은 데이터를 보내려면 훨씬 어려워집니다. .

그러나 소프트웨어에서 언제든지 사용할 수있는 데이터는 "디버거"유형 응용 프로그램에 의해 수정 될 수 있습니다. 그것에 대해 할 수있는 일은 없습니다.

0

대규모 멀티 플레이어 인 경우 이론적으로 서버가 임의의 사용자 그룹의 특정 질문에 대한 응답을 요청하는 알고리즘을 가질 수 있습니다. 사기꾼은 주요 공모없이 서로 다른 답변을 얻을 것입니다.

Call of Duty와 같은 게임에서 30 명의 플레이어가있을 수 있으며 죽이면 큰 수의 동의가 필요합니다. 그런 식으로 한 팀이 담합 방법으로 속일 수는 없습니다. 리더 보드를 오르는 데 사용되는 대체 계정을 조심해야합니다.