Como evito truques de modificação de memória?

10

Atualmente, existem muitos programas que alteram a memória ( Cheat Engine & co). Existe uma maneira eficiente de manter uma variável constante realmente constante?

Eu tive duas idéias:

  1. Faça um thread separado atualizando a variável constante para um valor constante, por exemplo, 200 a cada minuto. Problema: Também é possível alterar o segundo valor.
  2. Armazene o valor no servidor. Problema: quero manter o tráfego de rede o mais baixo possível.

Eu preciso desse mecanismo para constantes e variáveis ​​permitidas apenas para conter um determinado intervalo de valores.

Existem maneiras melhores de fazer isso?

Michael
fonte
11
Nenhum desses vai funcionar. Na primeira situação, o trapaceiro precisa substituir o valor '200' que você está copiando e não é mais difícil do que substituir o original. Na situação 2, o trapaceiro agora pode alterar o valor, mesmo sem alterar o seu programa simplesmente mudando os bytes recebidos na rede (por exemplo, com um proxy local)
Jimmy
6
Ainda estou vendo uma proteção contra trapaças que não pode ser desativada por um hacker. Apenas certifique-se que você não faz o jogo um pesadelo para os usuários legítimos, em sua cruzada contra os cheaters :)
11
Relacionado ; mais específico, mas o mesmo.
Anko
11
A maioria dos jogos tem "treinadores". Quero dizer, diabos, até Mass Effect: Andromeda tem um treinador, e só sai há pouco mais de uma semana. Eu digo que nem se preocupe com isso. Se as principais empresas de jogos não podem evitar isso, o que faz você pensar que tem uma chance?
Krythic 9/04

Respostas:

21

Se o seu jogo for singleplayer: não é possível, mas você não deve se importar .

Se o seu jogo for multiplayer: você deve armazenar todo o seu estado importante no servidor, o que é muito mais difícil de invadir do que uma máquina local.

jcora
fonte
4
É muito fácil se proteger contra trapaças para vários jogadores ao criar um servidor autoritário e prever apenas o estado no lado do cliente. Basicamente, basta enviar a entrada do player do cliente para o servidor, e não "eu xdanifiquei y".
Jmegaffin
Na verdade, @BorealGames, é o que quero dizer com "armazenar todos os estados importantes no servidor".
jcora
Só queria esclarecer um pouco :)
jmegaffin
11

Isso não pode ser feito , https://security.stackexchange.com/a/4639 é sobre DRM, mas o mesmo se aplica a qualquer coisa que o usuário não deseje em seu computador, incluindo os mecanismos Anti-Cheat. (Que tem a tendência de ser ainda mais difícil de fazer do que DRM.)

Mas por que você, realmente, por que você? É o computador do seu cliente, não o seu, o cliente faz com o computador dele o que quer que ele queira fazer. Você não tem direitos sobre isso. Seu programa é removido se o cliente não gostar.

Para jogos multiplayer, não se trata de projetar o binário em execução, mas sim de projetar a comunicação. Deixar os usuários enviarem "ganhei com 20.000 pontos" não funciona, nem "tenho 2000 ouro" . Você precisará simular o jogo e deixar os jogadores enviarem o que estão fazendo, como "Ordenei que o soldado se movesse para o ponto X / Y" ou "Comprei o item número 43" , e não o resultado disso ações são. O servidor decide quais são os resultados e quem venceu no final.

Se for um jogo para um jogador com pontuação alta on-line, uma opção seria fazer com que o jogador envie uma repetição, simulá-la e decidir o resultado disso.

API-Beast
fonte
11
Sugestão de correção pequena: o cliente não deve enviar "Comprei o item número 43", mas sim "Desejo comprar o item número 43". O servidor deve responder com "OK, você perde 200 GP, você ganha um Item43", "Não, você não tem ouro suficiente" ou "Não, a loja que você está navegando atualmente não tem o número 43". O servidor deve se comportar como o mestre de um RPG de papel e caneta. Os jogadores dizem o que querem fazer e o servidor diz a eles se tiverem sucesso.
Philipp
Também não tenho certeza de alterar a memória em uso de um computador pessoal, mas alterar o binário de um jogo em si (mesmo que esteja no seu computador) geralmente é contra o EULA e pode ser definido em leis de direitos autorais etc.
lozzajp
Não que a violação de um EULA, o equivalente digital do jaywalking, tenha impedido alguém.
Jkmartindale
3

O primeiro não é eficaz e não impede que uma pessoa determinada ataque o seu jogo - e também é propenso a erros. No entanto, você pode torná-lo muito mais difícil , e não uma prova completa , se desejar. Algumas estratégias comuns estão disponíveis em toda a web, mas como outras pessoas mencionaram - você deve se perguntar se vale a pena.

Por uma questão de argumentos, eis algumas maneiras de impedir hackers em um ambiente de um jogador:

  1. Abra um identificador para todos os outros processos na máquina do usuário (invasivo e não portátil) e sobrescreva seu WriteProcessMemory com uma função ou aviso fictício. A escolha é sua. Isso pode ser derrotado porque ... os aplicativos são livres para fazer o mesmo e sobrescrever o identificador mais uma vez ou fazer coisas para evitar isso.
  2. Faça a soma do seu aplicativo e faça com que ele se verifique através de uma proteção contra hackers - isso é útil para muitas edições permanentes no seu aplicativo, mas não interrompe um ataque de memória comum. Isso pode ser derrotado porque ... ferramentas como ADA, OllyDbg e até simples edições hexadecimais podem fazer correções permanentes e alterações em seu aplicativo para remover o código incorreto - isso inclui sua ideia de timer encadeado!
  3. Procure por ferramentas de hackers conhecidas. Isso também pode ser derrotado recompilando uma ferramenta ou atacando seu cliente diretamente. Isso pode ser derrotado porque ... uma recompilação, renomeação do aplicativo ou alteração no que o seu scanner usa como heurística tornará isso inútil. Considere usar uma parte especial da memória que um aplicativo é conhecido por usar se você optar por isso.

A alternativa, é claro, é apenas armazenar tudo no servidor e criar um servidor de jogo que seja um mestre. Isso não é apenas caro, requer manutenção e aumenta o tempo de desenvolvimento ... os fãs não ficam tão impressionados com a implementação de jogos populares como Diablo III . Ou aqui. Devo notar que, para um RPG online em flash como o Adventure Quest, esse modelo realmente está funcionando muito bem para eles.

Não posso fornecer muita orientação sobre como implementar esse tipo de abordagem, pois é muito amplo, amplo e requer muito planejamento. A base a saber é que o servidor decide tudo e o cliente nada mais é do que um simples console de entrada e exibição.

Vaughan Hilts
fonte
3

Muitas pessoas usam esses programas para procurar uma pontuação armazenada em uma variável, por exemplo

int score = 10;

para fazer isso, eles precisam conhecer a pontuação, usualmente a partir da pontuação exibida no jogo.

Eu estava pensando, isso ajudaria a afastá-los ...

public static float randomVal; // at start of level generate random float

private float 1a3sf5vhh4; //represents score

void hjgkkj4(int val) //add score method
{
   var 5vhh4 =  1a3sf5vhh4/randomVal+val;
   1a3sf5vhh4 =  5vhh4*randomVal;
}

então quando você precisar exibir pontuação faça ...

string displayScore = ""+ 1a3sf5vhh4/randomVal;

isso fará com que os trapaceiros pesquisem o que eles acham que é a pontuação (a pontuação sendo exibida), para encontrar apenas o valor exibido.

A pontuação real será Score * randomVal armazenado em outro local. Eles não podem alterar a pontuação alterando o valor exibido.

isso ajudaria?

ps Eu não sou especialista, então vá com calma comigo lol.

Raimi
fonte
Acabei de encontrar este vídeo, faz alguns pontos interessantes ... youtube.com/watch?v=G25YhoE04Xc
Raimi
Ferramentas de trapaça podem ser configuradas para detectar essas coisas também. Isso leva mais tempo para acompanhar.
Kromster 26/11
mas para um jogo pequeno, offline e para um jogador, algo assim seria uma solução aceitável? parece que pelo menos poderia parar alguns aplicativos por aí
Raimi
Sim, esse é apenas o caso do EffortSpent vs ProtectionAchieved, onde a segunda parte nunca pode chegar a 100%.
Kromster
11
Nomes aleatórios no código-fonte também não ajudam, pelo menos na maioria dos casos. O programa é normalmente compilada a IL / código de bytes ou directamente para etc binário
lozzajp
2

Em relação aos jogos para um jogador , você não pode evitar trapaças, e não deveria .


Por que não consigo evitar trapacear no meu próprio jogo?

Como outras respostas apontaram, mesmo os melhores esforços podem ser potencialmente circunavegados por um único hacker e fornecidos ao restante da sua base de jogadores. Você ainda pode fazer um esforço contra isso, mas procure outras respostas para obter sugestões de como . Esta resposta significa poupar-lhe o problema, se o seu jogo pretender apenas fornecer jogabilidade para um jogador.

Por que devo deixar os jogadores trapacearem em um jogo para um jogador?

Para citar Sam ,

Gaste mais tempo criando um ótimo jogo e menos tempo impedindo que os idiotas estragem sua própria diversão - simples.

Isso erra completamente o ponto . Jogos são uma forma de entretenimento . Geralmente, sua base de jogadores está jogando seu jogo para se divertir . Se um jogador usa truques no seu jogo, há uma razão para ele estar usando truques. É seguro supor que não podemos garantir a definição de diversão de cada jogador; se eles usam truques , talvez essa seja a maneira deles de tornar seu jogo mais agradável para eles.

Como a trapaça torna um jogo mais agradável?

Embora todo indivíduo seja único, existem algumas condições em que os truques podem tornar um jogo mais divertido, em cima da minha cabeça:

  • O jogo é um pouco lento, e o jogador deseja usar truques para desencadear a ação antes que eles sejam adiados, completamente.
  • O jogador é incapaz de superar um certo desafio; normalmente não trapaceariam, mas estão perto de desistir, frustrados. Eles podem parar de jogar ou podem usar truques para contornar o obstáculo e jogar a segunda metade do jogo.
  • O jogador não pode dedicar a quantidade de tempo que seu jogo requer para a experiência pretendida. Ao aplicar truques, o usuário pode obter um "início de execução" e poder aproveitar o conteúdo pretendido do seu jogo. Se você acha que isso não parece plausível, considere que esse é o motivo pelo qual eu joguei muito pouco do Fallout 4. Em comparação, é o único jogo que eu pré-encomendei nos últimos 5 anos e o único jogo que já pré-encomendei e comprado para mais de uma plataforma. Eu amo o jogo; Eu não tenho tempo para isso.
  • Seu jogo tem um bug , e isso impede o jogador de avançar ainda mais. Uma fraude ignora o bug, para que o jogador possa continuar jogando. Jogos recentes de Elder Scrolls são famosos por essa situação .

Por que isso se aplica apenas a jogos para um jogador?

É importante enfatizar que isso só funciona em jogos para um jogador ; se o jogador disser que deseja usar truques para se divertir mais no jogo, nenhum dano será causado. Assim que houver vários jogadores no jogo, as façanhas desse primeiro jogador podem se tornar uma desvantagem injusta para os outros jogadores. Esta é a única situação real em que você não deve permitir trapacear.

Gnemlock
fonte
0

O que uma ferramenta de invasão de memória faz?

Existem duas maneiras de operar a ferramenta de invasão.

  1. Ele aceita um endereço conhecido onde as variáveis ​​do jogador são armazenadas.
  2. Você alimenta as alterações na variável e ela verifica a memória em busca de alterações.

O que você pode fazer sobre isso?

  1. Você pode usar variáveis ​​alocadas dinamicamente para armazenar variáveis ​​do player, para que o endereço continue mudando na inicialização. Não haverá nenhum endereço fixo que um site de fraude possa listar.

  2. Criptografe as variáveis ​​do player: dimensionar o valor, adicionar uma constante, etc. Isso traz um novo problema: um hacker hardcore pode desmontar o seu programa e encontrar os números que você usa para criptografar as variáveis ​​do player. Para isso, use números aleatórios. Você também pode escalar os valores das variáveis ​​do seu player e adicionar um número aleatório, para que o número adicionado não altere significativamente o valor (adicionar 10 ou 20 a um valor escalonado de 2000 não faz muita diferença).

Certamente, algum hacker sério ainda pode encontrar maneiras de superar esses obstáculos, mas não será fácil.

  std::default_random_engine myRNG;
  std::uniform_int_distribution<int> myDist_padding(10,100);
  class Player
  {
      public:
          Player()
          {
              Health = new float;
              Armor = new float;

              std::uniform_int_distribution<int> myDist_scale(1000,10000);
              scale = myDist_scale(myRNG);
          }
          float GetPlayerHealth() const;
          void SetPlayerHealth(float health);
      private:
          float *Health;
          float *Armor;
          int scale, constant;
  }

  //wrappers for Set/GetPlayerHealth
  void Player::SetPlayerHealth(float health)
  { 
      this->Health = health * scale + constant + myDist_padding(myRNG);     //random padding; adding 10 or 100 to a number that is scaled up by 1000 will cause an increase in 1%
      //1% of error is ok I guess?
  }
  int Player::GetPlayerHealth() const
  {
      return (this->Health - constant)/scale;
  }

Embora o código acima resolva alguns problemas sérios, ele ainda é decifrado. A única informação de que o hacker precisará é: as variáveis ​​dos jogadores são acessadas por meio de um ponteiro (ele também pode descobrir desmontando o jogo, mas isso vai ser chato e difícil). Uma vez que o hacker tenha o endereço para as variáveis ​​do seu jogador, juntamente com outras variáveis ​​aleatórias secretas, será uma tarefa fácil para ele desenvolver uma trapaça.

Na minha opinião, sem desmontar, você realmente não pode escrever uma ferramenta de hack para esse sistema. O resultado é imprevisível, pois você adicionará um número aleatório às variáveis ​​do jogador cada vez que for modificado. O intervalo em que as variáveis ​​do player são armazenadas também não é o mesmo em toda inicialização.

O que mais você pode fazer?

Continue alterando o endereço das variáveis ​​do player ocasionalmente. Isso dificulta a legibilidade do código? Bem, isso ocorre até certo ponto, mas você pode abstrair todo o processo em uma única classe que possui comentários bem explicados. A interface fornecida pela classe terá funções simples de Set / Get. O programador frontend não precisaria se preocupar com a complexidade subjacente.

Yashas
fonte
0

Economia:

Se você deseja fortalecer seu jogo contra trapaceiros, a melhor maneira é comprar uma solução de software que faça isso por você. Existem vários provedores, e você pode encontrar alguns deles pesquisando no Google "anti-fraude quebra meu jogo" .

Os profissionais são muito melhores na prevenção de truques do que você e muito melhores em não interromper o jogo do que você (e ainda não conseguem 100%, em nenhum deles). Portanto, se você achar que há valor em colocar essa solução em seu jogo, compre-a. Fazer o seu próprio será muito mais caro.

Uma pergunta relacionada é "existe valor no uso de software anti-fraude?". A resposta é: não, a menos que uma parte decente do seu jogo dependa de um modo competitivo online.

Pedro
fonte
0

A única maneira de proteger seu jogo contra modificações e edição de memória é torná-lo ONLINE e processar valores vitais no servidor .

Talvez você possa criptografar os valores para que as edições novinhas de memória não cheguem a eles, mas todas as comunidades, como Cheat Engine , GameGuarian para Android, ArtMoney, Game Hacker etc. lado e mostre aos outros como fazê-lo ou publicar treinadores.

É um esforço inútil para tentar impedir os trapaceiros na minha opinião. Também não é realmente justo, já que é o dispositivo deles e se eles querem editar as coisas que acontecem no dispositivo, por que você as impediria? O cliente é o rei afinal.

Techinator
fonte
0

Quero dizer, não é tão difícil assim. Você pode manter 99% dos trapaceiros de edição de memória (aqueles Game Guardian , Cheat Engine afetados por valores simples de multiplicação. Mesmo multiplicar por 10 na memória manterá a maior parte do tempo.

Lembro-me de que muitos jogos em flash do dia se multiplicariam por 8 ou 6. Ou, se você for realmente sério, codifique algumas verificações ou criptografe os valores na memória.

Techinator
fonte
-2

Você não pode - repito que você não pode. Não há resposta para essa pergunta que não possa ser desfeita por um bom hacker.

Mas e daí? Se alguém quiser trapacear no seu jogo (presumindo que não haja perda ou conquista monetária), quem se importa? Eles só se enganam.

Gaste mais tempo criando um ótimo jogo e menos tempo impedindo que os idiotas estragem sua própria diversão - simples.

Sam
fonte
O voto negativo, pois acredito que a diversão desempenha um papel importante nessa resposta, mas é totalmente esquecido . Em vez de mais explicações, estou enviando uma resposta alternativa.
Gnemlock
-3

Criptografar isso! Armazene números importantes divididos em vários locais, combinados com outros valores, para que eles mudem constantemente! Use números fictícios que, se alterados, dizem que eles são trapaceiros.

Tudo pode ser quebrado, mas a maioria não leva tempo para fazê-lo.

ChickenStealer
fonte
4
... e seu código-fonte será uma bagunça ilegível e inatingível. Boa sorte em encontrar um bug ou alterar o equilíbrio sem explodir tudo.
Philipp
Se eu tivesse que implementar essa forma de prevenção de trapaças, ficaria sinceramente decepcionado se os hackers pegassem meu esquema maligno e desistissem. Isso significaria que eu não perdi o tempo de ninguém além do meu.
Marcks Thomas
@ MarcksThomas Bem, se os hackers desistirem, você não perderá seu tempo. Esse era o objetivo, afinal, não era?
Dan
Não concordo plenamente com você quanto ao @Philipp - existem maneiras de manter o código fonte claro, mas embaralhar o código de produção quando ele sair. Na prática, isso envolve criptografia e alguns mambojambo numéricos e, especialmente, de tempo e segmentação :-). Testamos com o código fonte inalterado e, se houver um erro no código de produção, o deixamos travar brutalmente (com um pequeno atraso, apenas para ser mau :-)). Uma pequena mudança em algum lugar também causa isso.
Stormwind
Embora eu afirmasse que isso era a melhor resposta dessa cadeia, mas parece que já o fiz. Existem muitas regras matemáticas a serem usadas, que serão impossíveis de realizar a engenharia reversa apenas por causa da complexidade e, acima de tudo, do tempo. Pode-se, por exemplo, marcar o pedido de travamento atrasado ou deixar a sensibilidade dele divergir para um estado inútil (não reproduzível). Claro que você deve ser uma boa razão para isso.
Stormwind
-4

A maneira como eu lido com isso em jogos online é essa.

Eu não vou ajudar os hackers que tanto se importam comigo. Não mencionarei nenhum programa que eu use para fazer isso. Você terá que descobrir isso. A única maneira de realmente detê-los é saber uma coisa. Eles não querem que seu programa de hackers seja detectado.

Até agora, todos os usuários de hackers / treinadores que eu derrotei. O desenvolvedor do hack irá colocar um detector nele para ver se algo está assistindo. Se houver algo, o programa hacker / treinador será fechado automaticamente ou o trabalho será realizado apenas pela metade.

Por exemplo, na sujeira 3, os usuários do treinador podem fazer o carro girar automaticamente. Mas se você colocar um detector do seu lado, o próprio detector de fraudes detectará e fechará parte da fraude. Não tudo disso.

A única parte do programa de treinamento que eu vi efetivada pela minha intromissão é o super freio (frenagem perfeita) e o spinout (carro perdendo o controle sem motivo). Eu tenho principalmente jogos de corrida, como você pode ver. Eles são todos da codemasters e, infelizmente, esses jogos são abusados ​​por trapaceiros com bastante frequência.

Acredito que só consigo detê-los por causa da maneira como nos conectamos enquanto jogamos. Provavelmente, é a mesma razão pela qual eles podem causar uma explosão para um jogador normal que não tem idéia sobre segurança.

Minha maior sugestão é obter um antivírus de segurança na Internet muito bom (Norton, Mcafee, Avast e todos os outros avos de merda não o ajudarão). Esteja disposto a gastar de US $ 50 a US $ 90 em um programa muito bom que eu não listei e, em seguida, aprenda a experimentar com ele para efetuar o jogo online.

É preciso muita paciência e muitas cobaias. Eu tive muito sucesso com isso, mas também muitos anos de experiência em lidar com usuários de instrutores. Não conheço nenhum código. Não tem nada a ver com isso. A parte do código está bloqueada e você não pode fazer nada sobre isso. Você pode pensar que pode, mas simplesmente não é possível parar o que eles estão fazendo.

Você ainda pode bani-los com coisas como o VAC, porque o Vac detecta assinaturas e certos comportamentos e modificações de arquivos que ele já conhece. Apenas proíbe a conta associada ao truque.

Na verdade, eles não param de trapacear. Eles não podem ser incomodados com isso. Eles apenas banem sua conta. A outra coisa que eu gostaria de mencionar tem a ver com Wolfenstein ET. Um jogo muito antigo. Mas para mim, tinha a melhor e mais dura medida de segurança de todas.

Eu nunca consegui ver como eles fizeram isso. Eu dei a eles a idéia sobre o que realmente impediria os trapaceiros e sugeri a um dos devolopers do jaymod que banisse por meio de guia. O que tem um guia de fácil acesso ao jogar? Placas gráficas. A razão pela qual eles implementaram isso é porque as pessoas mudam apenas os endereços IP e você não precisa de uma conta para o jogo, para que você possa mudar seu nome, seu endereço MAC, que também mudaria seu endereço IP.

Mas quando eles proibiram a placa gráfica. Se você quisesse jogar de novo, precisava comprar um cartão RMA ou comprar um novo. Isso é fora de questão. Supõe-se que isso seja sobre detecção e fui embora pela tangente. Infelizmente, não jogo quase tanto agora. Mas cara, eu amei todos os meus porcos. Especialmente os de carros de projeto. O único jogo de corrida que não era um mestre de códigos. Mas ainda efetuado pelo mesmo absurdo.

Fred
fonte
Vejo vários problemas com esta resposta. 1. Formato. É difícil de ler devido à estrutura e, devido à inconsistência gramatical, há partes em que não consigo entender o que você quer dizer. 2. Você parece falar muito sobre o assunto como jogador jogando contra outros trapaceiros . Isso seria relevante no Arqade , mas estamos mais preocupados com o desenvolvimento de jogos . 3. Você diz "não use os que eu mencionei", em relação ao antivírus. Você mencionou "Norton, McAfe, Avast e todas as merdas . Isso não nos diz o que usar , especialmente quando você
cita
Toda a última metade parece ser uma anedota sobre como você acha que uma empresa de videogame seguiu seu conselho (acredito que você se esforça para dizer que não sabe ao certo como é feito, por isso interpreto que sua explicação adicional sobre como é feito deve basear-se em especulações , não em fatos).
Gnemlock