[TUTORIAL] Academia de Hacking de Juegos en Español - 2022

  • Hola Invitado, ¿Quieres ganar dinero con GamerzHacking?, estamos necesitando creadores de contenido en game hacking o pirateria de juegos ingresa al siguiente enlance para mayor informacion AQUI
  • Hola Invitado, ¿Creas contenido sobre game hacking en tu blog o sitio web?, ¿Te gustaria formar una alianza para asi poder generar mas trafico en tu sitio y seguir creciendo como comunidad? INGRESA AQUI


259
Me Gusta
124
Temas

c0de

MOV EAX, EDX
Top Publicador Del Mes
Registrado
19 Abr 2020
Temas
124
Mensajes
235
Ubicación
Localhost
Mejores respuestas
0

ACADEMIA DE HACKING DE JUEGOS EN ESPAÑOL - 2022

Una guía para principiantes para comprender las técnicas del hacking de juegos

1651699872383.png

Creado a partir de materiales publicados originalmente entre 2019 y 2021 en https://
gamehacking.academy y

Porfavor, Acceder o Registrarse para ver el contenido de las URL!
. No me atribuyo los créditos por grandioso trabajo, lo único que hare es traducirlo al español y quizás en alguno aumentar o mejorarlo de acuerdo a mi experiencia


Tabla de contenido
  1. Introducción
  2. Recursos Externos
  3. Básicos
    1. Fundamentos de la computadora
    2. Fundamentos de los juegos
    3. Fundamentos de la piratearía
    4. Configuración de un laboratorio en una maquina virtual
    5. Hackear de memoria
  4. Depurar y Reversear (Debugging & Reversing)
    1. Fundamentos de la Depuración
    2. Fundamentos del Reversear
    3. Cambiando el Código del Juego
    4. Reverseando Código
    5. Cuevas de Código (Code Cave)
    6. Usando Cuevas de Código
    7. Asignación Dinámica de Memoria (Dynamic Memory Allocation)
    8. Derrotando al DMA
  5. Programación
    1. Fundamentos de la Programación
    2. Hack de Memoria Externa
    3. Hack de Memoria DLL
    4. Cuevas de Código y DLL
    5. Imprimiendo Texto
  6. RTS Hacks
    1. StatHack
    2. Map Hack
    3. Macro Bot
  7. FPS Hacks
    1. Fundamentos 3D
    2. Wallhack (Memoria)
    3. Wallhack (OpenGL)
    4. Chams (OpenGL)
    5. Triggerbot
    6. Aimbot
    7. No Recoil
    8. Radar Hack
    9. ESP
    10. Multihack
  8. Multijugador (Multiplayer)
    1. Fundamentos del Multijugador
    2. Análisis de paquetes
    3. Reverseando paquetes
    4. Creando un cliente externo
    5. Proxiando trafico TCP
  9. Herramientas de desarrollo
    1. Inyector DLL
    2. Escaneo de patrones (Pattern Scanner)
    3. Escaneo de memoria (Memory Scanner)
    4. Desesambladores
    5. Depuradores
    6. Registro de Llamadas (Call Logger)

Continuara en unas horas

Saludos
 
  • Like
Reacciones : Mstik y Ch3r


259
Me Gusta
124
Temas

c0de

MOV EAX, EDX
Top Publicador Del Mes
Registrado
19 Abr 2020
Temas
124
Mensajes
235
Ubicación
Localhost
Mejores respuestas
0

1. INTRODUCCION

Hackear juegos requiere una combinación única de revertir(reversing), administración de memoria, redes y habilidades de seguridad. A pesar de que la piratería ética se ha disparado en popularidad, la piratería de juegos todavía ocupa un nicho muy pequeño en la comunidad de seguridad más amplia. Mientras que puede no tener el mismo atractivo para los titulares que Chrome 0day o una fuga masiva de datos, la sensación única de crear un aimbot que funcione para un juego y luego destruir un servidor con él es difícil de replicar en cualquier otro medio. Cuando comencé a aprender a hackear juegos hace años, los recursos estaban distribuidos en varios sitios y eran muy escasos. Por lo general, encontrará una sección de código vinculado a un sitio roto. A continuación, buscaría algún foro que tuviera alguna parte del sitio roto en una publicación y juntar la información. Mientras esto sera recompensada con una búsqueda minuciosa, fue una enorme inversión de tiempo. En estos días, hay varios lugares donde puede encontrar una variedad de información sobre la piratería de juegos. Puedes encontrar código repetitivo para casi cualquier motor, junto con las compensaciones(offset) de memoria para cualquier estructura que le puede interesar. Sin embargo, un área aún desatendida por toda la información disponible hoy en día son los conceptos. Y fundamentos detrás de las compensaciones.

Mi esperanza es que este tutorial ayude a llenar esos vacíos.

2. RECURSOS EXTERNOS

Esta es una lista de todos los recursos externos, como herramientas y juegos, utilizados en este libro. Están ordenados por su apariencia. Esto tiene la intención de ayudar si planea leer esto reservar en un lugar sin acceso a Internet.

3. BASICOS

3.1 COMPONENTES DE UNA COMPUTADORA

Una computadora típica tiene varios componentes conectados. Entre los más importantes son:
  • Disco Duro
  • RAM
  • Tarjeta de Video
  • La Placa Madre
  • CPU
Si tuviera que quitar el costado de una computadora de escritorio, las partes podrían colocarse en un configuración así:

1654321644303.png

Para nuestros propósitos, solo abordaremos brevemente los primeros cuatro componentes, y luego se centrará en la CPU en la siguiente sección:
  • Los discos duros son responsables de almacenar archivos grandes, como fotos, ejecutables, o archivos del sistema.
  • La RAM contiene datos a los que se debe acceder rápidamente. Los datos se cargan en la RAM desde el disco duro.
  • Las tarjetas de video son las encargadas de mostrar los gráficos al monitor.
  • Las placas base(placa madre o motherboard) unen todos estos componentes y les permiten comunicar.

3.1.1 EL CPU

La CPU es el cerebro de la computadora. Es responsable de ejecutar instrucciones. Estas instrucciones son simples y varían según la arquitectura. Por ejemplo, una instrucción podría sumar dos números. Para acelerar el tiempo de ejecución, la CPU tiene varias áreas especiales donde puede almacenar y modificar datos. Estos se llaman registros.

1654322122984.png

3.1.2 INSTRUCCIONES

Todos los programas de ordenador están formados por una serie de instrucciones. Como discutimos anteriormente, una instrucción es simplista y generalmente solo hace una cosa. Por ejemplo, las siguientes son algunas de las instrucciones que se encuentran en la mayoría de las arquitecturas:
  • Añadir dos números
  • Restar dos números
  • Compara dos números
  • Mover un número a una sección de memoria (RAM)
  • Ir a otra sección del código
Los programas de computadora se desarrollan a partir de estas sencillas instrucciones combinadas. Por ejemplo, una calculadora simple podría verse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

La primera instrucción (mov) mueve el valor de 5 al registro eax . El segundo mueve el valor de 4 al registro ebx. La instrucción add luego agrega eax y ebx y coloca el resultado nuevamente en eax .

3.1.3 PROGRAMAS DE COMPUTADOR

Los programas de computadora son colecciones de instrucciones. Los programas son responsables de recibir un valor (la entrada) y luego producir un valor (la salida) basado en el valor recibido.

Por ejemplo, un programa simple podría tomar un número como entrada, aumentar el número en 1 y luego moverlo a una salida. Podría verse como:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Un programa más complejo tendría muchos de estos programas simples "dentro" de él. En este contexto, estos programas internos simples se denominan funciones. Las funciones, al igual que los programas, toman una entrada y producen una salida. Por ejemplo, podríamos convertir nuestro programa anterior en una función que haga lo mismo. Podría verse como:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

También podríamos hacer otra función que haga una operación similar. Por ejemplo, podríamos escribir una función para disminuir un número en 1:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Estas dos funciones ( sumar y restar ) se pueden usar para crear un programa más complejo. Este nuevo programa tomará un número y lo incrementará o disminuirá. Tomará dos entradas:
  1. Un número
  2. Una operación matemática, en este caso, sumar (+) o restar (-)
Este nuevo programa será más largo y tendrá dos formas diferentes de ejecutarse. Estos se explicarán después del código:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Este código tiene dos funciones en la parte superior. Como discutimos, estos toman una entrada y luego suman o restan 1 de la entrada para producir la salida. La instrucción cmp compara dos valores. En este caso, está comparando el tipo de operación recibido como entrada y un valor codificado en el programa, - . Si estos valores son iguales, vamos a (o saltamos a) otra sección del código ( je = saltar si es igual).

Si la operación es igual a - , vamos al código que resta 1 al número. De lo contrario, continuamos el programa y sumamos 1 al número antes de salir.

Comparar números y luego saltar a diferentes códigos dependiendo de su valor se conoce como bifurcación. La bifurcación es un componente clave del diseño de programas complejos que pueden reaccionar a diferentes entradas. Por ejemplo, un juego a menudo tendrá una rama para cada dirección en la que un jugador puede moverse.

3.1.4 BINARIO, DECIMAL Y HEXADECIMAL

Fundamentalmente, las CPU son circuitos. Los circuitos tienen electricidad fluyendo a través de ellos (encendidos) o no (apagados). Estos dos estados se pueden representar mediante un sistema numérico binario (o de base 2). En un sistema de base 2, tiene dos valores posibles: 0 y 1. Un número binario de ejemplo es 1101.

Estamos familiarizados con un sistema numérico decimal (o base 10), que tiene 10 valores posibles: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Un número decimal de ejemplo es 126. Este El número se puede representar en un formato más explícito como:

(1 * 10 2 ) + (2 * 10 1 ) + (6 * 10 0 )

Podemos representar el número binario anterior (1101) en el mismo formato. Sin embargo, reemplazaremos los 10 con 2, ya que estamos cambiando de un sistema de base 10 a base 2:

(1 * 2 3 ) + (1 * 2 2 ) + (0 * 2 1 ) + (1 * 2 0 )

Los números binarios pueden volverse difíciles de manejar rápidamente cuando necesitan representar valores más grandes. Por ejemplo, la representación binaria del número decimal 250 es 11111010.

Para representar estos números binarios más grandes, los números hexadecimales (base 16) se usan comúnmente en computación. Los números hexadecimales suelen tener el prefijo del identificador 0x y tienen dieciséis valores posibles: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. Un ejemplo hexadecimal número es 0xA1D.

3.1.5 LENGUAJES DE PROGRAMACION

Las instrucciones se representan como números, como todos los demás datos en una computadora. Estos números se conocen como códigos de operación, a menudo abreviados como códigos de operación. Los códigos de operación varían según la arquitectura. La CPU conoce cada código de operación y lo que debe hacer cuando se encuentra con cada uno. Los códigos de operación se representan comúnmente en formato hexadecimal. Por ejemplo, si una CPU Intel encuentra un 0xE9, sabe que necesita ejecutar una instrucción jmp (salto).

Las primeras computadoras requerían que los programas se escribieran en códigos de operación. Obviamente, esto es difícil de hacer, especialmente para programas más complejos. Luego se adoptaron variantes de un lenguaje ensamblador, lo que permitió la escritura de instrucciones. Se ven similares a los ejemplos que escribimos anteriormente. El lenguaje ensamblador es más fácil de leer que solo los códigos de operación, pero aún es difícil desarrollar programas complejos.

Para mejorar la experiencia de desarrollo, se desarrollaron varios lenguajes de alto nivel, como FORTRAN, C y C++. Estos lenguajes son fáciles de leer e introdujeron operaciones de control de flujo como los condicionales if y else . Por ejemplo, el siguiente es nuestro programa de incremento/decremento en C. En C, un int se refiere a un número entero o entero (-1, 0, 1 o 2 son ejemplos).

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Todos estos lenguajes de nivel superior se compilan hasta ensamblar. Luego, un ensamblador tradicional convierte ese ensamblaje en códigos de operación que la CPU puede entender.

3.1.6 LENGUAJES DE PROGRAMACION

Escribir programas para comunicarse con el hardware es un proceso difícil y que requiere mucho tiempo. Para ejecutar nuestro programa de incremento/decremento, también tendríamos que escribir código para manejar las pulsaciones de teclas desde un teclado, mostrar gráficos en el monitor, crear juegos de caracteres para poder representar letras y números, y comunicarnos con la memoria RAM y el disco duro. . Para facilitar el desarrollo de programas se crearon los sistemas operativos. Estos contienen código que ya puede manejar estas funciones de hardware. También tienen varias funciones estándar que se usan comúnmente, como copiar datos de una ubicación a otra.

Los tres sistemas operativos principales que aún se utilizan en la actualidad son Windows, Linux y MacOS. Todos estos tienen diferentes bibliotecas y métodos para comunicarse con el hardware. Esta es la razón por la que los programas escritos para Windows no funcionan en Linux.

3.1.7 APLICACIONES

Los sistemas operativos necesitan una forma de determinar cómo manejar los datos cuando un usuario los selecciona. Si los datos son una foto, el sistema operativo quiere abrir una aplicación específica (como Paint) para ver la foto. Del mismo modo, si los datos son una aplicación en sí, el sistema operativo debe pasarlos a la CPU para que se ejecuten.

Cada sistema operativo maneja la ejecución de forma única. En Linux, se establece un permiso ejecutable especial en un archivo normal. En Windows, las aplicaciones tienen un formato especial que Windows sabe cómo analizar. Esto se conoce como formato PE, o ejecutable portátil. El formato PE tiene varias secciones, como la sección .text para almacenar el código del programa y la sección .data para almacenar variables.

3.1.8 JUEGOS

Con todo eso fuera del camino, finalmente podemos hablar de juegos. Los juegos son simplemente aplicaciones. En Windows, están formateados en formato PE, idéntico a cualquier otra aplicación. Contienen una sección .text que contiene el código del programa, compuesto por códigos de operación. Luego, la CPU ejecuta estos códigos de operación, y el sistema operativo muestra los gráficos resultantes y maneja la entrada, como si se presionaran teclas.

3.2 FUNDAMENTO DE LOS JUEGOS

3.2.1 JUEGOS

Si bien los juegos son aplicaciones, son complejos y se componen de varias partes. Algunos de estos incluyen:
  • Gráficos
  • Sonidos
  • Entrada
  • Físico
  • Lógica del juego
Debido a la complejidad de cada parte, la mayoría de los juegos usan funciones externas para estas partes. Estas funciones externas se combinan en lo que se llama una biblioteca. Luego, otros programas utilizan las bibliotecas para reducir la cantidad de código escrito. Por ejemplo, para dibujar imágenes y formas en una pantalla, la mayoría de los juegos usan la biblioteca DirectX u OpenGL.

Para algunos tipos de hacks, es importante identificar las bibliotecas que se utilizan. Un wallhack es un tipo de hackeo que le permite al hacker ver a otros jugadores a través de paredes sólidas. Un método para programar un wallhack es modificar la biblioteca de gráficos del juego. Tanto OpenGL como DirectX son vulnerables a este tipo de ataques, pero cada uno requiere un enfoque diferente.

Para la mayoría de los trucos, modificaremos la lógica del juego. Esta es la sección de instrucciones responsable de cómo se desarrolla el juego. Por ejemplo, la lógica del juego controlará qué tan alto salta un personaje o cuánto dinero recibe el jugador. Al cambiar este código, potencialmente podemos saltar tan alto como queramos o ganar una cantidad infinita de dinero.

3.2.2 ESTRUCTURA DEL JUEGO

La lógica del juego se compone de instrucciones, como todo código de computadora. Debido a la complejidad de los juegos, a menudo se escriben en un lenguaje de alto nivel y se compilan. A menudo se requiere comprender la estructura general del código original para hacks más complejos.

La mayoría de los juegos tienen dos funciones principales:
  • Configuración (Setup)
  • Bucle principal (Main Loop)
La función de configuración se ejecuta cuando se inicia el juego por primera vez. Es responsable de cargar imágenes, sonidos y otros archivos grandes desde el disco duro y colocarlos en la memoria RAM. El bucle principal es un tipo especial de función que se ejecuta indefinidamente hasta que el reproductor se cierra. Es responsable de manejar la entrada, reproducir sonidos y actualizar la pantalla, entre otras cosas. Un bucle principal de ejemplo podría verse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Todas estas funciones a su vez llaman a otras funciones. Por ejemplo, la función handle_input podría verse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Cada juego está programado de manera diferente. Algunos juegos pueden priorizar la actualización de gráficos antes de manejar la entrada. Sin embargo, todos los juegos tienen algún tipo de bucle principal.

3.2.3 DATOS Y CLASES

Todos los datos que se pueden actualizar en un juego se almacenan en una variable. Esto incluye cosas como la puntuación, la posición o el dinero de un jugador. Estas variables se declaran en el código. Un ejemplo de definición de variable en C podría verse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Este código declararía la variable dinero como un número entero. Como aprendimos en la última lección, los valores enteros en C son números enteros (como 1, 2 o 3). Imagina si tuviéramos que rastrear el dinero de varios jugadores. Una forma de hacer esto sería tener varias declaraciones, así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Una desventaja de este enfoque es que es difícil de mantener a medida que el juego se vuelve más grande y más complejo. Por ejemplo, para escribir un código que aumente el dinero de cada jugador en 1, tendríamos que actualizar manualmente cada variable:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Si agregáramos a otro jugador, tendríamos que ir y actualizar cada sección del código que alteró el dinero de los jugadores. Un mejor enfoque es declarar estos valores en una lista. Luego podemos usar una instrucción conocida como bucle para recorrer cada elemento de la lista. Esto se conoce como iteración. En C, las listas se implementan comúnmente usando lo que se conoce como matriz. Para nuestros propósitos, puede suponer que las listas y las matrices son sinónimos. Un tipo de bucle en C se conoce como bucle for. Los bucles for se dividen en tres segmentos: el valor inicial, el valor final y cómo actualizar el valor después de cada iteración. Un ejemplo del código anterior podría escribirse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Ahora solo tendríamos que actualizar la variable current_players para agregar soporte para otro jugador.

Para facilitar el desarrollo de aplicaciones complejas, los desarrolladores suelen utilizar un modelo de programación conocido como programación orientada a objetos u POO. En POO, las variables y funciones se agrupan en colecciones llamadas clases. Las clases suelen ser independientes. Por ejemplo, muchos juegos tendrán una clase Player. Esta clase contendrá varias variables como la posición, el nombre o el dinero del jugador. Estas variables dentro de la clase se conocen como miembros. Las clases también contendrán funciones para modificar estos miembros. Un ejemplo de una clase de jugador podría verse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

Los juegos a menudo contendrán listas de clases. Por ejemplo, el juego Quake 3 tiene una matriz de todos los jugadores actualmente conectados a un servidor. Cada jugador tiene su propia clase de jugador en el juego. Para calcular la pantalla de puntaje, el juego revisará a cada jugador en la lista y verá la cantidad de muertes que tienen.

3.2.4 MEMORIA

Los juegos tienen muchos recursos grandes, como imágenes y sonidos. Estos deben cargarse desde el disco duro, generalmente en la fase de configuración del juego. Una vez cargados, se colocan en la memoria RAM, junto con el código y los datos del juego. Debido a que los juegos son tan grandes, deben cargar constantemente diferentes datos de la RAM en los registros para operar. Esta carga generalmente se realiza mediante un comando mov . Este comando moverá una sección de la memoria a un registro. Nuestra función de ejemplo de increase_money ejecutada por la CPU podría verse así:

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

En este ejemplo, usamos 0x12345678 como la ubicación en RAM del dinero del jugador. La mayoría de los juegos tendrán esta estructura pero una ubicación diferente. Para juegos más complejos, estas ubicaciones se basarán en otras ubicaciones. Si nuestro juego tuviera una clase de jugador, el código de aumento de dinero ejecutado por la CPU necesitaría usar la ubicación de la clase del jugador para recuperar el dinero.

C++:
Porfavor, Acceder o Registrarse para ver el contenido de los códigos!

En este caso, la CPU tuvo que compensar(offset) la ubicación del dinero en función de la ubicación de la clase Player.

3.2.5 CLIENTE MULTIJUGADOR

Los juegos multijugador permiten que varios jugadores interactúen entre sí. Para permitir esto, los juegos multijugador utilizan clientes y servidores. A continuación se muestra un ejemplo del modelo cliente-servidor:

1654323389213.png

Los clientes representan la copia del juego de cada jugador y contienen toda la información sobre el juego local. Por ejemplo, cada cliente contendrá el dinero de ese jugador. Cuando un jugador provoca una acción para cambiar su dinero, el cliente es responsable de enviar esta actualización al servidor.

La información también se puede enviar en ambas direcciones. Un ejemplo de esto es el movimiento del jugador. Un cliente le dirá al servidor que el jugador ha movido su posición. Luego, el servidor les indicará a todos los demás clientes que actualicen sus posiciones asociadas para el cliente movido.

3.2.6 SERVIDORES MULTIJUGADORES

Mientras que el cliente representa la copia del juego de cada jugador, el servidor se asegura de que todos los clientes conectados estén jugando la misma copia del juego. Los servidores a menudo restringirán los cambios que aceptan de los clientes. Por ejemplo, imagina que escribimos un truco para cambiar nuestro dinero en un juego. Si es un juego multijugador, el servidor rechazará nuestros cambios. Esta es la razón por la que los trucos para un solo jugador a menudo no funcionan en el modo multijugador.

Hablaremos más sobre los fundamentos del modo multijugador en una lección futura.
 
Última edición:
AdBlock Detectado

Lo sentimos, los anuncios son molestos!

Claro, el software de bloqueo de anuncios hace un gran trabajo al bloquear anuncios, pero también bloquea funciones útiles de nuestro sitio web. Para obtener la mejor experiencia en el sitio, deshabilite su AdBlocker.

He desactivado AdBlock    No, gracias