¿Cómo evito los trucos de modificación de memoria?

10

Hay muchos programas que alteran la memoria en la actualidad ( Cheat Engine & co). ¿Hay una manera eficiente de mantener una variable constante realmente constante?

Tenía dos ideas:

  1. Haga un hilo separado actualizando la variable constante a un valor constante, por ejemplo 200 cada minuto. Problema: también se puede alterar el segundo valor.
  2. Almacene el valor en el servidor. Problema: quiero mantener el tráfico de red lo más bajo posible.

Necesito este mecanismo para constantes y variables que solo pueden contener un cierto rango de valores.

¿Hay mejores formas de hacer esto?

Miguel
fuente
1
Ninguno de los dos funcionará. En la primera situación, el tramposo simplemente tiene que sobrescribir el valor '200' que está copiando y no es más difícil que sobrescribir el original. En la situación 2, el tramposo ahora puede cambiar el valor sin siquiera alterar su programa simplemente cambiando los bytes recibidos en la red (por ejemplo, con un proxy local)
Jimmy
66
Todavía tengo que ver una protección contra trampas que un hacker no pueda desactivar. Solo asegúrate de no hacer del juego una pesadilla viviente para los usuarios legítimos, en tu cruzada contra los tramposos :)
1
Relacionados ; más específico, pero por lo demás igual.
Anko
1
La mayoría de los juegos tienen "Entrenadores". Quiero decir, demonios, incluso Mass Effect: Andromeda tiene un entrenador, y solo ha estado fuera por poco más de una semana. Yo digo que ni siquiera te preocupes por eso. Si las principales compañías de juegos no pueden evitar esto, ¿qué te hace pensar que tienes una oportunidad?
Krythic

Respuestas:

21

Si tu juego es para un jugador: no es posible, pero no debes preocuparte .

Si su juego es multijugador: debería almacenar todo su estado importante en el servidor, que es mucho más difícil de hackear que una máquina local.

jcora
fuente
44
Es muy fácil protegerse contra las trampas multijugador al hacer un servidor autorizado y solo predecir el estado del lado del cliente. Básicamente, solo envíe la entrada del jugador desde el cliente al servidor, no "hice xdaño a y".
jmegaffin
De hecho @BorealGames, eso es lo que quiero decir con "almacenar todos los estados importantes en el servidor".
jcora
Solo quería aclarar un poco :)
jmegaffin
11

No se puede hacer , https://security.stackexchange.com/a/4639 trata sobre DRM, pero lo mismo se aplica a todo lo que el usuario no quiere en su computadora, incluidos los mecanismos Anti-Cheat. (Lo que tiende a ser aún más difícil de hacer que DRM).

Pero ¿por qué lo harías, realmente por qué lo harías? Es la computadora de sus clientes, no la suya, el cliente hace con su computadora lo que quiera hacer con ella. No tienes derechos al respecto. Su programa se elimina si al cliente no le gusta.

Para los juegos multijugador no se trata de diseñar el binario que se ejecuta, sino de diseñar la comunicación. Dejar que los usuarios solo envíen "He ganado con 20000 puntos" no funciona, tampoco "Tengo 2000 de oro" . Tendrás que simular el juego tú mismo y dejar que los jugadores envíen lo que están haciendo como "Le ordené al soldado que se mueva al punto X / Y" o "He comprado el artículo número 43" , y no el resultado de eso. las acciones son El servidor decide cuáles son los resultados y quién ganó al final.

Si se trata de un juego de un solo jugador con puntaje alto en línea, una opción sería hacer que el jugador le envíe una repetición, simule y decida el resultado de eso.

API-Bestia
fuente
11
Pequeña sugerencia de corrección: el cliente no debe enviar "Compré el artículo número 43", sino "Quiero comprar el artículo número 43". El servidor debería responder con "OK, pierde 200 GP, gana un Item43", "No, no tiene suficiente oro" o "No, la tienda que está buscando actualmente no tiene el número de artículo 43". El servidor debe comportarse como el maestro del juego de un juego de rol de papel y lápiz. Los jugadores dicen lo que quieren hacer, y el servidor les dice si tienen éxito.
Philipp
Además no estoy seguro sobre la alteración de la memoria en uso de un ordenador personal, pero alterando el binario de un juego en sí mismo (a pesar de que su en su ordenador) es por lo general contra el EULA y se puede definir aún más en los derechos de copia leyes, etc.
lozzajp
No es que violar un EULA, el equivalente digital de jaywalking, haya detenido a nadie.
jkmartindale
3

El primero no es efectivo y no impedirá que ninguna persona determinada ataque su juego, y también es propenso a errores. Sin embargo, puede hacer que sea mucho más difícil , no una prueba completa , si lo desea. Algunas estrategias comunes están disponibles en toda la web, pero como han mencionado otras personas, debe preguntarse si vale la pena.

En aras de los argumentos, aquí hay un par de formas de evitar la piratería en un entorno de un solo jugador:

  1. Abra un controlador para cualquier otro proceso en la máquina del usuario (invasivo y no portátil) y sobrescriba su WriteProcessMemory con una función ficticia o advertencia. La decisión es tuya. Esto puede ser derrotado porque ... las aplicaciones son libres de hacer lo mismo y sobreescribir el identificador una vez más o hacer cosas para evitar esto.
  2. Comprueba tu aplicación y haz que se verifique a sí misma a través de un escudo de pirateo: esto es útil para muchas ediciones permanentes de tu aplicación, pero no detendrá un ataque de memoria común. Esto puede ser derrotado porque ... herramientas como ADA, OllyDbg e incluso simples ediciones hexadecimales pueden hacer parches permanentes y cambios en su aplicación para eliminar el código ofensivo, ¡esto incluye su idea de temporizador roscado!
  3. Escanee en busca de herramientas de pirateo conocidas. Esto también se puede vencer recompilando una herramienta o atacando a su cliente directamente. Esto puede ser derrotado porque ... una recompilación, un cambio de nombre de la aplicación o un cambio en lo que su escáner utiliza como heurístico hará que esto sea inútil. Considere usar una porción especial de memoria que se sabe que usa una aplicación si opta por esto.

La alternativa, por supuesto, es almacenar todo en el servidor y crear un servidor de juegos que sea un maestro. Esto no solo es costoso, requiere mantenimiento y aumenta el tiempo de desarrollo ... los fanáticos no están tan impresionados con la implementación de juegos populares como Diablo III . O aquí. Sin embargo, debo tener en cuenta que para un juego de rol flash en línea como Adventure Quest, este modelo realmente ha funcionado bastante bien para ellos.

No puedo proporcionar mucha orientación sobre cómo implementar este tipo de enfoque, ya que es muy amplio, amplio y requiere mucha planificación. La base para saber es que el servidor decide todo y el cliente no es más que una simple consola de entrada y visualización.

Vaughan Hilts
fuente
3

Mucha gente usa estos programas para buscar una puntuación almacenada en una variable, por ejemplo

int score = 10;

Para hacerlo, necesitan conocer el puntaje, usualmente a partir del puntaje que se muestra en el juego.

Estaba pensando, ¿esto ayudaría a posponerlos ...

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;
}

entonces cuando necesites mostrar la puntuación haz ...

string displayScore = ""+ 1a3sf5vhh4/randomVal;

esto hará que los tramposos busquen lo que piensan que es el puntaje (el puntaje que se muestra) para que solo encuentren el valor mostrado.

La puntuación real será Score * randomVal almacenada en otro lugar. No pueden cambiar la puntuación cambiando el valor mostrado.

¿esto ayudaría?

PD No soy un experto, así que tómalo con calma lol.

Raimi
fuente
Acabo de encontrar este video, hace algunos puntos interesantes ... youtube.com/watch?v=G25YhoE04Xc
Raimi
Las herramientas de trucos también pueden configurarse para detectar tales cosas. Esto solo lleva más tiempo rastrear.
Kromster
pero para un juego pequeño, fuera de línea, para un solo jugador, ¿sería algo así como una buena solución? parece que al menos podría detener algunas de las aplicaciones que existen
Raimi el
Sí, ese es solo el caso de EffortSpent vs ProtectionAchieved, donde la segunda parte nunca puede alcanzar el 100%.
Kromster
1
Los nombres aleatorios en el código fuente tampoco ayudarán, al menos en la mayoría de los casos. El programa generalmente se compila a IL / bytecode o directamente a binario, etc.
lozzajp
2

En lo que respecta a los juegos para un solo jugador , no puedes evitar hacer trampa, y no debes .


¿Por qué no puedo evitar hacer trampa en mi propio juego?

Como han señalado otras respuestas, incluso los mejores esfuerzos podrían ser potencialmente circunnavegados por un solo pirata informático y proporcionados al resto de su base de jugadores. Todavía puede hacer un esfuerzo en contra de esto, pero busque otras respuestas para obtener sugerencias sobre cómo hacerlo . Esta respuesta significa ahorrarle problemas, si su juego solo tiene como objetivo proporcionar un juego para un solo jugador.

¿Por qué debería dejar que los jugadores hagan trampa en un juego para un jugador?

Para citar a Sam ,

Dedique más tiempo a crear un gran juego y menos tiempo a evitar que los imbéciles arruinen su propia diversión, simple.

Esto pierde el punto por completo . Los juegos son una forma de entretenimiento . En general, su base de jugadores está jugando su juego para divertirse . Si un jugador usa trampas en tu juego, hay una razón por la que está usando trampas. Es seguro asumir que no podemos garantizar la definición de diversión de cada jugador individual; si usan trampas , tal vez esa sea su forma de hacer que tu juego sea más agradable para ellos.

¿Cómo hacer trampa hace que un juego sea más divertido?

Si bien cada individuo es único, existen algunas condiciones en las que los trucos podrían hacer que un juego sea más entretenido, fuera de mi cabeza:

  • El juego es un poco lento, y el jugador desea usar trampas para resaltar la acción antes de que se desanimen, por completo.
  • El jugador no puede superar un cierto desafío; normalmente no engañarían, pero están cerca de rendirse, frustrados. Pueden dejar de jugar tu juego, o pueden usar un truco para sortear el obstáculo y seguir jugando la segunda mitad de tu juego.
  • El jugador no puede dedicar la cantidad de tiempo que su juego requiere para la experiencia prevista. Al aplicar trucos, el usuario puede comenzar a correr y disfrutar del contenido deseado de su juego. Si crees que esto no parece plausible, considera que esta es la razón por la que personalmente he jugado muy poco de Fallout 4. En comparación, es el único juego que preordené en los últimos 5 años, y el único juego que he reservado y comprado para más de una plataforma. Amo el juego; No tengo tiempo para eso.
  • Tu juego tiene un error y esto impide que el jugador avance más. Un truco evita el error, para que el jugador pueda seguir jugando. Los juegos recientes de Elder Scrolls son conocidos por esta situación .

¿Por qué esto solo se aplica a los juegos de un jugador?

Es importante destacar que esto solo funciona en juegos de un jugador ; Si el jugador te dice que quiere usar trampas para divertirse más en su juego, no hay daño. Tan pronto como haya varios jugadores en el juego, las hazañas de ese primer jugador podrían convertirse en una desventaja injusta para los otros jugadores. Esta es la única situación real en la que no debe permitir hacer trampa.

Gnemlock
fuente
0

¿Qué hace una herramienta de pirateo de memoria?

Hay dos formas de operar la herramienta de pirateo.

  1. Acepta una dirección conocida donde se almacenan las variables del jugador.
  2. Introduce los cambios en la variable y escanea la memoria en busca de cambios.

¿Qué puedes hacer al respecto?

  1. Puede usar variables asignadas dinámicamente para almacenar variables de jugador para que la dirección siga cambiando al inicio. No habrá ninguna dirección fija que pueda enumerar un sitio web trampa.

  2. Cifre las variables del reproductor: escalar el valor, agregar una constante, etc. Esto trae un nuevo problema: un pirata informático puede desarmar su programa y encontrar los números que utiliza para cifrar las variables de su reproductor. Para esto, usa números aleatorios. También puede ampliar los valores de las variables de su jugador y luego agregar un número aleatorio de manera que el número agregado no altere significativamente el valor (agregar 10 o 20 a un valor ampliado de 2000 no hace mucha diferencia).

Por supuesto, algún hacker serio aún puede encontrar formas de superar estos obstáculos, pero no 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;
  }

Si bien el código anterior resuelve algunos problemas serios, todavía es descifrable. La única información que necesitará el pirata informático es: se accede a las variables del jugador a través de un puntero (también podría descubrirlo desmontando tu juego, pero será molesto y difícil). Una vez que el hacker tenga la dirección de las variables de tu jugador junto con otras variables aleatorias secretas, será una tarea fácil para él desarrollar un truco.

En mi opinión, sin desarmar, realmente no se puede escribir una herramienta de pirateo para dicho sistema. El resultado es impredecible ya que agregará un número aleatorio a las variables del jugador cada vez que se modifique. El rango en el que se almacenan las variables del reproductor tampoco es el mismo en cada inicio.

Que mas puedes hacer?

Siga cambiando la dirección de las variables del jugador ocasionalmente. ¿Impide la legibilidad del código? Bueno, lo hace hasta cierto punto, pero puede abstraer todo el proceso en una sola clase que tiene comentarios bien explicados. La interfaz proporcionada por la clase tendrá funciones simples Set / Get. El programador frontend no tendría que preocuparse por la complejidad subyacente.

Yashas
fuente
0

Ciencias económicas:

Si desea fortalecer su juego contra los tramposos, la mejor manera es comprar una solución de software que lo haga por usted. Hay varios proveedores, y puedes encontrar algunos de ellos buscando en Google "anti cheat breaks my game" .

Los profesionales son mucho mejores para prevenir trampas que tú, y mucho mejor para no romper tu juego de lo que eres (y aún no tienen éxito al 100%, en ninguno de estos). Entonces, si sientes que hay un valor en poner esa solución en tu juego, cómpralo. Hacer el tuyo será mucho más caro.

Una pregunta relacionada es "¿hay valor en el uso de software anti trampa?". La respuesta es: no, a menos que una parte decente de tu juego se base en un modo competitivo en línea.

Peter
fuente
0

La única forma de proteger su juego de modificaciones y edición de memoria es hacerlo solo EN LÍNEA y procesar valores vitales del lado del servidor .

Tal vez pueda cifrar los valores para que los edoits de memoria novatos no lleguen a ellos, pero todas las comunidades, como Cheat Engine , GameGuarian para Android, ArtMoney, Game Hacker ect tienen personas que podrán piratear cualquier cosa que procese el cliente. lado y mostrar a los demás cómo hacerlo o publicar entrenadores.

Es un esfuerzo inútil tratar de disuadir a los tramposos del lado cleint en mi opinión. Tampoco es realmente justo, ya que es su dispositivo y si quieren editar cosas que están sucediendo en su dispositivo, ¿por qué los obstaculizarían? El cliente es el rey después de todo.

Techinator
fuente
0

Quiero decir que no es tan difícil. Puedes mantener a raya el 99% de los tramposos de edición de memoria (esos Game Guardian , Cheat Engine ect a raya mediante simples valores de multiplicación. Incluso multiplicando por 10 en la memoria mantendrá a raya a la mayoría de los.

Recuerdo que muchos juegos flash en el día se multiplicarían por 8 o 6. O si realmente lo tomas en serio, codifica algunas comprobaciones o encripta los valores en la memoria.

Techinator
fuente
-2

No puedes, repito que no puedes. No hay respuesta a esta pregunta que un buen hacker no pueda deshacer.

¿Y qué? Si alguien quiere hacer trampa en su juego (suponiendo que no haya pérdidas monetarias o logros involucrados), ¿a quién le importa? Solo se engañan a sí mismos.

Dedique más tiempo a crear un gran juego y menos tiempo a evitar que los imbéciles arruinen su propia diversión, simple.

Sam
fuente
Votar abajo, ya que creo que la diversión juega un papel importante en esta respuesta, pero se extraña por completo . En lugar de una explicación adicional, estoy enviando una respuesta alternativa.
Gnemlock
-3

Cifrar el infierno fuera de él! ¡Almacene números importantes divididos en múltiples ubicaciones junto con otros valores para que cambien constantemente! Use números ficticios que si se alteran les dicen que son tramposos.

Todo puede romperse, pero la mayoría no se toma el tiempo para hacerlo.

PolloStealer
fuente
44
... y luego su código fuente será un desastre indescifrable e imposible de mantener. Buena suerte para encontrar un error o hacer un cambio de equilibrio sin explotar todo.
Philipp
Si tuviera que implementar esta forma de prevención de trampas, me decepcionaría sinceramente que los piratas informáticos se dieran cuenta de mi malvado plan y simplemente se rindieran. Eso significaría que no he perdido el tiempo de nadie más que el mío.
Marca Thomas
@MarcksThomas Bueno, si los piratas informáticos se rinden, entonces no perdiste el tiempo. Ese era el objetivo, después de todo, ¿no?
Dan
No estoy totalmente de acuerdo con usted en ese @Philipp: hay formas de mantener el código fuente claro, pero codificar el código de producción cuando se va. En la práctica, esto implica el cifrado y algo de mambojambo numérico y especialmente de temporización y subprocesamiento :-). Probamos con el código fuente inalterado y si hay un error en el código de producción, dejamos que se bloquee brutalmente (con un pequeño retraso, solo para ser malvado :-)). Un pequeño cambio en alguna parte también causa eso.
Ventormenta
Pensé que votaría esto como la mejor respuesta en esta cadena, pero parece que ya lo he hecho. Hay muchas reglas matemáticas para usar, que serán imposibles de realizar ingeniería inversa solo por la complejidad y, sobre todo, por el tiempo. Por ejemplo, se puede marcar la solicitud de bloqueo demorado o dejar que su sensibilidad se desvíe a un estado inútil (no reproducible). Por supuesto que debes ser una buena razón para esto.
Ventormenta
-4

La forma en que lo trato en los juegos en línea es esta.

No voy a ayudar a los hackers tanto que tengan paciencia conmigo. No mencionaré ningún programa que use para hacer esto. Tendrás que resolver eso. La única forma de detenerlos realmente es saber una cosa. No quieren que se detecte su programa de pirateo.

Hasta ahora, todos los usuarios de hackers / entrenadores que he derrotado. El desarrollador del hack pondrá un detector para ver si algo está mirando. Si algo es así, entonces el programa hacker / entrenador se cerrará automáticamente o solo funcionará a medias.

Por ejemplo, en la suciedad 3, los usuarios de entrenador pueden hacer que su automóvil gire automáticamente. Pero si coloca un detector en su extremo, el detector de trucos lo detectará y cerrará parte del truco. No todo.

La única parte del programa de entrenamiento que he visto afectada por mi intromisión son los súper frenos (frenado perfecto) y el spinout (el auto pierde el control sin ningún motivo). Tengo principalmente juegos de carreras como puedes ver. Todos son de codemasters y, lamentablemente, los tramposos abusan de esos juegos con bastante frecuencia.

Creo que solo puedo detenerlos debido a la forma en que nos conectamos entre nosotros mientras jugamos. Probablemente sea la misma razón por la que podrían causar un spinout para un jugador normal que no tiene idea de la seguridad.

Mi mayor sugerencia es obtener un muy buen antivirus de seguridad de Internet (Norton, Mcafee, Avast y todos los demás av de mierda no lo ayudarán). Esté dispuesto a gastar de $ 50 a $ 90 en una muy buena av que no he enumerado y luego aprender a experimentar con ella para jugar en línea.

Se necesita mucha paciencia y muchos conejillos de indias. He tenido mucho éxito con esto, pero también muchos años de experiencia en el trato con usuarios formadores. No conozco ningún código en absoluto. No tiene nada que ver con ello. La parte del código está bloqueada y no puede hacer nada al respecto. Podrías pensar que puedes pero simplemente no es posible detener lo que están haciendo por su parte.

Todavía puede prohibirlos con cosas como VAC porque Vac detecta firmas y ciertos comportamientos y modificaciones de archivos que ya conoce. Solo prohíbe la cuenta asociada con el truco.

Sin embargo, en realidad no detienen el engaño. No pueden molestarse con eso. Simplemente prohiben su cuenta. La otra cosa que me gustaría mencionar tiene que ver con Wolfenstein ET. Un juego muy viejo. Pero para mí tenía la mejor y más dura medida de seguridad de todas.

Nunca pude ver cómo lo hicieron. Les di la idea de lo que realmente detendría a los tramposos y le sugerí a uno de los encargados de Jaymod que prohibiera la entrada a modo de guía. ¿Qué tiene un guid fácilmente accesible al jugar juegos? Tarjetas gráficas La razón por la que implementaron eso es porque la gente simplemente cambiaba las direcciones IP y no necesitabas una cuenta para el juego, así que solo podías cambiar tu nombre, tu dirección mac, que también cambiaría tu dirección IP.

Pero cuando hicieron las prohibiciones de la tarjeta gráfica. Si querías volver a jugar tenías que RMA tu tarjeta o comprar una nueva. Sin embargo, eso está fuera del tema. Se supone que esto se trata de detección y salí por la tangente. Lamentablemente, no juego tanto ahora. Pero hombre, amaba a todos mis cerdos gunea. Especialmente los de los autos de proyecto. El único juego de carreras que no era codemasters. Pero aún efectuado por el mismo sinsentido.

Fred
fuente
Veo varios problemas con esta respuesta. 1. Formato. Es difícil de leer debido a la estructura, y debido a la inconsistencia gramatical, hay partes en las que no puedo entender lo que quieres decir. 2. Parece que hablas mucho sobre el tema como jugador que juega contra otros tramposos . Eso sería relevante en Arqade , pero estamos más preocupados por el desarrollo del juego . 3. Usted dice "no use los que mencioné", en lo que respecta a antivirus. Usted menciona "Norton, mcafe, avast y todos los de mierda . Esto no nos dice qué usar , especialmente cuando nombra a algunos de los mejor clasificados."
Gnemlock
Toda la última mitad parece ser una anécdota sobre cómo crees que una compañía de videojuegos tomó tu consejo (creo que te esfuerzas por decir que no estás seguro de cómo se hace, así que interpreto que tu explicación adicional de cómo se hace debe basarse en especulaciones , no en hechos).
Gnemlock