[TUTORIAL] Nexon Game Security Bypass - MapleStory

  • Hola Invitado, si deseas saber que es lo que paso con nuestro servidor de discord, puedes ingresar al siguiente enlace Discord


195
Me Gusta
68
Temas

c0de

MOV EAX, EDX
Registrado
19 Abr 2020
Mensajes
127
Ubicación
Localhost
Mejores respuestas
0
LV
0
 
Pensé que debería hacer una (muy) pequeña crítica para acompañar el bypass (parcial) que lancé hace un tiempo, ya que sería bueno agregar al gran índice de anticheat aquí.

Pasé algunas semanas revirtiendo la seguridad del juego Nexon porque estaba escribiendo esas cosas de mapeo .

NGS fue muy divertido, escribí un rastreador de llamadas debido a que registraría todas las ramas que tomó un programa. Durante este tiempo, noté que todas las API registradas eran bastante anodinas. Después de algunos ajustes, encontré que mi código excepcionalmente perfecto se bloqueaba después de un período de tiempo establecido, así que investigué un poco más.

Esta es la sección que se bloquea

1590551203352.png

Por suerte para ti, guardo capturas de pantalla al azar.

Lo que estás viendo es la entrada de la puerta del cielo, cambiando CS a 0x33 (modo largo) para ejecutar código x64, luego volviéndolo a cambiar a 0x23.
En el modo largo, arreglan algunos registros como se ve en la captura de pantalla, y realizan una llamada a algunos WINAPI, pero el problema es que irá a winapis de 64 bits , mientras se ejecuta en un programa WoW de 32 bits.

Tocaré brevemente mi bypass porque, sinceramente, no es tan difícil. Esencialmente, lo que hice fue registrar un controlador de excepciones en modo largo (entrando yo mismo en la puerta del cielo) y establecer un controlador de excepciones x86 para capturar nuevos hilos. Luego, por cada hilo que encontré / se creó, coloqué un HWBP en la ubicación de las llamadas. Esta excepción será manejada por el controlador x64 (llamado x64handler en el archivo de ensamblaje porque soy original).

Debido a que soy demasiado vago para explicarlo, aquí está el ensamblaje en bruto para el controlador:

1590551218511.png

con las macros definidas como:

C++:
potato_fn dq 0
macro SAVE_SCRAP
{
        push rcx
        push r8
        push rbx
        push rsi
        push r15                                                   ; TODO: Perhaps check if our breakpoint is hit immediately after a call, if so, send it to the x86 function to get return value?
        push r14
        push r13
        push r12
        push r11
        push r10
        push rdi
}
macro POP_SCRAP
{
        pop rdi
        pop r10
        pop r11
        pop r12
        pop r13
        pop r14
        pop r15
        pop rsi
        pop rbx
        pop r8
        pop rcx
}

potato_fn es la dirección de "x86Callback" que vuelve a cambiar a x86, llama a una función de controlador para filtrar la API llamada y vuelve a ingresar x64 antes de regresar.

Esa es la parte "inteligente" hecha, todo lo demás es muy simple. Tomo el índice syscall en el EIP actual y envío si es que deseo "enganchar", hago cosas con él. Por ejemplo: puede ver si el índice es 0x26, oculto cualquier llamada ZwOpenProcess que esté dirigida a un programa con "trampa" en el nombre, lo que le permite a uno usar el motor de trucos mientras juega un juego protegido por NGS.

Como dije, este es un bypass parcial porque se ajustaba a mis necesidades en ese momento, para obtener un bypass completo , solo necesita hacer una cosa más, que otro usuario en este foro ya ha hecho.

Además, no necesitas hacerlo a mi manera. Solo me gustan las excepciones. Puede lograr lo mismo con un simple gancho, es solo que su gancho podrá ser detectado por las sumas de verificación, así que verifíquelas, je.

Demasiado largo; dar fuente: Bitbucket

Creditos
mambda de GuidedHacking