Pergunta

Estou brincando com um jogo single-player nativo (não web) que estou escrevendo e me ocorreu que ter um jogo diário/semanal/de todos os tempos lista de recordes on-line (pense na Tabela de classificação do Xbox Live) tornaria o jogo muito mais interessante, adicionando alguma (pequena) quantidade de comunidade e competição.No entanto, temo que as pessoas vejam tal recurso como um convite ao hacking, o que desencorajaria os jogadores regulares devido a pontuações impossivelmente altas.

Pensei nas maneiras óbvias de impedir tais tentativas (criptografia de chave pública/privada, por exemplo), mas descobri maneiras razoavelmente simples pelas quais os hackers poderiam contornar todas as minhas ideias (extrair a chave pública do binário e, assim, enviar mensagens criptografadas falsas pontuações, por exemplo).

Você já implementou uma lista de recordes ou tabela de classificação online?Você encontrou uma maneira razoavelmente à prova de hackers de implementar isso?Se sim, como você fez isso?Quais são suas experiências com tentativas de hacking?

Foi útil?

Solução

No final das contas, você confia na confiança do cliente.Se o cliente enviar replays para o servidor, será fácil replicá-lo ou modificar uma reprodução bem-sucedida e enviá-la ao servidor.

Sua melhor aposta é elevar o nível de trapaça acima do que um jogador consideraria digno de ser superado.Para fazer isso, há uma série de técnicas comprovadas (mas frequentemente não mencionadas) que você pode usar:

  1. Deixe os trapaceiros na lista negra em um honeypot.Eles podem ver suas próprias pontuações, mas ninguém mais pode.A menos que verifiquem fazendo login com uma conta diferente, eles pensam que hackearam seu jogo com sucesso.
  2. Quando alguém é sinalizado como trapaceiro, adie qualquer repercussão na conta até um determinado ponto no futuro.Torne este ponto aleatório, dentro de um a três dias.Normalmente, um trapaceiro tentará vários métodos e eventualmente terá sucesso.Ao adiar o feedback do status da conta para uma data posterior, eles não conseguem entender o que os fez serem pegos.
  3. Capture todos os comandos do usuário do jogo e envie-os para o servidor.Compare-os com outras pontuações dentro de um determinado delta.Por exemplo, se o jogador usou a ação de arremesso 200 vezes, mas obteve uma pontuação de 200.000, mas os jogadores vizinhos no jogo atiraram 5.000 vezes para obter uma pontuação de 210.000, isso pode acionar um limite que sinaliza a pessoa para ação adicional ou humana. investigação.
  4. Adicione valor e persistência às suas contas de usuário.Se suas contas de usuário tiverem itens desbloqueáveis ​​para seu jogo, ou se seu jogo exigir compra, o peso de um banimento será maior, pois o usuário não poderá recuperar o status de sua conta anterior simplesmente criando uma nova conta por meio de um proxy baseado na web.

Outras dicas

Nenhuma solução será perfeita enquanto o jogo estiver sendo executado em um sistema sob o controle do usuário, mas existem algumas etapas que você pode seguir para tornar a invasão do sistema mais problemática.No final, o objetivo só pode ser fazer com que hackear o sistema seja mais problemático do que vale a pena.

  • Envie algumas informações adicionais com as solicitações de pontuação mais alta para validar o lado do servidor.Se você obtiver 5 pontos para cada X, e o jogo contiver apenas 10 Xs, então você terá alguns obstáculos extras para fazer o hacker pular para que sua pontuação seja aceita como válida.
  • Faça com que o servidor envie um desafio aleatório que deve ser enfrentado com alguns bytes do binário do jogo desse deslocamento.Isso significa que o hacker deve manter uma cópia original do binário (só mais um pouco de problema).
  • Se você tiver chaves de licença, exija pontuações altas para incluí-las, para que você possa banir pessoas flagradas invadindo o sistema.Isso também permite rastrear tentativas inválidas conforme definido acima, para proibir pessoas de testar o protocolo antes mesmo de enviar uma pontuação válida.

Resumindo, tornar o jogo popular o suficiente para que as pessoas se importem em hackeá-lo é provavelmente um desafio muito maior.

Sinceramente, não acho que seja possível.

Eu já fiz isso antes de usar criptografia de chave bastante simples com um binário compactado que funcionou bem o suficiente para a segurança que eu precisava, mas honestamente acho que se alguém considerar quebrar sua tabela de pontuação on-line como um hack, isso será feito.

Existem algumas pessoas muito tristes por aí que também são muito inteligentes, a menos que você consiga transar com todas elas, é uma causa perdida.

Se o seu jogo tiver um sistema de replay integrado, você poderá enviar replays ao servidor e fazer com que o servidor calcule a pontuação do replay.

Este método não é perfeito, você ainda pode trapacear desacelerando o jogo (se for baseado em ação) ou escrevendo um bot.

Tenho feito isso com meus jogos em Flash e é realmente uma batalha perdida.Especialmente para ActionScript que pode ser descompilado em código legível sem muito esforço.

A maneira como tenho feito isso é uma abordagem bastante convencional de enviar a pontuação e o nome do jogador em texto simples e, em seguida, um hash dos dois (devidamente salgado).Muito poucas pessoas são determinadas o suficiente para se esforçar para descobrir isso, e os poucos que o fazem fariam isso de qualquer maneira, anulando todo o tempo que você dedica a isso.

Resumindo, minha filosofia é gastar tempo melhorando o jogo e torná-lo difícil o suficiente para trapacear.

Uma coisa que pode ser bastante eficaz é fazer com que o jogo envie a pontuação ao servidor várias vezes enquanto você joga, enviando um pouco de informação do jogo a cada vez, permitindo validar se a pontuação é "realista".Mas isso pode ser um pouco exagerado, na verdade.

Essa é uma pergunta muito difícil.

Eu nunca implementei tal coisa, mas aqui está uma aproximação simples.

Sua principal preocupação é que os hackers adivinhem o que seu aplicativo está fazendo e depois enviem seus próprios resultados.

Bem, em primeiro lugar, a menos que sua aplicação tenha um grande sucesso, eu não ficaria preocupado.Fazer tal coisa é extremamente difícil.

A criptografia não ajudará com o problema.Veja bem, a criptografia ajuda a proteger os dados em seu caminho, mas não protege nenhum dos lados da transação antes que os dados sejam criptografados (que é onde pode estar a principal vulnerabilidade).Portanto, se você criptografar os dados, os dados permanecerão privados, mas não estarão seguros.

Se você estiver realmente preocupado com isso, sugerirei ofuscar o código e projetar o sistema de pontuação de uma forma que não seja completamente óbvia.Aqui podemos pegar emprestado algumas coisas de um protocolo de criptografia.Aqui está um exemplo:

  1. Digamos que a pontuação seja algum número m
  2. Calcule algum tipo de verificação da pontuação (por exemplo, o CRC ou qualquer outro sistema que você veja nos pés).Na verdade, se você simplesmente inventar um, não importa o quão idiota seja, ele funcionará melhor)
  3. Obtenha a chave privada do usuário (D) do seu servidor remoto (através de uma conexão segura, obviamente).Você é o único que conhece esta chave.
  4. Calcule X=m^D mod n (n sendo o módulo público do seu algoritmo de chave pública/privada) (ou seja, criptografe-o: P)

Como você vê, isso é apenas ofuscação de outro tipo.Você pode descer por esse caminho o tempo que quiser.Por exemplo, você pode procurar os dois números primos mais próximos de X e usá-los para criptografar o CRC e enviá-lo também para o servidor, para que você tenha o CRC e a pontuação separadamente e com diferentes esquemas de criptografia.

Se você usar isso em conjunto com ofuscação, eu diria que seria difícil de hackear.No entanto, mesmo isso poderia ser submetido a engenharia reversa, tudo depende do interesse e da habilidade do hacker, mas ...sério, que tipo de aberração se esforça tanto para mudar os resultados de um jogo?(A menos que seja WoW ou algo assim)

Uma última nota

Ofuscador para .NET

Ofuscador para Delphi/C++

Ofuscador para montador (x86)

Como diz a outra resposta, você é forçado a confiar em um cliente potencialmente malicioso, e um simples impedimento mais um pouco de monitoramento humano serão suficientes para um jogo pequeno.

Se você quiser ser sofisticado, terá que procurar padrões de fraude nos dados de pontuação, semelhante a uma empresa de cartão de crédito que analisa dados de cobrança.Quanto mais estados o cliente comunicar ao seu servidor, mais fácil será encontrar um padrão de comportamento correto ou incorreto por meio do código.Por exemplo.digamos que o cliente teve que fazer upload de um registro de auditoria da pontuação com base no tempo (que talvez você também possa usar para permitir que outros clientes assistam aos principais jogos), o servidor pode então validar se o registro de pontuação viola alguma das regras do jogo.

No final das contas, trata-se ainda de torná-lo caro o suficiente para desencorajar trapacear no placar.Você gostaria de um sistema onde pudesse sempre melhorar o código do servidor (mais fácil de atualizar) para lidar com quaisquer novos ataques ao seu sistema de validação.

@Martinho.

É assim que acredito que Mario Kart Wii funciona.O bônus adicional é que você pode permitir que todos os outros jogadores observem como o detentor da pontuação mais alta obteve a pontuação mais alta.O engraçado disso é que se você verificar o mais rápido "Vulcão Resmungar" trilha do tempo, você verá que alguém encontrou um atalho que permite pular 95% da trilha.Não tenho certeza se eles ainda consideram esse o tempo mais rápido.

Você não pode fazer isso em uma plataforma de cliente não confiável.Na prática é possível derrotar até mesmo algumas plataformas “confiáveis”.

Existem vários ataques que são impossíveis de detectar no caso geral - principalmente modificando variáveis ​​na memória.Se você não pode confiar nas variáveis ​​do seu próprio programa, você não poderá conseguir muito.

As outras técnicas descritas acima podem ajudar, mas não resolvem o problema básico de execução em uma plataforma não confiável.


Por curiosidade, você tem certeza de que as pessoas tentarão hackear uma tabela de pontuação?Eu tenho um jogo online há mais de dois anos com uma tabela de pontuação trivialmente quebrada.Muitas pessoas jogaram, mas não tenho evidências de que alguém tenha tentado quebrar as pontuações mais altas.

Normalmente, o maior defensor contra trapaças e hackers é a vigilância da comunidade.Se uma pontuação parecer bastante suspeita, o usuário pode denunciá-la por trapaça.E se um número suficiente de pessoas relatar essa pontuação, o replay poderá ser verificado pelos administradores quanto à validade.É bastante fácil ver a diferença entre um bot e um jogador real, se já houver um grupo de jogadores jogando com total legitimidade.

Os administradores devem supervisionar apenas as pontuações que são questionadas, porque há uma pequena chance de que um grupo de usuários possa remover uma pontuação obtida com tanto esforço.E os administradores só precisam ver as poucas pontuações que são relatadas, então não ocupam muito tempo, muito menos para um jogo pequeno.

Mesmo saber que se você trabalhar duro para criar um bot, apenas para ser abatido novamente pelo sistema de relatórios, já é um impedimento por si só.

Talvez até criptografar os dados de repetição também não fizesse mal.Os dados de reprodução geralmente são pequenos e criptografá-los não ocuparia muito mais espaço.E para ajudar a melhorar isso, o próprio servidor testaria o replay pelo log de controle e garantiria que correspondesse à pontuação alcançada.

Se houver algo que o sistema anti-cheat não consegue encontrar, os usuários encontrarão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top