GodSys

GodSys
El Poder de la Programación

miércoles, 17 de febrero de 2010

C++: Buscaminas (editando valores)

Antes de empezar con este tuto quiero que lean la publicación anterior para tener una idea de lo que es una dirección de memoria y los valores que contienen. Para qué sirven y qué se puede hacer.

Bueno..si ya lo leyeron ahora vamos a basarnos en la programación en el lenguaje C++ pero dentro del ámbito de las direcciones de memoria y su edición.

Bien. Seguiremos con el Buscaminas e intentaremos editar el valor que está en la dirección de memoria del tiempo, pero a través de un programa compilado por nosotros.
Comencemos:

Necesitamos:
>>Un compilador de C++ y un IDE. Podría ser Dev-C++ que viene con el compilador "gcc"(descargar de aquí) o Code::Block con la implementación de MinGW.
>>Ganas de aprender a programar.

EMPEZANDO A PROGRAMAR
Abrimos el Dev-C++ o el IDE que estén usando para programar y vamos a crear un proyecto nuevo (buscar información acerca del Dev-C++ para crear proyectos (es muy fácil!)). Ya tenemos el proyecto, sólo nos falta comenzar a escribir las líneas de código que darán origen a nuestro programa.
Okey! Todo bien hasta acá! Para programar la aplicación que nosotros queremos vamos a hacer uso de las famosas APIs de Windows, es decir, las funciones de las DLLs de Windows.
Empezamos a programar:

#include "windows.h"
#include "stdio.h"


Donde vemos las comillas (") debemos reemplazarlas por un "<" al principio, en la primera comilla, y un ">" a lo último, en la segunda comilla. O sea, que la palabra windows.h y stdio.h queden encerradas por un "<" (sin las comillas) al principio y otro ">" (al final).

Con esto incluímos las bibliotecas necesarias para comenzar a utilizar las APIs de Windows, se requiere sí o sí.
Bueno, vamos ya al código completo y lo explicaremos parte por parte:

#include "windows.h"
#include "stdio.h"


int main()
{
int n = 24;
DWORD pid;
HANDLE process;
HWND wnd = FindWindow(0, "Buscaminas");

GetWindowThreadProcessId(wnd, &pid);
process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

WriteProcessMemory(process, (LPVOID)0x0100579C, &n, 8, NULL);

CloseHandle(process);

return 0;
}


EXPLICACIÓN DEL CÓDIGO
>>int main() -> Inicio del programa. Todo programa hecho en C++ comienza igual
>>{ -> Llave de comienzo. Indica que el código que se escriba este esta llave y la Llave de cierre va a ser lo que conformará al programa y su inicio.
>> int n = 24; -> Declara una variable "Integer", es decir, que contiene un número decimal. Llama a la variable como "n" y coloca el valor "24" dentro de la misma. Ese valor será el que colocaremos, por medio de las APIs, dentro de la dirección de memoria del tiempo del Buscaminas.
>> DWORD pid; -> Declara una variable característica de Windows. La variable pasa a llamarse "pid" que hace referencia a "Process ID", es decir, el ID del procesos del Buscaminas que será abierto para guardar en "pid" el ID del proceso.
>> HANDLE process; -> Otra variable característica de Windows que declara a "process", que guardará la dirección del proceso del Buscaminas.
>> HWND wnd; -> Igual que la anterior. Pero guarda la "dirección" de una ventana que es obtenida con "FindWindow()".
>> FindWindow() -> Es una API de Windows que permite encontrar ventanas colocando el título de la misma. Ej.: FindWindow(0, "Título de ventana").
>> GetWindowThreadProcessId(wnd, &pid); -> API que encuentra el PID de un proceso a través de la búsqueda de una ventana del mismo.
>> OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid) -> Abre el procesos para escribir y leer sobre él.
>> WriteProcessMemory(process, (LPVOID)0x0100579c, &n, 8, NULL); -> API más importante para esta implementación. Escribe en la memoria del proceso cambiando un valor. Recuerdan la dirección de memoria que nos salió en Cheat Engine, la dirección de memoria del tiempo del Buscaminas, esa dirección que costo buscarla. Bueno, en esa dirección de memoria vamos a escribir para cambiar el valor del tiempo. Esa dirección era: 0x0100579c. Y ahí la tenemos, junto a ella está la variable "n", o sea, el nuevo valor que pasará a tener dicha dirección. Sencillo.
>> CloseHandle(process); -> Cerramos proceso.
>> } -> Llave de cierre. Cierra el main() del programa.

Bueno, después de que tenemos el código, compilamos con Dev-C++ -> Ctrl+F9 y el proyecto se compilará, ahora tendremos un ".exe". Ctrl+F10 y el ".exe" se ejecutará. Bien, ahora abrimos el Buscaminas y ejecutamos el programa que acabamos de crear con este código, gracias al Dev-C++ y su compilador. Y WOOOWW!!! El valor del tiempo ha cambiadooo!!!!! Investiga más sobre esta técnica y sobre el código.

Espero que lo entiendan. Estoy algo corto de tiempo, intenté explicarlo lo más claro posible. Lo expliqué con mis palabras, todos los término utilizados y definiciones son propias, lo hice "como me salió del alma". Acepto quejas!!

Si tienen alguna duda sobre el funcionamiento del agluna API busquen en Google sobre la misma, hay mucha información en Internet. Mi intención fue explicarle lo fundamental de este código, su uso, no quiero hacer un tutorial completo de C++, para eso existen millones de manuales.
Exploren, búsquen por la red los millones de manuales y tutoriales que hay sobre estos temas. Yo sólo intento dar una mano!

Gracias...
GodSys

2 comentarios:

  1. Porque usaste herramientas complicadas?
    #include "windows.h"
    #include "stdio.h"


    int main()
    {
    int n = 24;
    DWORD pid;
    HANDLE process;
    HWND wnd = FindWindow(0, "Buscaminas");

    GetWindowThreadProcessId(wnd, &pid);
    process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    WriteProcessMemory(process, (LPVOID)0x0100579C, &n, 8, NULL);

    CloseHandle(process);

    return 0;
    }

    Porque lo haces con #include
    #include y otras por el estilo, sin windows.h

    No se puede hacer mas sencillo?

    ResponderEliminar
  2. compañeros por q no se queda la ventana abierta perdon si me compila pero no puedo visualizar el proyecto

    ResponderEliminar