Detectar o prevenir inyecciones de memoria de proceso en Windows (anti-hack)

5

Estuche de hacking estándar. Hack inyecta en un proceso de juego iniciado y escribe sobre la memoria de proceso usando WriteProcessMemory call.

La situación es así:

  1. estamos hospedando un servidor de juegos
  2. los clientes se unen al servidor con sus juegos, pueden corromper sus juegos usando varios hacks
  3. no tenemos oportunidad de cambiar la fuente del juego, es como es. Sin embargo, tenemos la posibilidad de hacer que nuestro programa se ejecute antes de que el cliente pueda unirse al servidor.

Para dejarlo claro: no podemos ofuscar la memoria del juego, pero sí tenemos la posibilidad de ejecutar un programa separado al mismo tiempo. Ya intenté usar una llamada EnumProcessModules que enumera todos los DLL de proceso sin éxito. Me parece que los hacks se inyectan directamente en la memoria del proceso, por lo tanto, no se detectan. Después de hacer una gran cantidad de "investigación de Google", he llegado a algunas opciones:

  1. buscar nombres de procesos en ejecución, archivos en el directorio del juego, patrones de bytes de bytes, patrones de bytes de procesos en ejecución ... esta tarea lleva mucho tiempo, ya que tendría que obtener muestras de todos los hacks disponibles y actualizaciones Nuestro programa cada vez que sale uno nuevo. Toda la información del hackeo debe almacenarse dentro de la fuente, lo que puede hacer que el programa sea muy grande.

  2. Usar ReadProcessMemory para monitorear los cambios en las compensaciones de memoria bien conocidas (los hacks usualmente usan las mismas compensaciones para lograr algo). Necesitaría ejecutar algunos hacks, monitorear el comportamiento y obtener muestras del comportamiento de hack cuando se compara con la ejecución normal. Básicamente, el programa haría lo mismo que los hacks pero a la inversa.

  3. detecta WriteProcessMemory call dentro de la memoria. No estoy seguro de si esto traería algunos falsos positivos de DLL legítimos, pero la idea parece interesante. ¿Cómo escanearía la memoria de proceso para esta llamada? ¿Cómo obtener el valor de byte?

Este es un ejemplo de una llamada hack:

WriteProcessMemory(phandler,0xsomeoffset,&datatowrite,...);

El desplazamiento se arregla realmente al menos en hacks de bajo nivel. Si pudiéramos reorganizar de alguna manera la pila o empujarla hacia abajo de alguna manera, ya podría estropear el truco para bloquear el juego.

Algunos datos más:

  1. los nuevos hacks rara vez se publican y hay un número fijo de aquellos que están disponibles públicamente y que realmente funcionan. La mayoría de ellos también funcionan de manera similar.
  2. el objetivo es detectar el hack o confundirlo con el trabajo

Mi pregunta aquí es, ¿cuáles serían algunas buenas maneras de alcanzar mis metas aquí? Cualquier idea que pueda confundir el hack o ayudar a detectar un hack que se inyecta o un cambio de memoria es bienvenida.

Sé que NO HAY NINGUNA MANERA de tener un sistema 100% seguro contra piratas informáticos, pero si detectamos solo a aquellos que utilizan piratearon públicamente disponibles, ya es el 95% de los piratas informáticos, no nos importa la minoría de piratas informáticos inteligentes.

    
pregunta cen 25.06.2012 - 13:48
fuente

4 respuestas

2

Sé que has mencionado esto como ineficiente y estoy completamente de acuerdo, Sin embargo, seguramente podrías ejecutar un temporizador de algún tipo y buscar continuamente programas como Cheat Engine y Tsearch :)

Aquí hay otra idea completamente aleatoria: Podría escribir una función para verificar un byte en un desplazamiento en su juego y ver si coincide con el byte que desea que esté allí; si no, puede llamar a un evento para cerrar el juego o escribir el byte correcto para ese desplazamiento, otra opción podría ser verificar los bytes contra los bytes almacenados en un servidor y si el byte es diferente, entonces el usuario recibe una patada.

Espero que te dé algunas ideas :)

    
respondido por el Connor Spencer Harries 01.08.2012 - 20:33
fuente
6

Ooooohh Me encantan las preguntas como esta.

Bien, primero:

  

estamos alojando un servidor de juegos

Bam, ahí tienes. Si el cliente debe enviar la actualización del estado al servidor del juego antes de enviarlo a otros clientes, tiene la oportunidad de analizar el estado del juego para ver si hay cambios. Esto significa que puedes detectar patrones anómalos. Así, por ejemplo, si de repente ve un cambio masivo de valor en el oro, puede dejar a ese usuario fuera del juego.

Hay muchos enfoques estadísticos que puedes tomar. Aparte del "cambio enorme" o la "acción imposible" obvia, puede aplicar más soluciones a largo plazo, como el oro con el tiempo. Suponiendo que conozco el truco de "no agregar grandes cantidades de oro a mi personaje", podría incrementar el oro en cantidades seguras con el tiempo. Genial, si siempre presiono el filo. Sin embargo, ese aumento constante no se correlacionará con el oro equivalente obtenido en un juego genuino y consistente, así que ... nuevamente, detecte y cierre la cuenta.

La clave aquí es que estas son cosas que puedes hacer en el lado del servidor que el usuario final no puede hacer nada, incluso si han manipulado el estado del juego.

Ahora, en sus preguntas secundarias de Win32. En primer lugar, no creo que WriteProcessMemory sea una llamada particularmente válida para cualquier DLL, con la excepción de los depuradores (que reemplazará las instrucciones en el código; así es como funcionan los puntos de interrupción establecidos por los depuradores), sin embargo, no hay manera Puede reemplazar esto de manera confiable para cada llamada en el sistema sin escribir lo que efectivamente es un rootkit, es decir, afectaría a todos, no solo a usted. Así que esto no es realmente una opción.

Una cosa que podrías hacer, y no es nada fácil, es revisar periódicamente tu propia memoria ejecutable para su modificación. Para obtener más información, consulte Tamper Aware / Self Healing Code en el proyecto de código. Básicamente, invoca esto periódicamente y bloquea el juego si detectas alguna modificación.

También puede considerar firma de código - no es ridículamente caro , y proporciona una forma integrada en Windows de prevenir modificaciones ejecutables sin conexión.

Si almacena el estado guardado localmente, puede considerar guardar sumas de comprobación y enviarlas a sus cuentas de servidor. No, esto no es a prueba de balas, pero agrega complejidad adicional.

Si vas a implementar cualquiera de estas funciones, necesitarás levantar un poco la barrera y dificultar que el cracker se desactive, salte o evite los mecanismos de protección. Seamos claros: si alguien tiene la determinación suficiente, ya está acabado, pero al menos puede hacer que sus vidas sean muy dolorosas.

El artículo principal para la ingeniería anti reversa en mi lista de lectura también es del proyecto de código . La guía es muy completa y debería proporcionarle una excelente base en exactamente lo que puede hacer para confundir y molestar a los depuradores. Voy a caminar a través de uno de ellos, que creo que es fantástico:

 SetUnhandledExceptionFilter(UnhandledExcepFilter);
 __asm{xor eax, eax}
 __asm{div eax}

Esto es malo. Básicamente, como explica el artículo, se llama a UnhandledExceptionHandler en un proceso de no depuración como el controlador de último recurso; sin embargo, en este caso eliminamos deliberadamente eax , luego dividimos por cero. Eso causará un fallo en el procesador, que luego el sistema operativo envía de vuelta al controlador de excepciones del ejecutable, solo si hay un depurador adjunto. Si hay un depurador adjunto, el depurador recibe una notificación y el ejecutable sale.

Por supuesto, es bastante fácil para un atacante reemplazar div eax con una o más instrucciones nop o algo así, lo que significa que la ejecución solo se deslizará, pero una pequeña auto verificación lo capta con bastante facilidad.

Entonces, en conclusión entonces:

  • Mi primer consejo sería intentar detectar trucos en el servidor. Aquí tienes todas las llaves. Incluso podría introducir estos cambios "oscuros", es decir, verificar y ver quién está haciendo trampa, luego analizar sus estados para ver si funciona, sin cortarlos.
  • Entonces, intentaría una auto verificación periódica en varias formas:
    • En la memoria, tanto como sea confiable, del ejecutable.
    • En la memoria, tanto como sea confiable, de estructuras de datos críticos.
    • El ejecutable en el disco, también.
  • Finalmente, leí esa guía de ingeniería inversa de arriba a abajo y vería qué puedes aplicar a tu ejecutable. Me doy cuenta de que dijiste que no puedes modificar tu ejecutable, pero honestamente, a menos que lo hagas, es probable que estés en contra de él. Después de todo, un atacante puede matar un segundo "proceso de observador".
respondido por el user2213 02.08.2012 - 22:46
fuente
0

¿Harías tu propia función WriteProcessMemory y la vincularías al archivo exe del juego, y filtrarías las llamadas falsas? O cualquier otra función que pueda interceptar con algún flujo que pueda filtrar. De todos modos, esto es muy avanzado y deberías proporcionar todas las llamadas a kernel32.dll o algo así. Básicamente, tendrías que hacerlo si quieres protegerlo de esto, quizás algún tipo de filtrado de la secuencia ayudaría, pero para descubrirlo pasarías un tiempo con el depurador buscando un momento en el que el comando es decodificado, entonces puedes rellenarlo con ceros. El proxy SSL sería bueno tenerlo por separado como en CORREO ELECTRÓNICO, por lo que recibió el mensaje y, antes de entregarlo, ejecuta una verificación de escaneo en un proceso separado y luego lo entrega al buzón en otra cuenta.

    
respondido por el Andrew Smith 26.06.2012 - 13:27
fuente
0

Para obtener información sobre cómo derrotar a los chats en tus juegos, te recomiendo el siguiente artículo:

Es un excelente resumen de algunos de los desafíos.

Si desea más, también puede consultar el siguiente libro:

respondido por el D.W. 02.08.2012 - 20:18
fuente

Lea otras preguntas en las etiquetas