O que você usa para agrupar / criptografar dados?

14

Mais e mais jogos estão seguindo a rota orientada a dados, o que significa que é preciso haver uma camada de segurança para facilitar a manipulação. Eu já vi onde os jogos agrupam completamente seus ativos (áudio, arte, dados) e eu estou imaginando como eles estão gerenciando isso. Existem aplicativos / bibliotecas que agruparão e ajudarão você a gerenciar os ativos? Caso contrário, existem bons recursos que você apontaria para empacotar / descompactar / criptografar?

Essa pergunta específica gira em torno de C ++, mas eu ficaria aberto para saber como isso é gerenciado também em C # / XNA.

Só para esclarecer: não pretendo criar uma solução para evitar hackers. No nível fundamental, todos nós estamos manipulando zeros e zeros. Mas, queremos impedir que 99% das pessoas que jogam o jogo simplesmente modifiquem arquivos XML usados ​​para criar o mundo do jogo. Eu já vi muitos jogos agruparem todos os seus recursos. Estou simplesmente curioso sobre os métodos que eles estão usando.

David McGraw
fonte
Boa pergunta, enquanto eu não acredito que exista uma maneira de protegê-lo 100%, eu acredito que há uma maneira legal de compactá-lo e ofuscá-lo e eu gostaria de saber mais sobre ele ...
Prix
Vale a pena questionar se seus recursos de arte / áudio devem ser considerados "sensíveis". Muitos jogos propositadamente expõem seus ativos aos jogadores, a fim de apoiar uma comunidade mod saudável, que por sua vez pode agregar mais valor ao jogo (praticamente sem nenhum custo para o desenvolvedor).
Ian Schreiber
Estou preocupado principalmente com dados confidenciais que conduzem um jogo orientado a dados (arquivos xml, por exemplo). Acabei de ver jogos agrupar tudo em um ou dois arquivos.
David McGraw
4
O que há de errado com os jogadores brincando com esses dados?
jsimmons
para bater o meu próprio tambor .. CFL: iki.fi/sol/cfl
Jari Komppa

Respostas:

8

Uma boa estratégia é criar seu próprio formato de arquivo do zero e torná-lo indexado com uma tabela apontando para blocos de dados em vez de armazenar arquivos seqüenciais inteiros no seu arquivo, criptografar sua tabela de índice e compactar cada bloco separadamente usando LZMA / Bzip2.

Outra abordagem é usar bits de geradores de dados procedimentais aqui e ali (se você quiser ir tão longe, pode até obter os 'parâmetros' para esses geradores a partir de um servidor on-line como uma medida extra), e descarregando parte do trabalho para a GPU, você também pode evitar despejos de memória cheia e compensar parte do desempenho perdido.

No entanto, acho que essas técnicas geralmente atrapalham o desempenho e desperdiçam o tempo de desenvolvimento, oferecendo, ao mesmo tempo, nada ao usuário final, além de problemas em potencial e bugs desnecessários.

No entanto, nada é 100% seguro.

voodooattack
fonte
+1 para isso. A compactação satisfaz a necessidade de ofuscar e melhorará os tempos de carregamento e a pegada do aplicativo. O arquivamento / empacotamento de dados exigirá uma camada de abstração de qualquer maneira, portanto, combiná-la com algo que pode carregar / descompactar no local não deve ser muita engenharia. Se você optar pela compactação, certifique-se de manter a lógica de compactação / descompactação separada do material de carregamento / arquivamento. Dessa forma, você pode trocar um algoritmo melhor posteriormente, a infraestrutura necessária não muda entre os algoritmos.
precisa saber é o seguinte
@ MrCranky: Se você observar como a EA faz isso com o formato de arquivo .package (DBPF) (usado nos jogos SPORE e The Sims), você verá isso em ação. O mecanismo deles possui um campo extra na tabela de índice para "tipo de compactação", um código interno para qual algoritmo usar. Eles usam algoritmos de compactação diferentes com base no tipo de bloco (os blocos de texto usam uma compactação especial, por exemplo). O sistema de versão que eles usam também permite a integração de mods e a compatibilidade com versões anteriores. Mais sobre o formato DBPF aqui: simswiki.info/DatabasePackedFile
voodooattack
Coisas interessantes: só o fiz em tempo de compilação com um #define, mas o tempo de execução abre algumas boas possibilidades (como poder alterar seu tipo de compactação sem precisar reconstruir todos os arquivos do seu jogo).
MrCranky
11

Não envie dados confidenciais.

Não há como enviar dados criptografados para que apenas o jogo possa acessá-los. Você pode se esforçar muito, mas rapidamente se depara com os problemas de DRM.

Se você deseja manter os ativos do jogo longe de olhares indiscretos.

  1. feche-o
  2. xor o arquivo
  3. altere a extensão para algo chato (ou seja my_level.zip.xor, não use my_level.map).

Isso impedirá 95% dos usuários variados. Os outros 5% vão conseguir, não importa o que você faça.
Você não precisa realmente zipar e xor. Em vez disso, você pode usar o lzma e usar o AES com uma chave conhecida. O ponto é não gastar muito tempo com isso.

deft_code
fonte
Isso é o que eu costumo ver na maioria dos jogos ... cookie para você.
Prix
2
Realmente, apenas zip + renomear é provavelmente suficiente.
Coderanger
1
Eu acho que não, eu gosto That will stop 95% of mischeivieous users.de quebrar, enquanto eu acredito que ainda há pessoas que realmente entenderão que eu apreciaria se não todos e cada um puder. Estes dias mais 10 crianças antigos y saber como os arquivos abertos no bloco de notas e renomeá-lo ...
Prix
1
Saiba como sim. Será que algum dia se importará, não.
Coderanger
zip + renomear não é suficiente. O Linux raramente usa extensões de arquivo para determinar o tipo de arquivo. Em vez disso, ele analisa os primeiros bytes e o usa para determinar seu tipo. Um zip renomeado ainda aparece como um zip no Linux. O Windows XP não faz isso, ainda usa extensões. Não sei como o Windows7 faz isso, mas espero que no futuro o Windows use uma técnica semelhante.
Deft_code
4

Passar uma grande quantidade de tempo com isso é provavelmente tolo. Existem ferramentas para capturar dados de textura e modelo diretamente da GPU, e os sons podem ser facilmente apontados para um dispositivo de loopback virtual. Qualquer coisa que precise ser realmente segura precisa viver em um servidor e funcionar apenas por meio de desafio / resposta. A validação de dados do cliente é outra história, algo mais parecido com -verify_all da Valve. Isso ainda é difícil, já que você não pode confiar no executável local para aplicá-lo (ou pelo menos não pode confiar mais nele do que no seu sistema anti-fraude de ponto final, que também é uma idéia boba).

coderanger
fonte
4

Meu trabalho é em software antitérmico. Conheço alguém que é um viciado em jogos da velha escola. Ele quebra jogos como respirar. Você não pode parar pessoas como ele. Se o seu jogo for popular o suficiente, várias versões quebradas do seu jogo atingirão os sites de torrent apenas alguns dias após o lançamento, independentemente do que você faça. Meu conselho é fazer apenas o mínimo necessário para impedir que Joe comum ache que ele pode querer dar uma facada nessa coisa de engenharia reversa.

Jake McArthur
fonte
1
Esse é o objetivo. Não tenho absolutamente nenhum desejo de combater hackers.
David McGraw
1

Boa pergunta, mas isso está longe de ser fácil de responder.
Da minha experiência com segurança de dados, você deve pensar no seguinte:

1) O que você está protegendo, de quem e qual é o impacto se esses dados são inseguros - a segurança é muito mais sobre avaliação de riscos do que soluções técnicas sistemáticas
2) Presumo que sua plataforma seja desktop (por exemplo, Windows / OSX). um espaço de problema diferente do hardware proprietário, como o PS3 / Xenon, que possui suas próprias tentativas de segurança no nível do kernel (se esta é uma solução válida aberta para debate)
3) Criptografia! = segurança. A criptografia garante apenas que seus dados não possam ser lidos , não garante que seus dados não possam ser gravados ou reproduzidos / executados em proxy.

Se seus requisitos são para tornar seus dados à prova de adulteração, você precisa pensar em fazer um hash de dados (de preferência com SHA-256 ou SHA-512). sistema.
Também vale a pena saber que a adição de tecnologia de criptografia ao seu produto pode ter implicações legais devido a restrições de exportação (a tecnologia de criptografia é classificada como tecnologia com grau de armas restrito, acredite ou não), portanto, é recomendável usar bibliotecas que superem esses problemas legais.
Finalmente - nunca, nunca role sua própria tecnologia de criptografia - use algoritmos conhecidos, documentados e pesquisados, como AES, Blowfish, RSA etc.

ps A chave pública / privada não é adequada ou prática para criptografar grandes quantidades de dados, portanto, o DRM / PGP etc. usa um sistema simétrico RSA + híbrido , ou seja, segura a chave simétrica com o RSA e, em seguida, criptografia simétrica padrão usando essa chave

É um assunto complexo muito grande e eu definitivamente não fiz justiça

espero que ajude

zebrabox
fonte
1

Se você deseja um exemplo de um formato que foi projetado e construído (provavelmente com excesso de engenharia) por ser pequeno (compressível), ridiculamente seguro e flexível, você deve procurar o formato MPQ da Blizzard.

http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format

O layout geral do arquivo morto é o seguinte:

Dados do arquivo de cabeçalho do arquivo morto Dados do arquivo - arquivos especiais Tabela de bloco de tabela hash Tabela de bloco estendido Assinatura digital forte

Este formato tem TUDO. Tabela de blocos, tabela de blocos estendida, dados divididos em setores (para fácil transmissão), suporte para 7 (!) Algoritmos de compactação (se você contar com compactação de som) que podem ser combinados arbitrariamente, assinatura digital fraca, assinatura digital forte e assim por diante.

Se você comprasse a API da Blizzard que lida com a arquitetura de arquivos, obteria tudo o que precisa e muito mais.


fonte
Obrigado pelo link, eu nunca tinha pensado para olhar mais para os detalhes de MPQ (e geralmente assumido que eles estariam indisponíveis)
Bill
Se é tão seguro, por que foi feito a engenharia reversa a esse nível e tem até bibliotecas de terceiros para interagir com ele? ;-)
coderanger
A maioria das ferramentas (leia-se: todas) para interagir com arquivos * .mpq depende do Stormlib, que é gravado e mantido por um indivíduo.
Tanto quanto eu sei, o Stormlib exige que você tenha o jogo original do arquivo, pois as chaves para descriptografia são armazenadas no executável. A maior razão pela qual é tão seguro, no entanto, não é porque é impossível invadir. Mas para dados dinâmicos enviados pela rede, eles são inigualáveis. Os dados são tão criptografados que seria inútil para terceiros descriptografar em tempo real.
E, de fato, com o 'World of Warcraft', a Blizzard foi pioneira na tecnologia de streaming, permitindo que você jogue o jogo com apenas uma pequena porcentagem de todos os dados baixados no seu disco rígido. O formato * .mpq é excelente nesse tipo de trabalho. Sem mencionar que, quando o instalador de Starcraft 2 foi lançado pela Blizzard alguns dias antes do lançamento oficial do jogo, seus arquivos estavam tão fortemente criptografados que não puderam ser abertos até o momento em que o jogo foi lançado. : P
0

Como isso foi ressuscitado recentemente, sua pergunta (e, portanto, todas as respostas até agora) parece lidar apenas com o carregamento do arquivo, que é tão seguro quanto o executável que deseja carregá-lo. No PC, não há nada que seja realmente seguro (você apenas atrasa as pessoas); você pode verificar as coisas nos servidores, mas mesmo essa verificação pode ser removida para que exe modificados possam ser executados, não importa o que aconteça. Os consoles ainda são "bastante" seguros, portanto, na maioria dos casos, gero um hash de arquivos importantes, assino o hash com uma chave privada, incorporo a chave pública no código e verifico o hash seguro no arquivo.

Pensei em lançar outro ataque à conversa, algo que só me deparei no ano passado, pois não costumo enviar muito para o PC. O Cheat Engine é um pequeno programa muito arrumado que quase automatiza a criação de seus próprios hacks (o que significa que qualquer um pode usá-lo). É bastante avançado no que pode fazer, muitos truques / truques que vi pessoas venderem são feitos por isso ou algo muito parecido com o que vi (todos os do mercado de massa). Com algum trabalho que você pode proteger contra coisas assim novamente, acho que tudo depende de quão popular é o jogo e se alguém se importa o suficiente para se incomodar.

Opps, esqueci de mencionar uma boa lib para criptografia (em C ++) é o LibTomCrypt .

Roger Perkins
fonte