Então, decidi que quero impedir que cópias piratas do meu jogo XNA acessem servidores oficiais do jogo (que são moderados, para que as pessoas que pagam pelo jogo tenham a melhor experiência) desconectando clientes com CD errado ou gerado, duplicado ou banido teclas (ou números de série, pois o jogo é digital e não há CDs).
Como faço para colocar esse sistema de proteção de número de série no meu jogo (clientes e servidor de autenticação principal), para que não seja facilmente hackável?
Observe que não tenho experiência em fazer uma boa proteção desse tipo para software.
Eu nunca fiz isso antes, mas entendo o básico. Percebo por que não consigo fazer verificações de chave no cliente; portanto, é bom usar autenticação de login / aprovação com entrada de chave única.
Atualmente, o objetivo dessa proteção é manter potenciais trapaceiros e comportar jogadores disruptivamente fora dos servidores oficiais. Qualquer um pode jogar em servidores privados com ou sem uma chave, mas a chance de obter uma experiência indesejável com outros jogadores é maior. Acho que é fácil comprar jogadores, pois eles precisam estar online para jogar em servidores oficiais.
Como invadir o cliente é muito fácil, protegerei apenas os procedimentos de registro inicial (e possivelmente autenticação no servidor), para que ninguém possa roubar as chaves enquanto estiver sendo transferido.
Veja também:
Respostas:
Basicamente, você tem três requisitos:
A primeira parte deve ser bem direta: não permita que dois jogadores entrem no mesmo servidor com a mesma chave ao mesmo tempo. Você também pode fazer com que os servidores troquem informações sobre usuários conectados ou entre em contato com um servidor de autenticação compartilhado, para que mesmo usando a mesma chave para diferentes players em diferentes servidores ao mesmo tempo falhe. Você provavelmente também desejará procurar padrões suspeitos de uso de chaves e, se determinar que uma chave vazou, adicione-a a uma lista de chaves banidas.
Para a segunda parte, uma maneira é simplesmente manter um banco de dados de todas as chaves emitidas válidas. Desde que as chaves sejam longas o suficiente (digamos, 128 bits ou mais) e escolhidas aleatoriamente (usando um RNG seguro), as chances de alguém conseguir adivinhar uma chave válida são essencialmente zero. (Mesmo chaves muito mais curtas podem ser seguras se você usar algum tipo de limitação de taxa em tentativas de login com falha para interromper as tentativas de encontrar chaves válidas por força bruta.)
Como alternativa, você pode gerar chaves usando qualquer identificador exclusivo e adicionando um código de autenticação de mensagem (como HMAC ), calculado usando uma chave mestra secreta. Novamente, desde que o MAC seja longo o suficiente, as chances de alguém que não conhece a chave mestra conseguir adivinhar um MAC válido para qualquer ID são desprezíveis. Uma vantagem desse método, além de remover a necessidade de um banco de dados de chaves, é que o identificador pode ser qualquer sequência exclusiva e pode codificar informações sobre o cliente para o qual a chave foi emitida.
Um problema com o uso de MACs é que os servidores oficiais de jogos (ou pelo menos o servidor de autenticação) precisam conhecer a chave mestra para verificar o MAC, o que significa que, se os servidores forem invadidos, a chave mestra poderá vazar. Uma maneira de mitigar esse risco poderia ser computar vários MACs para cada ID, usando chaves mestras diferentes, mas armazenar apenas uma das chaves mestres nos servidores do jogo. Dessa forma, se essa chave mestra for vazada e usada para gerar IDs falsos, você poderá revogá-la e alternar para outra chave mestra. Como alternativa, você pode substituir os MACs por assinaturas digitais , que podem ser verificadas usando apenas a metade pública da chave mestra.
Na terceira parte, uma abordagem é garantir que o cliente não envie sua chave a ninguém sem verificar se o destinatário é realmente um servidor oficial legítimo. Por exemplo, você pode usar SSL / TLS (ou DTLS ) para o processo de login, emitir certificados personalizados para seus servidores de jogos e ter apenas os certificados de confiança do cliente emitidos por você. Convenientemente, o uso do TLS também protegerá as chaves do cliente (e quaisquer outros dados de autenticação) contra interceptadores, por exemplo, em WLANs públicas.
Infelizmente, essa abordagem não permitirá que servidores de terceiros verifiquem as chaves do cliente, mesmo que desejem. Você pode contornar isso configurando um servidor de autenticação oficial que os servidores de jogos de terceiros possam usar, por exemplo, fazendo com que o cliente efetue login no servidor de autenticação e receba um token único aleatório que eles podem usar para efetuar login no servidor de autenticação. servidor de jogos (que envia o token ao servidor de autenticação para verificá-lo).
Como alternativa, você pode emitir certificados de clientes reais ou algo parecido para seus clientes. Você pode usar um protocolo existente (como TLS) que suporte a autenticação de certificado de cliente (recomendado) ou implementar o seu próprio, por exemplo:
(Esse protocolo pode ser simplificado ainda mais, fazendo com que o cliente gere o "desafio", que consiste em um ID do servidor e um carimbo de data e hora, e assine-o. Obviamente, o servidor precisa verificar se o ID e o carimbo de data / hora são válidos. esse protocolo simples, por si só, não impedirá que um invasor intermediário possa sequestrar a sessão do cliente, embora os impeça de obter a chave privada do cliente necessária para logins futuros.)
fonte
Não há 100% de segurança, mas você pode começar com uma abordagem bastante simples:
Você precisará de alguma maneira de verificar as chaves geradas, por exemplo, somas de verificação incluídas. Obviamente, isso não deve ser muito fácil de entender.
Opcional (mas recomendado), haveria um banco de dados do lado do servidor verificando as chaves com um banco de dados de todas as chaves fornecidas, para que você não possa gerar chaves, mesmo que possua o algoritmo (vamos ignorar o uso forçado).
A partir daí, você pode ter duas abordagens diferentes, mas de qualquer forma algo é muito importante:
Quanto aos caminhos reais:
Exija que a chave com hash (veja acima) seja enviada durante o procedimento de autenticação / login.
Como alternativa (na IMO, melhor, embora muitos não gostem desse tipo de "DRM"): Não use a chave no cliente. Em vez disso, exija que o usuário efetue login em uma conta e exija uma chave de CD válida (isso requer o banco de dados mencionado acima) para criar contas. É assim que os jogos modernos, por exemplo, qualquer MMORPG pago, lida com isso.
Pessoalmente, eu recomendaria a abordagem da conta por um motivo simples: no final, você não pode impedir as pessoas de roubar chaves de CD (força bruta, engenharia reversa ou fraude). Como tal, as pessoas poderiam simplesmente criar uma nova chave para continuar jogando ou bloquear outras pessoas do jogo. Com as chaves vinculadas à conta, ninguém pode fazer nada com uma chave que já está em uso. Caso alguém tenha comprado uma chave gerada por outra pessoa, você ainda poderá transferir a propriedade da conta, supondo que haja prova suficiente disso.
fonte
A Pangea Software - criadora de vários jogos para Mac - escreveu um tópico sobre proteção contra cópia em seu livro de desenvolvimento de jogos (agora gratuito). O livro também explica como lidar com chaves piratas e outros hacks que as pessoas usam. O livro tem foco no desenvolvimento de jogos para Mac, mas as idéias ainda podem ser úteis para outras plataformas. Incluído no livro está o código fonte de cada capítulo, parte do download abaixo. Também há código-fonte (escrito em C) relacionado à proteção contra cópia.
O livro pode ser baixado aqui .
fonte