sábado, 10 de mayo de 2008

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, y esta ejecucion es dividido en unidades de ejecucion, cada uno con su respectivo stack y registros (contexto), llamados 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 1 GB, 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 :)


No hay comentarios: