個人檔案unrealord相片部落格清單更多 ![]() | 說明 |
|
unrealordunrealord's msn space 16 September Lo mismo... Ya van exactamente 1 año y medio que no escribo en este blog mas o menos..., ya perdi la cuenta realmente, ademas quizas no muchos lean este blog, pero en fin... solo queria escribir y desahogarme de mi estupida vida... Han pasado cosas bonitas este tiempo, conoci muy buenos amigos y pase un par de buenos momentos, pude olvidar a una mujer que me hizo mucho daño en la preparatoria y pareciera que mi vida iba a cambiar, pero no, todo es un espejismo, la alegria fue un espejismo, algo que tome prestado sin tener fondos, algo que no debi disfrutar y ahora pago las consecuencias. Tambien la amistad fue una ilusion con una fecha de expiracion, conoces nuevos amigos, te desplazan por otros, que mierda es la amistad la verdad, pero quizas no lo sea para todo el mundo, solo para mi, alguien tan insignificante a quien pueden olvidar con facilidad. Estoy harto de mi vida, quisiera morirme ahora mismo, me gustaria suicidarme pero no tengo el valor, me siento atrapado en mi, mi persona me causa dolor, mis amigos me lastiman... para acabar de hacer mi vida mas miserable, sufro de un amor no correspondido, realmente es un sufrimiento horrible, eso no me ayuda en verdad mi situacion, si mi vida era miserable ahora lo es mas... Tener que pasar todos los dias el hecho de ver a esa persona con alguien mas, es un sentimiento muy egoista lo se, es lo malo de enamorarse cuando sabes que nunca seras correspondido, duele mucho. Me gustaria morir atropellado o en algun accidente, porque soy demasiado cobarde para suicidarme... ni siquiera eso puedo hacer, todos los dias de mi vida tengo que sufrir una angustia que parece infinita, no lo soporto mas, esto no es vida... 8 July Continuacion del Blog13 December DepuracionHa pasado ya mucho tiempo, tantas desepciones me han sumergido en un mar de incertidumbre, sin embargo, se que si no me lo propongo, nunca saldre de ahi, es hora de un nuevo comienzo, ahora es cuando, a mandar a chingar a su madre todo el dolor que representa el pasado gris; ya que de no hacerlo, se mantendra adjunta a mi vida y no me dejara disfrutarla nunca. Asi como un programa existen los depuradores para corregir y eliminar errores, intentare implementar lo mismo en mi vida. Es hora de desechar todo lo malo, y cultivar lo bueno, intentar de una vez por todas ser enteramente feliz. Por eso, elimine todos los posts en este blog que hacian referencia a tristes expresiones de suicidio y descepcion, no vale la pena pensar asi en realidad, y para toda persona que disfrutaba verme asi y que lea esto, pues que sepa que ya me he levantado, no reecaere de nuevo, no mas sufrimiento, he descubierto lo que en realidad es la amistad. No es lo mismo un amigo(a) idealizado(a) que uno de verdad. En la vida real lo emulado puede ser peligroso e integralmente inestable, tal vez, hay excepciones en el mundo virtual, pero ese no es el caso. Intentare mandar a la chingada todos esos recuerdos que me han lastimado durante tantos años. Yo solo ofrezco amistad a quienes sepan demostrarmela tambien, no es del todo bueno entregarse totalmente a una persona, y lo llegue a comparar con una computadora. Una computadora sin firewall admitiendo todo tipo de trafico, esta expuesto a muchos peligros, y ataques de personas malintencionadas. Quiza en el amor sea lo mismo, aquel o aquella que se entrega totalmente esta expuesto(a) a todo tipo de ataques o de abusos inclusive sin llegar a notarlo. Ya me ha pasado eso, se de lo que hablo, por tener un corazon de pollo con aquella persona, pero no mas. En esta vida hay que ser un poco mas frio, y solo llegar a ese estado cuando se te ha demostrado algo reciproco, que sepas que aquella persona tambien esta dispuesta a hacer lo mismo por ti. Creo que es un paso de la maduracion, yo no quiero diversion somatica, yo quiero una relacion estable, no admitire perras, zorras, putas en mi vida. Estoy dispuesto a esperar lo que sea para encontrar a mi chava ideal, de preferencia que programe en C xD jaja 28 December Articulo de Programacion #2 (Parte 3)Dll Injection (Parte 2)En la pasada parte de este articulo de programacion #2 vimos algunas de las apis necesarias para realizar el cometido de una inyeccion de una dll en el contexto de un proceso remoto, ahora veremos ya la aplicacion de las mismas.
Una de las funciones vistas crucial para lograr ejecutar esta tecnica es la funcion CreateRemoteThread, esta funcion no es mas que la funcion final en la cadena de funciones para crear un hilo. CreateRemoteThread termina invocando la funcion NtCreateThread en la libreria ntdll.dll, que asu vez invoca el servicio Nt NtCreateThread en el kernel (ntoskrnl.exe) este ultimo se encarga de crear el objeto tipo Thread necesario para el manejo y funcionamiento del mismo, el objeto que es el cuerpo del hilo creado. Es asi como esta funcion recaba un manejador o handle al proceso destino, el cual obtenemos mediante OpenProcess, la cadena es algo como:
Modo usuario:CreateThread->CreateRemoteThread->NtCreateThread|Modo Kernel:KiServiceTable->NtCreateThread->PspCreateThread Ahora bien, cuando un thread se crea en nuestro propio proceso, tenemos la certeza que el codigo ejecutado va a ejecutarse de la manera como lo programamos, ya que las variables y direcciones las tenemos localizadas en el contexto de memoria de nuestro proceso de la memoria virtual. Como con un thread o hilo remoto estaremos en un contexto diferente, las direcciones que querramos acceder no contendran la misma informacion que la del contexto de nuestro proceso, incluso podrian ser invalidas, recordemos el manejo de la memoria virtual, que permite que las direcciones apunten a diferentes paginas de la memoria fisica para cada proceso, diferentes mundos distintos de memoria, apuntando a una misma memoria ram.
La tecnica de inyeccion de una dll consiste en obligar a un proceso a cargar una dll, como bien aprendimos, para cargar una dll necesitamos usar la funcion LoadLibrary, pero en este caso haremos que el proceso remoto lo use sin que lo tenga en sus planes de hacerlo =), para cumplir esto, necesitamos crear un thread alterno en su contexto, ya con esto concluimos que necesitamos de crear un thread en el proceso donde queremos que cargue la dll usando CreateRemoteThread y hacer que ejecute la funcion LoadLibraryA.
HMODULE WINAPI LoadLibrary( LPCTSTR lpFileName ); Esta funcion requiere un parametro el cual es la ruta al archivo de la dll que va a ser cargada, esa ruta debe estar escrita en alguna direccion de memoria del proceso remoto, no es lo mismo tener la cadena de caracteres en nuestro proceso, y usar esa direccion en el proceso remoto, la direccion virtual no apunta a la misma pagina de memoria fisica, por lo cual necesitamos acceder al otro proceso escribir los datos que vamos a usar. Programando en lenguaje c o cualquier otro lenguaje, hemos visto la necesidad de alojar memoria dinamicamente, segun las necesidades de nuestro programa y no tener que estar haciendo uso de muchas variables declaradas o arreglos, asi bien, se haria con un malloc usando la libreria estandar, o hasta usando la funcion new en c++; estados dos funciones al final hacen uso de la apis de windows, la cual invoca a VirtualAlloc una api para reserver o alojar nueva memoria virtual con respecto a una nueva pagina de memoria fisica tomada del directorio de paginas de la misma. En este caso necesitamos tener un espacio de memoria en el proceso remoto, para ello no podriamos usar malloc, new o VirtualAlloc, para ello windows nos ofrece otra api llamada VirtualAllocEx, esta nos permite alojar memoria en el contexto de un proceso que no sea el nuestro, es la funcion que es invocada por VirtualAlloc usando como handle NtCurrentProcess ((HANDLE)0xFFFFFFFF). Veamos la definicion de VirtualAllocEx:
LPVOID VirtualAllocEx( HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect ); Veamos los parametros de esta funcion, como ya pudimos ver en la entrada anterior, esta funcion requiere un handle o manejador al proceso donde se va alojar el espacio, este se obtiene usando OpenProcess con el ProcessId del proceso remoto, lpAddress: este parametro se indica la direccion donde queremos que se aloje la memoria, si especificamos un valor y ese espacio ya esta reservado o alojado la funcion VirtualAllocEx fallara, por lo cual, en este parametro debemos pasar 0 o NULL, de esta manera el sistema operativo usara la direccion de memoria que mas convenga y donde encuentre espacio, el siguiente parametro, dwSize especifica la cantidad de bytes que se necesitan alojar, estos se redondean al tamaño de pagina mas proximo (generalmente 4096 bytes o 4 kb), el siguiente parametro se especifica el tipo de alojamiento ya sea para reservar o para alojar, cuando es una reservacion, la memoria virtual no es accesible pero tampoco puede ser reservado otra vez (MEM_RESERVE), cuando es alojado (MEM_COMMIT) la memoria virtual es referenciada con una pagina de la memoria fisica y a partir de entonces se vuelve valida, cabe decir que una direccion de memoria no puede ser alojado sin que haya sido reservada primero, es por ello que en esta funcion por lo general se usan los dos flags combinados (MEM_RESERVE|MEM_COMMIT), el ultimo parametro es el tipo de proteccion que va a tener la pagina alojada, existen diferentes tipos de protecciones, entre las mas importantes se encuentran PAGE_READ, PAGE_WRITE, PAGE_READWRITE, PAGE_NOACCESS, PAGE_EXECUTE, PAGE_EXECUTE_READWRITE, despues se explicaran cada uno de ellos. Ahora ya explicada esa funcion necesitaremos de poder escribir en la memoria del proceso remoto, esto lo haremos con una funcion para depuradores de la api Win32 llamado WriteProcessMemory, veamos su definicion: BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesWritten ); El primer parametro es un manejador al proceso remoto, el segundo nos indica la direccion virtual en el CONTEXTO del proceso remoto donde vamos a escribir los datos contenidos en el tercer parametro (lpBuffer), este tercer parametro es un puntero dentro del contexto de nuestro PROPIO proceso, es decir, puede ser una variable o buffer alojado dinamicamente con malloc o VirtualAlloc dentro de nuestro proceso, este buffer sera copiado exactamente igual en la direccion especificada en el parametro anterior, y el numero de bytes a copiar seran los que sean especificados en el cuarto parametro (nSize), el ultimo parametro es opcional y podemos pasar NULL o 0, aunque si queremos saber cuantos bytes se copiaron, podemos pasar la direccion de memoria de una variable la cual sera llenada por esta funcion con el numero de bytes copiados. Ahora si, con todo esta teoria ya podemos empezar aplicar la tecnica =), lo que haremos es inyectar una dll llamada hack.dll en la unidad C:\ de nuestro disco en el proceso del buscaminas:
char DllPath[MAX_PATH]="C:\\hack.dll";
HWND Buscaminas; DWORD BuscaminasPID; HANDLE BuscaminasHandle; HMODULE hKernel; PVOID LoadLibraryAddress, RemoteVirtualAddress; BOOL bSuccess; HANDLE hRemoteThread; /*Obtenemos la direccion base de la libreria kernel32 donde reside LoadLibraryA*/
hKernel=GetModuleHandle("kernel32.dll"); /*Buscamos en la libreria la funcion exportada*/
LoadLibraryAddress=(PVOID)GetProcAddress(hKernel, "LoadLibraryA"); /*Nota: Aqui no nos preocupamos por la memoria virtual del contexto del otro proceso con respecto a las funciones que acabos de recabar, ya que todas son proyectadas en la misma direccion de memoria en todos los procesos =)*/ /*Intentamos encontrar el handle a la ventana del buscaminas*/
Buscaminas=FindWindow(NULL, "Buscaminas");
if(!Buscaminas) return; //error /*Recabamos el processId del proceso que posee la ventana*/
GetWindowThreadProcessId(Buscaminas, &BuscaminasPID); /*Abrimos una referencia al proceso con el process id obtenido*/
BuscaminasHandle=OpenProcess(PROCESS_ALL_ACCESS, FALSE, BuscaminasPID); /*Alojamos memoria en el proceso remoto =)*/
RemoteVirtualAddress=VirtualAllocEx(BuscaminasHandle, NULL, strlen(DllPath), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); if(!RemoteVirtualAddress) return; //error /*Escribimos en el espacio remoto que acabamos de alojar el string al camino de la dll*/
bSuccess=WriteProcessMemory(BuscaminasHandle, RemoteVirtualAddress, DllPath, strlen(DllPath), NULL); if(!bSuccess) return; //error /*Creamos el hilo remoto y pasamos de parametro la direccion de memoria donde se encuentra nuestra cadena de caracteres que tiene la ruta de nuestro ejecutable =D*/
hRemoteThread=CreateRemoteThread(BuscaminasHandle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, (LPVOID)RemoteVirtualAddress, 0); if(!hRemoteTHread) return; //error /*Esperamos a que el thread remoto termine de ejecutarse, este paso es opcional*/
WaitForSingleObject(hRemoteThread, INFINITE);
Y con esto terminamos este segundo articulo de programacion =D, espero que te haya gustado, jajaja, proximamente hare el tercero donde explicare una tecnica fundamental en la administracion del sistema operativo, recabar los procesos en el sistema, hasta la proxima xD. 9 October Articulo de Programacion #2 (Parte 2)Dll Injection (Parte 1)
Ya vimos lo que es un proceso y un hilo o thread en la parte anterior, sabiendo como son los procesos, la unica manera de poder ejecutar una funcion en su contexto seria creando un hilo dentro de el, la pregunta seria como hacerlo, ya que normalmente un proceso solo puede crear hilos dentro de si mismo, Microsoft nos dio un regalo para superar esa adversidad bajo usermode, y nos brinda la funcion llamada CreateRemoteThread: HANDLE WINAPI CreateRemoteThread( HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); Analicemos la funcion, el primer parametro es un handle representando el proceso en el que queremos crear el thread, lpThreadAttributes son los atributos de seguridad del thread a crear, generalmente este parametro no lo usamos, dWStackSize es el tamaño que tendra la pila del thread creado, lpStartAddress seria el parametro mas importante, especifica la direccion donde empieza el thread creado, lpParameter es un puntero a una variable que le podemos pasar la funcion del thread, ojo, como estamos en contexto de otro proceso, ese parametro lo tenemos que alojar en el proceso remoto (mas adelante se explicara), dwCreationFlags significa la manera de como se crea el nuevo Thread, se puede dejar en tres estados, los mas importantes, son en estado Pausado o Resumido, el ultimo parametro es un puntero que recibira el ThreadId del nuevo thread creado.
Primeramente para poder usar la funcion, necesitamos sacar el handle del proceso en el que queremos crear el thread, como se explico, un proceso es un objeto ejecutivo en el kernel de windows, un handle es una representacion abstracta de ese objeto que hace referencia al mismo. Para poder obtener el handle, primero necesitamos obtener el ProcessId del proceso, el processid es una manera de simplificar el significado del proceso, y es que realmente es un handle que hace referencia a su localizacion en la PspCidTable, una tabla de handles que mantiene un registro de todos los procesos creados. Una de las tantas maneras de obtener la pid es localizando el nombre de la ventana del proceso, por ejemplo digamos que el buscamina muestre un cuadro de dialogo que pregunte si deseas cerrar la aplicacion o no, esto de manera inmediata y sin permiso previo del programa, primero necesitamos localizarlo, esto se haria usando la funcion FindWindow: HWND FindWindow( El primer parametro de esta funcion lo pasamos para especificar el nombre de la clase de la ventana a encontrar, el segundo para especificar solamente el nombre de la ventana (es la que usariamos mas habitualmente), se pueden pasar ambos parametros tambien de ser necesario. Si la funcion es un exito, regresa el HWND de la ventana encontrada, un HWND es tambien un handle que hace referencia a la ventana requerida. Ahora una vez que la ventana ha sido encontrada, necesitamos obtener el process Id de quien la ventana pertenece, eso lo hacemos con la funcion GetWindowThreadProcessId: DWORD GetWindowThreadProcessId( El primer parametro de esta funcion es el HWND de la ventana de la que queremos saber el process id del proceso a quien pertenece, el segundo parametro es un puntero que recibe el processid de la ventana requerida, la funcion retorna el ThreadId del HWND de la ventana pasada a esta funcion. Ahora que ya tenemos el processid, ya podemos obtener el handle a este, el cual obtendremos con la funcion OpenProcess: HANDLE WINAPI OpenProcess( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId ); El primer parametro de esta funcion es el acceso que tendra el handle referenciado, por lo general siempre se usa la constante PROCESS_ALL_ACCESS. El segundo parametro es para indicar si el handle es heredado de un proceso padre, por lo general este parametro es puesto en falso, por ultimo el parametro mas importante, dwProcessId, aqui se pasa el processid del proceso a referenciar. Como resultado la funcion retorna la referencia al objeto del proceso, es decir el handle.
Y ahora si, tenemos lo mas importante para crear un Thread en el proceso, ahora es cuestion de poner todo esto en orden y ponerlo a la practica, pero eso lo veremos en la tercera parte de este articulo xD.
Articulo de Programacion #2 (Parte 1)Hilos y Procesos
Esta es la segunda parte de los articulos de programacion, la ultima vez nos quedamos viendo que era una dll y el efecto que tiene al ser cargada en un proceso, ahora veremos una comun tecnica usada en el hacking, llamada Dll Injection. Pero antes veamos que es un thread o hilo. Todos los procesos que se ejecutan tienen una determinada cantidad de hilos que se ejecutan al mismo tiempo, windows es un sistema multi-hilos, es decir, tiene la capacidad de ejecutar multiples hilos a la vez, tal vez nos preguntemos, como sera posible eso si la computadora a lo mucho tiene 1 o 2 procesadores?, bueno, realmente en un cpu, no se pueden ejecutar dos instrucciones al mismo tiempo, solamente una a la vez, asi que lo que hace el sistema operativo, es dividir el tiempo de ejecucion en unidades llamadas hilos, windows reparte el tiempo para cada hilo segun su prioridad en el sistema, de esta manera se crea el efecto de que varios hilos se ejecutan al mismo tiempo debido a que hoy en dia, la velocidad de los procesadores es bastante rapido. Bueno ahora que vimos que el hilo es la unidad minima de ejecucion, podemos concluir que un proceso no es mas que un conjunto de hilos en un hyperespacio virtual propio. Cuando un proceso es creado, este crea un hilo principal en el cual el codigo de inicio del ejecutable es ejecutado. A su vez, ese mismo hilo puede ejecutar mas hilos, dentro del mismo proceso, para poder satisfacer diferentes tareas de una manera mas eficiente a que si lo hiciera un solo hilo. Ahora bien, la vez pasada creamos una dll con un punto de inicio opcional, que ejecutaba un cuadro de texto, cuando una dll es cargada de esa manera la libreria Ntdll.dll en su funcion LdrLoadModule, es crear un thread en sus funciones internas para ejecutar el punto de entrada opcional DllMain, de esta manera se crea un hilo de ejecucion alterno al que estaba corriendo el mismo programa. El objetivo ahora es cargar la misma dll, pero en el contexto de otro proceso, pero antes de empezar, tenemos que entender bien lo que son los procesos. Como bien se definio antes, un proceso es un objeto de windows que mantiene un espacio virtual propio e hilos que se ejecutan en el mismo. Anteriormente en muchos sistemas operativos, se usaba un manejo de memoria linear, es decir, la memoria que se accedia era directamente la memoria ram o memoria fisica, eso ocasionaba muchos problemas en entornos donde se ejecutaban varios procesos a la vez, ya que un proceso podia acceder a la memoria de otro, alterando sus datos e inclusive colga el sistema. Actualmente en los sistemas operativos, como windows NT, maneja la memoria de manera diferente, la llamada Memoria Virtual La memoria virtual es la representacion abstracta de la memoria fisica, las cuales se dividen en paginas, las cuales se almacenan en directorios en un espacio de la memoria fisica destinada para ello. La memoria virtual permite que cada proceso tenga un espacio de memoria de 4 GB, te preguntaras, como es eso posible!!!, pues bueno, realmente no se tienen completos los 4GB, si no fisicamente se tienen 1 MB y a lo mucho 4 MB, esto es debido a que para que una direccion de memoria virtual pueda ser utilizada, necesita primero ser paginada en el direcotrio de paginas del proceso que esta en ejecucion, de esta manera al acceder a la direccion 0x00400000 de un proceso, al ser convertido a la direccion linear (memoria fisica), esta apunta a la direccion 0x1CEFFF20 de la memoria fisica donde actualmente reside contenido de la direccion, mientras que en otro proceso al tener un directorio de pagina distinto, la misma direccion virtual apuntaria a 0x00CEFF14, de esta manera se evita que otros proceso interfieran en la memora de otros, aunque esto puede ser tambien un problema, ya que los procesos se aislan, imposibilitando la comunicacion entre ellos, aunque no es imposible, existen tecnicas para comunicarlos, aunque eso ya se vera en proximos aritulos.
Ya que vimos un poco de informacion que son los hilos y comprendimos el concepto de los procesos, procederemos a explicar en la practica como cargar una dll en otro proceso. eso se vera en la parte dos de este segundo articulo :)
![]() 29 May Articulo de Programacion #1Dll (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 previamente creado, sin que haya sido programado en el mismo lenguaje, un ejecutable puede importar sus funciones contenidas y ejecutarlas, =O ahora tiene sentido el uso de una dll, seria 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: 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 = ) |
|
||||
|
|