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.