Como protejo meu jogo com a chave do CD / número de série?

25

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:

Como os jogos multiplayer devem lidar com a autenticação?

user1306322
fonte
Se alguém fizer voto negativo, espero pelo menos um comentário sobre o que há de errado com a pergunta. Gente, realmente, quero que minha pergunta seja boa e ajude mais pessoas do que apenas eu.
user1306322
4
Acho que foi uma reação automática à adição de DRM. Esse tipo não é particularmente ruim, mas muitos de nós têm experiências ruins com ele - como quando o Spore bloqueou minha instalação do Windows.
Izkata 10/02
Em vez de uma chave de CD, você considerou uma abordagem semelhante a MMO / Minecraft, exigindo um nome de usuário / senha para fazer logon e usá-la para autenticar usuários?
Tétrada
4
Quer DRM em um aplicativo .NET !? Eventualmente, isso falhará com ferramentas como o Reflector. Dê uma olhada em Terraria. O desenvolvimento parou devido à pirataria (e muita receita ...). Eu gosto da idéia baseada em autenticação do @ Tetrad, pois impede que as pessoas precisem corrigir a função de validação. Mantenha todos os dados em seu servidor e, quando o login for bem-sucedido, alimente-os com seus dados. Se você mantiver os dados localmente, eles poderão corrigir a função de autenticação.
2
@ Anko que era uma referência à famosa citação "Exigimos mais minerais" . E eu quero dizer fatos e conhecimentos. Talvez até detalhes. Eu não sabia quando um problema importante tinha atenção suficiente, parecia que havia algo a acrescentar, e os visitantes do site podem achar esse assunto interessante (e possivelmente se tornarem novos usuários), então eu levantei a recompensa.
User1306322

Respostas:

24

Basicamente, você tem três requisitos:

  1. não deve ser fácil usar a mesma chave para várias instâncias do cliente,
  2. não deve ser fácil gerar novas chaves válidas e
  3. não deve ser fácil roubar a chave de um cliente legítimo.

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:

  • O certificado do cliente consiste em uma sequência de IDs arbitrárias, um par de chaves públicas / privadas e uma assinatura digital do ID e da chave pública usando a chave mestra.
  • Para efetuar login, o cliente envia seu ID, chave pública e assinatura. O servidor responde com uma sequência de desafio exclusiva (de preferência incluindo um ID do servidor e um registro de data e hora, que o cliente deve verificar), que o cliente assina com a chave privada (para provar que conhece a chave) e envia a assinatura ao servidor.
  • O servidor verifica ambas as assinaturas, provando que a chave pública ID + forma uma chave legítima do cliente (desde que foram assinadas com a chave mestra) e que a chave do cliente realmente pertence ao cliente (pois o cliente pode assinar o desafio do servidor com o privado chave).

(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.)

Ilmari Karonen
fonte
2
Um ponto menor - enquanto uma chave totalmente aleatória fornece o espaço máximo de chaves (e é perfeitamente viável se você estiver validando em um banco de dados de chaves emitidas), não é fácil de usar. Coloque alguma validação na própria chave para que a maioria dos erros de digitação seja detectada antes de você tentar acessar o servidor.
Loren Pechtel
Eu acho que o @LorenPechtel tem um ponto forte sobre a facilidade de uso da chave. E o usuário pago digitando e enviando acidentalmente uma chave 'erro de digitação / digitação incorreta' (erro de digitação) para o servidor sempre é possível.
Vishnu
@Vishnu Eu sei que, como usuário que digita chaves, eu preferiria ter algumas informações de verificação por grupo, mesmo que isso significasse digitar uma chave mais longa.
Loren Pechtel
16

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:

  • Não verifique a chave no lado do cliente. Isso é muito importante, porque na verdade é bastante fácil descompilar o material escrito em .net / XNA. Se você precisar solicitar a chave ou passá-la (login ou registro), use a hash da chave (com mais sal, etc.) e envie-a para o servidor.

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.

Mario
fonte
2
Em vez de somas de verificação padrão, você deve usar um algoritmo de hash criptograficamente seguro. Você pode manter a chave privada no servidor e fornecer ao cliente a chave pública e, assim, saberá que, sem acesso ao servidor, o sistema é seguro.
10243 Adam
@ Adam: O uso de um algoritmo de hash criptograficamente seguro garantirá que os invasores não possam gerar chaves válidas, mas o problema é igualmente insolúvel pela autoridade encarregada de distribuir chaves legítimas. Embora, de fato, uma soma de verificação simples não seja muito segura, as funções unidirecionais não são viáveis ​​nesse contexto.
Marcks Thomas
Bem, você pode combinar os dois, por exemplo, tornar a primeira parte da tecla uma combinação aleatória de caracteres e a segunda metade do hash. Qualquer pessoa que venda o jogo não pode usar um keygen de qualquer maneira (a menos que haja alguma maneira de garantir que não ocorram colisões / conflitos, como um "ID do fornecedor" como parte da chave).
Mario
1

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 .

Wolfgang Schreurs
fonte
Não consegui encontrar nada útil nesses livros.
user1306322
Pessoalmente, embora o capítulo 16 tenha algumas dicas legais, mas YMMV.
Wolfgang Schreurs