Esto generalmente se hace mediante ingeniería inversa del juego para averiguar dónde viven las variables dentro del programa. Hay dos formas de modificar esas variables.
Programa de revisión
Un atacante puede parchear el ejecutable o el DLL en sí mismo si no hay protecciones de integridad en él. Básicamente, los bytes reales del programa se modifican para ser / hacer algo diferente. Mientras el programa no verifique que no se haya cambiado ningún dato, esta es una opción muy viable.
Esto se puede mitigar realizando algún tipo de suma de comprobación en todo el ejecutable. Un hash criptográficamente fuerte haría. No querría usar algo como CRC32 porque con suficientes cambios en el binario, un atacante podría hacer coincidir las sumas de comprobación.
También puedes firmar tu programa. Antes de ejecutar el programa verifica la firma del programa. Si esto falla, entonces el programa no se ejecuta.
En el parche de memoria
Esta técnica es generalmente un poco más molesta. Mientras el programa está ejecutando, un atacante inyecta un código en él, o encuentra dónde vive en la RAM y parchea el programa allí. La inyección de código es mucho más difícil de hacer, pero los parches de memoria son casi lo mismo que los parches regulares. El atacante tiene que realizar esto cada vez que se ejecuta el programa, ya que la RAM se borrará. Esto es mucho más difícil de mitigar ya que el programa ya se está ejecutando.
Existen técnicas que puede utilizar para evitar la ingeniería inversa en general. Durante las partes del programa que desea proteger, puede detectar la presencia de un depurador. Es casi seguro que los ingenieros inversos necesitarán usar un depurador para averiguar exactamente qué pirciones de memoria afectan lo que hace el programa durante la ejecución. Manipular la memoria en un depurador para ver cómo se ve afectado el programa.
También puedes usar la ofuscación de código para hacer que el desmontaje o descompilación de tu código sea mucho más difícil.
Aquí hay un enlace divertido en esa dirección general .