Dll (Dynamic Load Library)
Bueno, en este space quize empezar con algunos tutoriales de programación, no c porque, quiero compartir un poco del conocimiento que he adquirido xD, bueno, el primero de estos tutoriales sera hablar sobre las famosas Dlls. Para empezar tenemos que saber que es una dll, Dll significa Dynamic Load Library (Librería de enlace dinamica) que es esto? es simplemente una variante de archivo ejecutable, tiene su punto de entrada y codigo, tabla de importaciones y exportaciones, la diferencia radica, en que no puede ejecutarse asi mismo como un exe convencional, son una especie de pedazos de ejecutables. Entonces cual es la utilidad de las dlls? Bueno pues una dll al incluir codigo y funciones, se puede ensamblar a un exe previamentejecutarlas, =O ahora tiene sentido el uso de una dll, seri creado, sin que haya sido programado en el mismo lenguaje, un ejecutable puede importar sus funciones contenidas y ea como un ensamblaje de un automóvil, se crean sus partes y al final se unen. Ahora bien, la dll puede ser usada por un proceso de diversas maneras, pero la mas comun es mediante la api LoadLibraryA contenida en la dll Kernel32.dll, ahora bien que es una api? Bueno, una api significa Application Programming Inteface (Interface de programación de Aplicaciones), una api es una funcion que interactua con el sistema operativo, exportada en una dll. El sistema operativo Windows tiene todas sus funciones en distintas dlls, pero las mas importantes estan en las librerias: kernel32.dll, advapi.dll, user32.dll, ntdll.dll, asi pues estas dlls contienen funciones que el sistema operativo llama para invocar a otras funciones de mas bajo nivel en el sistema, esas funciones nos “facilitan” el trabajo en pocas palabras, y esas son las que usaremos para interactuar con el sistema operativo. Como mencionamos anteriormente, se usa la api LoadLibraryA para cargar una dll, al invocarla, “ensamblara” la dll en nuestro proceso y lo posicionara de tal manera que ya esten todas sus funciones listas para usarse. Asi pues una vez que usemos LoadLibraryA, ya podremos usar las funciones contenidas en la dll y ser usadas por nuestro proceso. Ahora nos preguntaremos, como usar esas funciones?, pues facil, tendremos que hacer uso de punteros a funciones, y la api GetProcAddress:
/*Declaramos el prototipo funcion*/
typedef void (*TFuncion1)(void);
/*Definimos la funcion*/
TFuncion1 Funcion1;
/*Cargamos la dll y almacenamos su direccion base*/
HMODULE DllHandle=LoadLibrary(“Nombredeladll.dll”);
/*Una vez obtenido la base procedermos al uso de GetProcAddress*/
PVOID Direccion=(void*)GetProcAddress(DllHandle, “Funcion1”);
/*Una vez obtenida la direccion de la funcion, la almacenamos en el puntero*/
Funcion1=(TFuncion)Direccion;
/*Una vez que la funcion tenga su direccion almacenada ya la podemos invocar =D*/
Funcion1();
Recordemos que esto unicamente lo podremos hacer cuando la funcion este exportada, de otro modo tendremos que buscar el punto de entrada de la funcion nosotros mismos.
Pero se preguntaran tambien, que pasaria si en vez de que tenga funciones exportadas, la dll ejecute codigo al ser cargada? Pues eso tambien se puede, pero tenemos que indicarle a la dll un punto de entrada opcional llamado DllMain:
BOOL __stdcall DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Analizemos este codigo, primero, la primera linea indica el punto de inicio de la dll, hModule recibe la direccion base donde esta cargada nuestra dll, Reason contiene el codigo que indica la razon de la dll al ser cargada, pueden ser cuatro rezones:
ProcessAttach: Esta ocurre cuando la dl les cargada totalmente en el proceso.
ThreadAttach: Esta ocurre cuando un nuevo thread es creado en el proceso al momento que la dll haya cargado en el proceso
ThreadDetach: Es lo contrario de la razon anterior, y es usada con fines de limpieza de memoria.
ProcessDetach: es lo contrario de processattach y ocurre cuando la dl les descargada del proceso, asi podremos ejecutar las acciones necesarias para limpiar completamente el proceso de la dll.
Ahora bien, si queremos que al cargar nuestra dll se ejecute ciertas funciones unicamente lo que tenemos que hacer es poner nuestro codigo dentro del case DLL_PROCESS_ATTACH:
BOOL __stdcall DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL, “Hola xD”, “O_O”, NULL);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
En el codigo anterior, la dll al ser cargada ejecutara un cuadro de mensaje que diga hola xD. Asi en esa razon se pueden invocar otras funciones internas de la dll u otras acciones.
Pero que tal si queremos ejecutar esas funciones en otro proceso que no sea el nuestro? Parace interesante, pero eso lo veremos en el proximo articulo = )
No hay comentarios:
Publicar un comentario