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)
-
paradigma de programación en el que el flujo del programa es guiado por los eventos que suceden sobre su interfaz gráfico, señales de sensores o mensajes de otros programas o hilos. [Adaptado de Wikipedia]
-
las aplicaciones dirigidas por eventos típicamente consisten de un loop principal (event loop) que escucha eventos e invoca una función de callback. Ejemplo: cuando ocurre el evento de click en el menu "Help-About" se invoca una función que muestra una caja con el mensaje sobre la versión del programa.
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
-
KERNEL32.DLL : provee acceso a funciones de manejo de memoria, operaciones I/O, creación de procesos e hilos. Muchas de sus funciones a su vez incocan otras funciones contenidas en la librería NTDLL.DLL
-
GDI32.DLL: funciones para realizar gráficos low-level, output de texto, manejo de fuentes (fonts).
-
USER32.DLL: funciones para la creación y manejo de elementos del GUI de windows (ventanas, menus). Aquí viven las funciones para recibir mensajes de los diferentes controles o acciones, para crear message boxes, etc. Muchas de estas funciones invocan funciones del GDI32 para realizar el rendering de los elementos gráficos.
-
COMCTL32.DLL: funciones para controles comúnes de Windows, "File Open", "Save", progress bars, y list views.
-
IMM32.DLL : Input Method Manager
Strings:
- Pueden que estén en unicode: 16bit por caracter.
- Afortunadamente los caracteres ASCII usan un código unicode 0x00(codigo ASCII)
- 'A' en ASCII: 0x41
- 'A' en unicode: 0x0041
strings --encoding=l Win32Project1.exe