[Tutorial] Como crear un Trainer en C++ ~ Source Trainer v65

Tema en 'Temas Archivados' iniciado por cerebrho, 20 Oct 2010.

Estado del tema:
Cerrado para nuevas respuestas
  1. cer

    cerebrho
    Expand Collapse
    Cabo

    Mensajes:
    144
    Me Gusta recibidos:
    0
    Bueno debido que hay curiosidades sobre como poder armar un trainer y son pocas las guias en español y no hay mucha informacion la cual nosotros podamos entenderlas os mostrare un poco aqui. Todo lo que mencionare sera sacado de algunos conceptos y de una guia la cual voy a complementarlo.

    INTRODUCCIÓN
    Hola a todos. En esta ocasión vamos a aprender un poco de programación Windows bajo el lenguaje C++ utilizando la API Win32.
    Este es un tema muy poco tratado, por lo tanto la documentación que existe en español es muy escasa, y la mayoría se limita solo a explicar de forma muy abstracta, por lo que nos podemos quedar perdidos un poco al tratar de entender.
    Antes de empezar debo advertir que necesitaras un nivel intermedio de conocimiento del lenguaje C/C++ para poder comprender al 100%. ¿Por qué? Simplemente porque a pesar de que veamos grandes cantidades de líneas y algunas palabras raras y desconocidas, no deja de ser lenguaje C++ en ningún momento. Y sigue la misma estructura que un programa en modo Consola, con pequeñas diferencias que veremos a lo largo de este tutorial.
    [Sólo los usuarios registrados pueden ver los enlacesInscríbase Aquí]
    API DE WINDOWS
    Una API (Application Programming Interface) es un conjunto de funciones, librerías, métodos e instrucciones que nos ofrece un programa para poder programar sobre él. En esta ocasión, el sistema operativo Windows, como todo buen S.O., necesita ofrecer a sus desarrolladores todas las funciones indispensables para así hacerle la vida más fácil a la hora de programar el software. Ejemplos claros de la API de Windows son por ejemplo los eventos de las ventanas (cerrar, minimizar, maximizar, restaurar), son funciones que ya vienen programadas y el desarrollador solamente se encarga de manejarlas.

    CONCEPTOS BASICOS DE PROGRAMACION WINDOWS
    Elementos de una ventana

    Una de las características más importantes de todos los programas Windows, es que están formados por ventanas (de ahí el nombre Windows). Pero lo que no muchos saben, es que todos los elementos de un programa son ventanas, un botón de comando es una ventana, una caja de texto también es una ventana, una etiqueta también, en fin, todo lo que vemos está formado por ventanas. Veamos los elementos básicos de un programa:

    [​IMG]

    En la barra de título se puede apreciar, a parte del título de la aplicación, su icono de identificación y los botones predefinidos minimiza, maximizar/restaurar y cerrar, los cuales vienen implícitos con el borde de ventana.

    Programas Windows y el Sistema operativo

    Cuando escribimos un programa Windows, éste pasa a ser ‘controlado’ por el sistema operativo. Es decir, nuestro programa no tratará directamente con el hardware, y todo lo que haga el programa pasara primero por el núcleo de Windows, y éste será quien decida qué hacer.
    Para entenderlo más fácilmente, existen dos formas de programar para un sistema operativo: Modo Usuario y Modo Kernel. En el segundo modo, es donde si se tiene acceso al hardware, es en el cual se escriben los controladores para que funcionen los distintos dispositivos correctamente. Programar en dicho modo, es un poco más complicado, ya que se requiere también conocimiento de lenguajes de más bajo nivel y conocer la estructura de hardware a detalle. Los errores que se cometan en ese modo no los puede manejar el sistema operativo, y en ocasiones tiene que detener todo y provocar alguna excepción para no dañar el equipo, en el caso de Windows, una pantalla azul apagando el sistema dando los detalles del error.
    Por esta razón, existe el modo usuario o modo protegido, aquí como mencioné antes, es el sistema operativo quien toma las decisiones, y nosotros nos encargamos de programar que es lo que queremos hacer. Al producirse algún error, simplemente el sistema nos lo informa y cierra el programa conflictivo.

    Windows y los Eventos


    Programar en Windows sigue la metodología de la programación orientada a eventos, esto quiere decir, que al ejecutar un programa, éste se queda esperando que algún evento ocurra y así poder decidir qué hacer. La mayor parte del código fuente de un programa Windows está enfocada en procesar estos eventos, los cuales pueden ser provocados por el usuario, por el mismo programa ó por un programa tercero.

    Mensajes

    Un evento en Windows ocurre por ejemplo, al dar clic izquierdo en el mouse, al presionar cierta tecla, o cuando un contador llega cero. Windows graba cada evento en un mensaje, el cual es almacenado en una cola de mensajes para ser procesado por la función de nuestro programa encargada de ello. Un mensaje es como llama Windows a cada evento o acción realizada y que tiene que ser procesada por el programa, es decir, al producirse un mensaje, el programa ejecuta el código asociado a ese mensaje, y después regresa el control al sistema operativo, pero el programa sigue activo esperando más mensajes, y no terminará hasta que reciba el mensaje de que debe cerrarse.

    Función WindowsProc()

    Todo programa Windows, necesita una función específica la cual se encargará de procesar los mensajes. Esta función es comúnmente llamada WindowsProc() o wndProc(), aunque no requiere un nombre especifico, ya que se asigna a través de un puntero cuando se crea y registra la ventana, pero es conveniente seguir el estándar para poder identificar esta función rápidamente en caso de un programa muy extenso.
    Afortunadamente, no es necesario escribir un código para todos los mensajes que puedan ocurrir, solamente para los que realmente vamos a necesitar, es decir, si no necesitamos el click derecho, no es necesario manejar ese mensaje, todos los mensajes no filtrados son procesados al final sin ejecutarse ningún código la realizar la acción.

    Tipos de Datos Windows

    Para facilitarnos un poco más la programación, Windows define algunos tipos de datos especiales usados específicamente por la API, estos son:

    [​IMG]

    Las únicas palabras que nos pueden parecer nuevas de esta tabla serian: manejador e instancia.
    Como menciona la tabla, un handle (manejador), no es más que un en número entero de 32 bits. ¿Para qué se usa? Para identificar un objeto de todos los que residen en memoria, es decir, viene siendo un número único que distingue un objeto de otro. Estos los asigna el sistema operativo por cada objeto nuevo creado en memoria.
    Por ejemplo, al ejecutar la calculadora de Windows, el programa se abre y dibuja una ventana con muchos botones y una etiqueta para mostrar los dígitos. Ahí, la ventana principal de la calculadora tiene su propio handle, cada botón también tiene el suyo, así como la etiqueta. Esto ayuda, por ejemplo a la hora de programar, saber que ventana envió algún mensaje, o para saber a qué objeto o ventana el sistema va a devolver un resultado. Lo veremos más adelante con un ejemplo para que quede totalmente claro el concepto y utilidad de los manejadores.
    Lo que es una instancia, lo veremos más adelante en el ejemplo, pero se puede resumir como un programa ejecutándose ya en la memoria. Por ejemplo al abrir un programa y visualizar su pantalla, ya tiene su instancia, ya depende de nosotros si dejamos que se puedan crear tantas instancias del mismo programa o solo una a la vez.


    Notación estándar en programas Windows.


    Para poder ajustarnos a una buena práctica de programación, es recomendable utilizar prefijos a la hora de crear las variables, Microsoft recomienda utilizar la notación húngara para el desarrollo de programas Windows, es una forma sencilla de declaración de variables, que consiste en utilizar un prefijo, seguido del nombre de la variable, altamente recomendado que tenga relación con el uso que se la va a dar a la variable. Esto hará más fácil la modificación del programa en el futuro, así como una mejor comprensión del código para programadores terceros.

    [​IMG]

    Y así fácilmente podremos crear los nombres de las variables, para poder identificarla
    HANDLE hInstance;
    DWORD dwIntensidad;[/PHP]


    ESTRUCTURA DE UN PROGRAMA WINDOWS

    Para poder escribir el programa mas pequeño basado en la API de windows, necesitarás principalmente dos funciones:



    • WinMain() Función principal con la que inicia el programa, es el equivalente a main() de los programas en modo consola. Es importante mencionar que la función debe llamarse exactamente así y no puede llevar otro nombre, lo que si podemos cambiar libremente son el nombre de sus parametros (pero no sus tipos).
    • WindowsProc() Función encargada de procesar los mensajes, su nombre puede ser modificado, pero no lo recomiendo para facilitar su identificación. Dependiendo de los mensajes, podria llegar a ser la función más grande del programa.

      Lo interesante de ésto, es que a pesar de que con solo esas dos funciones podemos realizar un programa, éstas no estan conectadas entre sí, es decir, WinMain() no manda llamar a WindowsProc(). Lo que en realidad sucede es que al crear una ventana dentro de WinMain(), uno de los parametros de la función que la crea es elegir la función encargada de procesar los mensajes. Entonces el sistema operativo, es el encargado de mandar llamar la función WindowsProc() cuando es necesario, una preocupación menos ^_^

      [​IMG]

      Bien, una vez que haya quedado claro lo anterior, llega la hora de escribir el código y empezar a practicar lo aprendido. Pero, solo una cosa más... como sabe el compilador los nuevos tipos de datos, y esos nombres de funciones que no estan en el estandar... Respuesta: windows.h

      En el archivo de cabecera windows.h, se encuentran declaradas otras cabeceras importantes para que funcionen los programas basados en windows, por ejemplo: winbase.h, winuser.h, wingdi.h, winerror.h entre otras más, que por ahora no es necesario conocer a fondo. Pero que contienen funciones como WinMain() GetMessages() TranslateMessages() DispatchMessages() que como mencioné son indispensables para escribir nuestro programa.


    NUESTRO PRIMER TRAINER

    Vamos a

    Archivo > Nuevo > Proyecto

    [​IMG]

    Luego seleccionamos Visual C++ y buscamos Proyecto Win32 y le asginamos un nombre a nuestro proyecto y le damos Aceptar.

    [​IMG]Esta imagen a sido reducida. Pulse en la barra para ver la imagen de tamaño original. La imagen original es de tamaño 698x484.[​IMG]

    Luego aparecera una nueva ventana la cual nosotros selecionaremos la opcion de Configuracion de la Aplicacion y marcamos Biblioteca de vinculos dinamicos y Proyecto Vacio y pasamos a darle Finalizar.

    [​IMG]

    Luego de eso nuestro proyecto estara listo para comenzar a estructurarlo, la cual comenzaremos creando nuestra GUI.

    Archivos de recursos > Agregar > Recurso

    [​IMG]

    Luego se abrira una nueva ventana y seleccionamos DIALOG y presionamos ENTER.

    [​IMG]

    y Listo comenzaremos armar nuestra GUI

    [​IMG]


    Comenzaremos cambiando el nombre de nuestro trainer por defecto siempre con DIALOG, haremos lo siguiente damos click en titulo que es Dialog y le damos click izquierdo y seleccionamos propiedades y se abrira una ventana de propiedades la cual buscaremos la opcion CAPTION y cambiamos el nombre por GamerzHacking.

    [​IMG]Esta imagen a sido reducida. Pulse en la barra para ver la imagen de tamaño original. La imagen original es de tamaño 1024x768.[​IMG]

    Listo ahora comenzaremos a utilizar nuestra barra de herramientas, vamos a la pestaña VER > CUADRO DE HERRAMIENTAS.

    [​IMG]

    y seleccionamos la herramienta Group Box

    [​IMG]

    y lo ponemos asi, bueno yo aqui ya le cambie el nombre, ustedes pueden cambiarlo pues ya les mostre como pueden hacerlo.

    [​IMG]

    Ahora pasamos agregar Check Box que sera para marcar y descarmar nuestro hack, vamos nuevamente a nuestra Ventana de Herramientas y esta vez escogemos la herramienta Check Box.

    [​IMG]

    Lo colocamos en nuestro DIALOG y le cambiamos el nombre dependiendo que hack sea.

    [​IMG]

    Listo hasta aqui ya tenemos listo nuestra interface, ahora pasaremos a codearlo, asi que volvemos a nuestro explorador y en la parte de Archivos de Codigo Fuente damos click derecho y vamos Agregar > Nuevo Elemento.

    [​IMG]


    y se abrira una ventana para agregar un nuevo elemento.

    Vamos a Codigo > Archivo C++ (.cpp) > Le asignamos un nombre > Luego damos ACEPTAR.

    [​IMG]Esta imagen a sido reducida. Pulse en la barra para ver la imagen de tamaño original. La imagen original es de tamaño 700x462.[​IMG]

    Una vez hecho esto vamos a nuestro explorador de soluciones y dentro del (.CPP) comenzamos a codear nuestro trainer.

    Les brindare un source la cual les sera mas sencillo de entender la cual les voy a explicar.

    1. Parchando memoria.

    Por ejemplo para el No Activation Blink GodMode (NA BGM) en la parte de PROTOTIPOS DE FUNCION se ubica el "bool
    GodMode(bool);".

    Luego en la parte de BOOLEAMOS se ubicara el "UINT bGodMode;".

    Ahora la direccion que vamos a cambia cada vez que MapleStory actualize se encontrara en la parte de ADDRESS

    Cita:
    DWORD GMADDY = 0x00899260; //GodMode
    Bueno ahora les explicare algunos puntos anteriores, en la parte de PROTOTIPOS hemos definido la funcion que se encargara de hacer el hack para el NA BGM, ojo recuerda que solo se ha definido nada mas.

    Ahora en la parte de BOOLEAMOS el "UINT bGodMode;" es una variable que usaremos para saber si hemos echo click en el checkbox correspondiente al GodMode.

    Ahora el DWORD GMADDY = 0x00899260; //GodMode, es la variable que contiene la posicion de memoria que debemos modificar para realizar el hack.

    Detalles

    DWORD = 4 Bytes
    GM = Es un prefijo de GodMode

    Bueno como sabran algunos estamos agregando codigos ASSAMBLER a C++ la cual siempre debemos anteponer un "0x" la cual se dira que la direccion de memoria es solo 00705875 y que son de 4 Bytes

    Cita:
    00(1)70(2)58(3)75(4)
    Ahora observemos el script del NA BlinkGodMode

    Cita:
    //No Activation Blink Godmode v2
    //Converted from TWMS to eMS v58 by Ant3
    [enable]
    00899260: //85 C0 7E 28 8B CF E8 27 05 D1 FF 8B F8 83 EF 1E
    db eb 0b

    [disable]
    00899260:
    db 85 c0
    Ahora se daran cuenta que nuestro GMADDY es el siguiente valor 00899260, ¿Correcto?

    Ahora si observan bien los opcodes dice eb 0b que es para habilitar el hack y el 85 c0 es para deshabilitar el hack ¿cierto?

    Bueno ahora realizaremos la funcion de nuestro NA BGM.

    Cita:
    bool GodMode(bool status)
    {
    if (status == true) {
    *(BYTE*)GMADDY = 0xEB;
    *(BYTE*)(GMADDY+1) = 0x0B;
    }
    else if (status == false) {
    *(BYTE*)GMADDY = 0x85;
    *(BYTE*)(GMADDY+1) = 0xC0;
    }
    return true;
    }
    Bueno ahora ya les va quedando algo mas claro sobre como esta estructurado nuestro trainer.

    Recuerden que "bool GodMode(bool status)", recibe una variable llamada STATUS que me indica cuando se ha presionado el CHECKBOX, ahora sigamos observando y veamos este codigo.

    Cita:
    if(wParam == IDC_GODMODE){

    bGodMode = IsDlgButtonChecked( hwndDlg, IDC_GODMODE );
    if (bGodMode == BST_CHECKED)
    {
    GodMode(true);
    }
    else if (bGodMode == BST_UNCHECKED) {
    GodMode(false);
    }
    return false;

    }
    Cita:
    // Se ejecuta esto si hemos hecho click en la casilla
    if (bGodMode == BST_CHECKED)
    {
    GodMode(true);
    }
    //Sino es asi se ejecutara esto si hemos desmarcado la casilla
    else if (bGodMode == BST_UNCHECKED) {
    GodMode(false);
    }
    Ahora espero que esto les halla quedado algo mas claro sobre como es la estructura de un trainer para MapleStory o para cualquier otro juego.

    Cita:
    El bGodMode = IsDlgButtonChecked( hwndDlg, IDC_GODMODE );
    donde estoy preguntando si LA CAJITA ha sido CHECKED(MARCADO)
    el nombre de la cajita es IDC_GODMODE
    y el resultado (si esta marcado o no) se guarda en bGodMode
    y si ESTA MARCADO EL HACK DE GODMODE


    NOTA: Pueden publicar este tutorial donde sea con los respectivos creditos, sin modificar nada ^^!

    Creditos
    CarlosJavier por el Tutorial
    Google por la informacion que recopile sobre WINAPI
    NelSon Ortiz por cambiar el estilo del tutorial de Carlos xD!jeje!

    [​IMG]
     
  2. Roy

    RoyKamus
    Expand Collapse
    Sargento

    Mensajes:
    205
    Me Gusta recibidos:
    0
    Bien explicado el trainer yo lo iba a postear pero por time no lo hice asi que con esto ya tienen una idea de como se hace un trainer mejorcito !
     
  3. mec

    mecorrocata
    Expand Collapse
    Subteniente

    Mensajes:
    472
    Me Gusta recibidos:
    1
    Apoyo a este tema, No hay ningun tema relacionado con esto, Deveria ir a Adherido,
    Saludos:arriba:
     
  4. Ama

    Amateratsu
    Expand Collapse
    Mayor
    Usuario VIP

    Mensajes:
    811
    Me Gusta recibidos:
    30
    Bien por Nelson!
     
Estado del tema:
Cerrado para nuevas respuestas

Compartir esta página