Ser capaz de descompilar / fazer engenharia reversa do código do cliente facilmente é realmente apenas um pequeno obstáculo. Os hackers empreendedores têm dobrado os executáveis à sua vontade (maliciosamente e não) por anos antes que linguagens de alto nível, triviais para descompilar, como o C # entrassem em cena. A segurança apenas através da obscuridade não é segurança nenhuma.
Quaisquer dados na máquina do usuário (código ou dados regulares de ativos) já estão essencialmente comprometidos. Você não pode realmente se proteger contra isso - se não quiser que as pessoas editem dados, não os coloque na máquina deles, salve-os em seus servidores. Da mesma forma, se você não quiser que eles modifiquem o código no cliente, verifique se o cliente não tem controle sobre nada de útil.
Se essa não for uma opção (por exemplo, o seu multiplayer é totalmente ponto a ponto), você pode fazer coisas como calcular hashes dos ativos relevantes e permitir que as pessoas brinquem apenas se os hashes corresponderem. Sim, alguém poderia criar com cuidado uma edição no executável, de modo que ele retornasse um hash diferente, mas tudo o que deveria significar é que o jogador infrator será dessincronizado e desconectado do jogo de maneira relativamente rápida, porque seus ativos não correspondem ao restante de os jogadores'.
Você também pode empregar um tipo de teste de "regras da maioria" que permite desconectar jogadores cuja simulação ficou fora de sincronia com outros jogadores, dando ao jogador "host" (quem iniciou o jogo) o voto de desempate.
Quando estávamos começando o desenvolvimento do nosso jogo atual, também queríamos ter o modo de jogo offline. A idéia era permitir que os jogadores jogassem nos níveis do jogo enquanto estavam offline e, de alguma forma, sincronizassem seu progresso quando ficarem online. Então, pensamos muito sobre como podemos evitar trapaças. A conclusão foi: não podemos. Não há realmente nenhuma maneira de deixar os jogadores jogar offline e ter 100% de certeza de que não trapacearam.
fonte
Uma solução simples usada com o download de arquivos é o hash. Hash o arquivo salvo e armazene essa "impressão digital" em algum lugar. Ao carregá-lo, faça o hash do arquivo e verifique a impressão digital. Se não corresponderem, o arquivo foi modificado.
Obviamente, se alguém decompilar seu código, não há nada que você possa fazer. Para esta resposta, isso significa que eles também podem armazenar o hash do arquivo salvo modificado.
Outra opção seria enviar a impressão digital para um servidor em algum lugar, onde o usuário final não poderá modificá-la manualmente se tiver modificado o arquivo salvo. É semelhante ao que o iTunes faz ao restaurar imagens do iPhone.
fonte