Nuevo Ejemplo programacion Hack 2, C#

Tema en 'Knight Online' iniciado por ZeusAFK, 14 Abr 2012.

Estado del tema:
Cerrado para nuevas respuestas
  1. Zeu

    ZeusAFK
    Expand Collapse
    Hack Developer Moderador

    Mensajes:
    338
    Me Gusta recibidos:
    44
    Hola amigos, continuando con esto de la programacion hack he decidido de aqui en adelante utilizar C#.NET ya que me parece mas facil de explicar que VB al ser mas explicito el lenguaje mismo.
    Utilizare Visual Studio 2010 para los ejemplos.

    Primeramente como en el ejemplo anterior para "interferir" con un proceso necesitamos obtener un process handle, para esto utlizaremos funciones que nos brindan las mismas librerias de windows como kernel32.dll y user32.dll:

    IMPORTANDO LIBRERIAS

    Código:
            [DllImport("user32.dll")]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
     
            [DllImport("user32.dll", EntryPoint = "FindWindowA")]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
     
            [DllImport("kernel32.dll")]
            public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
    * Se esta accediendo a 2 funciones de la libreria user32.dll y una de kernel32.dll, el entender esta sintaxis queda de parte de ustedes, en microsoft pueden encontrar mucha referencia al respecto.

    * Para poder usar DllImport deberan agregar el namespace System.Runtime.InteropServices a su proyecto (formulario o clase):
    Código:
    using System.Runtime.InteropServices;
    Un poco de informacion de estas funciones sacada de microsoft:

    FindWindow
    Retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. This function does not perform a case-sensitive search.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

    GetWindowThreadProcessId
    Retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522(v=vs.85).aspx

    OpenProcess
    Opens an existing local process object.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx

    Recomiendo que lean bien la documentacion y entiendan los tipos de retorno de estas funciones y de ya tener en mente que si quieren avanzar en temas de programacion hacking tienen mucho que leer :)

    IMPLEMENTANDO FUNCIONES

    Ahora implenentaremos metodos para utilizar lo que hemos importado:
    Código:
            public int GamePID;
            public IntPtr GameProcessHandle;
            public IntPtr GameWindowHandle;
     
            public bool GetGamePID(IntPtr Handle)
            {
                GamePID = 0;
                GetWindowThreadProcessId(Handle, ref GamePID);
                return (GamePID != 0);
            }
     
            public bool GetGameProcessHandle(int GamePID)
            {
                GameProcessHandle = OpenProcess(0x1f0fff, false, GamePID);
                return (GameProcessHandle != IntPtr.Zero);
            }
     
            public bool GetHandle(string WindowName)
            {
                GameWindowHandle = FindWindow(null, WindowName);
                return (GameWindowHandle != IntPtr.Zero);
            }
    OBTENER PROCESS HANDLE

    Ahora utilicemos las funciones que acabamos de implementar:

    Código:
            public bool AttachProccess(string WindowsName)
            {
                GameWindowName = WindowsName;
                if (GetHandle(GameWindowName))
                    if (GetGamePID(GameWindowHandle))
                        if (GetGameProcessHandle(GamePID))
                            return true;
                return false;
            }
    Con esto ya tenemos nuestro metodo principal para adjuntarnos a un proceso al cual le pasamos como parametro el nombre de la ventana del cliente de knight online del cual queremos obtener el process handle.

    ADJUNTANDO A UN CLIENTE DE KNIGHT ONLINE

    Este es el ultimo paso para que podamos comenzar :)
    crearemos un boton (button)(suponiendo que estamos trabajando con windows forms ya que tambien puede implementarse en consola dependiendo de la imaginacion de ustedes) y utilizamos nuestro metodo anterior:
    Código:
            private void btnStart_Click(object sender, EventArgs e)
            {
                if (AttachProccess(txtWindowsName.Text))
                    MessegeBox.Show("Tenemos el Process Handle! \n " + Convert.ToString(GameProcessHandle));
            }
    LEYENDO UN VALOR DE MEMORIA (HP y MP)

    Pero antes de hacer eso hay unos conceptos que es bueno tener en claro:

    * Todo dato utilizado por una aplicacion se encuentra en una seccion de la memoria identificada por una direccion de memoria(apartir de aqui "address").

    * DMA (Dynamic Memory Allocation), en algunas aplicaciones (knight online) se utiliza este metodo para proteger las secciones de memoria de la aplicacion ubicando los datos en memoria siempre en un address diferente pero basandose en una logica para que la misma aplicacion logre ubicarlos, en knight online sera "Pointer + Offset = Address".

    * Pointer (Puntero), es una direccion de memoria que no cambia de ubicacion a pesar del DMA(refiriendose a pointers estaticos ya que tambien los hay dinamicos), utilizaremos algunos de estos Pointers para encontrar los address que necesitemos.

    * Offset (Desplazamiento), es la distancia (numerica y lo trabajaremos en hexadecimal la mayoria de las veces) entre una direccion de memoria a otra.

    Para encontrar direcciones de memoria se puede utilizar cheatengine, memoryhack, ollydbg entre otras aplicaciones, ya abra otro tutorial de esto.

    Para encontrar los address en que se encuentran el HP y MP utilizaremos un pointer bastante relacionado a informacion del personaje, por esto llamado PTR_CHR (Character Pointer)

    Código:
            public int PTR_CHR = 0xC2DD10;
    pero esta es la direccion del pointer, necesitamos saber a donde esta apuntando en esta ocacion ya que siempre apuntara una direccion diferente.
    Código:
            public int AddressPointer;
            AddressPointer = ToInt32(ReadMemory(new IntPtr(PTR_CHR)));
    Ahora que ya tenemos la direccion a la que apunta nuestro character pointer podemos buscar la direccion de memoria del HP:
    Código:
            public int CharHP()
            {
                return ToInt32(ReadMemory(new IntPtr(AddressPointer + 0x5F4)));
            }
    * Noten que ahi a la direccion de character pointer estoy sumando (me estoy desplazando) 0x5F4 o lo que seria en decimal 1524 direcciones de memoria la cual sera siempre la logica de donde se encuentra ese valor ("siempre" en el parche actual ya que en los parches se cambian las direcciones y hay que volver a encontrarlas :))

    De la misma manera el MP y la explicacion es la misma que para HP:
    Código:
            public int CharMP()
            {
                return ToInt32(ReadMemory(new IntPtr(AddressPointer + 0x9C8)));
            }
    para utilizar estas funciones y ver que datos nos devuelven podemos utilizar algo como esto:
    Código:
            MessageBox.Show("HP: " + CharHP().ToString() + "\n" + "MP: " + CharMP().ToString());
    Espero tengan una buena lectura investigando y hagan sus pruebas, dudas sobre las funciones utilizadas posteenlas y con gusto les respondere.

    Buen dia.
     
  2. LAC

    LACUCA
    Expand Collapse
    Teniente Coronel

    Mensajes:
    1.870
    Me Gusta recibidos:
    101
    buen post nero :cool:
     
  3. Zta

    Ztar
    Expand Collapse
    Sargento

    Mensajes:
    345
    Me Gusta recibidos:
    13
    Buena info
     
Estado del tema:
Cerrado para nuevas respuestas

Compartir esta página