[TUTORIAL] ReadProcessMemory & WriteProcessMemory

c0de

Administrador
Registrado
19 Abr 2020
Mensajes
286
Hola amigos de GamerzHacking.

Este tutorial ha sido elaborado para los principiantes que recien empienzan en este mundo. Una gran parte de la piratería es leer y escribir en la memoria. Este tutorial cubrirá los conceptos básicos de cómo funcionan ReadProcessMemory y WriteProcessMemory, con suerte, aclarará las preguntas que los hackers principiantes tienen sobre él.

Primero me gustaría decir que esto va a ser extremo sobre matar. Recomiendo antes de leer esto, mire la página de MSDN en RPM (ReadProcessMemory) y WPM (WriteProcessMemory) y, si comprende, no se moleste en leer este tutorial. Enlaces:

Please, Acceder or Regístrate to view URLs content!

Please, Acceder or Regístrate to view URLs content!


Entonces comencemos.

ReadProcessMemory y WriteProcessMemory son funciones que se usan comúnmente en la creación de hacks externos. ¡Casi todos los hacks externos tienen memoria de proceso de lectura o escritura, por lo que es muy importante aprender! Veamos un pequeño código.

C++:
Please, Acceder or Regístrate to view codes content!

Vamos a repasar algunas cosas primero. Este código no hará nada porque no hay un handle para el juego que potencialmente estamos intentando piratear, por lo que hProcHandle no está definido. Otra cosa a tener en cuenta es que siempre que use ReadProcessMemory y WriteProcessMemory querrá incluir la biblioteca kernel32 porque WriteProcessMemory, ReadProcessMemory son parte de ella. No incluirlo hará que WriteProcessMemory se muestre como un error. Normalmente incluyo windows.h en lugar de kernel32 porque windows.h incluye kernel32 y otras bibliotecas como memoryapi.h y WinBase.h y estas bibliotecas tienen otras características útiles.

Entonces, el código visto arriba es encontrar el playerObjectAddress. Si estás leyendo esto, probablemente entiendas que hay un puntero estático que siempre apunta a la dirección del objeto del jugador en un juego. Dado que la dirección del objeto del jugador es dinámica cada vez que el juego se cierra y se abre, la dirección del objeto del jugador cambia, por lo que debemos leer qué señala pLocalPlayer (nuestro puntero estático que siempre apunta a la dirección del jugador) cada vez que se vuelve a abrir el juego. Este es un ejemplo perfecto del uso de RPM.

así que analicemos las RPM:

C++:
Please, Acceder or Regístrate to view codes content!

hProcHandle nuestro primer argumento en la función es nuestro identificador de la ventana desde la que estamos leyendo, en este caso sería un juego

(LPCVOID) pLocalPlayer es la variable que se lee. Toma lo que está almacenado en pLocalPlayer y lee esa dirección, por eso pLocalPlayer es de tipo DWORD, pero puede notar que hay (LPCVOID) delante de él. Esto se debe a que tenemos que escribir cast nuestra variable en LPCVOID porque RPM solo exceptúa LPCVOID para un argumento y no DWORD. También puede definir su variable como LPCVOID al principio y no escribir emitir nada. LPCVOID significa puntero constante a cualquier tipo.

&playerObjectAddress esta es la variable que vamos a usar para almacenar lo que se leyó de pLocalPlayer. El símbolo & es la dirección del operador y simplemente devuelve la dirección de la variable en la que opera.

El siguiente argumento sizeof() es cuántos bytes de datos queremos devolver o leer. sizeof(playerObjectAddress) solo dice que queremos leer 4 bytes porque playerObjectAddress es de tipo DWORD, que es de 4 bytes. Hacemos sizeof (playerObjectAddress) para que nunca tengamos que preocuparnos por devolver el número incorrecto de bytes.

El siguiente argumento lo mantenemos NULL porque es una variable que almacena la cantidad de bytes transferidos. No nos importa cuántos bytes hayamos leído y establecerlo en NULL ignora este argumento.

Desglosado, puede ver RPM como esto y también puede usar esto como plantilla al escribir código mientras comienza:

C++:
Please, Acceder or Regístrate to view codes content!

WPM es muy similar a RPM y no voy a entrar en tantos detalles. Si comprende RPM, entonces esto debería explicarse por sí mismo.

C++:
Please, Acceder or Regístrate to view codes content!

Todo es lo mismo que RPM, excepto la dirección para leer que se reemplaza con la variable que contiene la dirección de memoria en la que desea escribir. La variable que contiene la dirección en la que escribir se escribe en LPVOID y no LPCVOID.

El último cambio es que variableToStoreReadInformation se reemplaza con la variable que contiene el valor que desea escribir. Puede usar la línea de código WPM anterior como plantilla para ayudarlo a escribir su código. Mire a través de algún código fuente en esta vista e intente seguir la lógica con RPM y WPM para familiarizarse con cuándo y cómo las personas usan estas funciones en su código.

Otra cosa a destacar es que, dado que WPM y RPM son funciones, no puede dejar ningún argumento en blanco. Es por eso que escribimos NULL en lugar de saltarlo. WPM y RPM son funciones normales y por eso deben tratarse como ellos.

Creditos
wtlyons