Dia 07

Segun trato de resolver los ejercicios de reverse engineering me doy cuenta que la mejor forma de prepararse (aparte de la práctica) es familiarizarse con la creación de las aplicaciones. Por ejemplo, me resulta difícil tratar de hacer reverse engineering a una aplicación de Win32 si no recuerdo cómo se estructuran esas aplicaciones.

Programación dirigida por eventos (event-drive programming)

eventDrivenLoop.png

Figura tomada de https://courses.cs.washington.edu/courses/cse331/13sp/lectures/lect24-events.pdf

Los siguientes ejemplos de un programa en Win32 vienen de este tutorial

Al programar para Win32, una de las primeras cosas que debe hacer un programa es establecer la función que procesará los eventos de la aplicación.

El siguiente es un trozo de la función WinMain:

WNDCLASSEX wcx; // WINDOW class information

wcx.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ; // Class styles
wcx.lpfnWndProc = (WNDPROC)MainWndProc;        // Pointer to the callback procedure

Cada control (ventana, botón, etc.) es creado usando una función que establece algunas de sus propiedades (posición, nombre, padre).

// Create the window
hwndMain = CreateWindowEx(0, //Extended window style
                          "Lesson2", // Window class name
                          "Lesson 2 - A simple win32 application", // Window title
                          WS_OVERLAPPEDWINDOW, // Window style
                          CW_USEDEFAULT,CW_USEDEFAULT, // (x,y) pos of the window
                          CW_USEDEFAULT,CW_USEDEFAULT, // Width and height of the window
                          HWND_DESKTOP, // HWND of the parent window (can be null also)
                          NULL, // Handle to menu
                          hInstance, // Handle to application instance
                          NULL); // Pointer to window creation data

La función que hemos asignado para que responda a los mensajes se llama MainWndProc. Típicamente consiste de un switch con case's para cada uno de los mensajes a los que deseamos responder.

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
    switch (msg) {
        case WM_DESTROY: // User closed the window
            PostQuitMessage(0);
            break;

        case WM_LBUTTONDOWN:
            pt.x = LOWORD(lParam);
            pt.y = HIWORD(lParam);
            wsprintf(str, "Co-ordinates are\nX=%i and Y=%i",pt.x,pt.y);
            MessageBox(hwnd, str, "Left Button Clicked", MB_OK);
            break;

        default: // Call the default window handler
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }
    return 0;
}

Algunas librerarias compartidas en programas Windows

Strings: