Bueno espero aclarar mucho con esta respuesta.
Un rootkit es basicamente un programa que se usa para mantener root/control de la maquina, la idea detras de el, es lograr esconder la presencia del atacante. En windows son device drivers, en linux son un kernel module. Debido a que linux es open source, se desarrollaron muchas tecnicas para esconder procesos, etx, por ejemplo modificando ps, ls, o la mas reciente modificando libproc, pero llegaron programas tambien muy potentes como chrootkit que detectan los rootkits, si son LKM. Ahora en el ambiente de linux, se da que se compila el modulo dentro del mismo kernel, el rootkit genera un kernel panic, la maquina se reinicia con el nuevo kernel sin que el usuario se entere, una vez esto pasa, es totalmente imposible detectar el rootkit dentro de la maquina, claro, lo que se hace en ese caso es un analisis de el disco utilizando un live-cd por ejemplo. No ahondo mas en el tema, pork estamos tratando windows.
En windows sucede lo siguiente. Un rootkit son basicamente device drivers, que hookean apis de windows y cualquier api, incluso cualquier antivirus etx. Bien hooking es el proceso de remplazar el codigo de una api por nuestro codigo, los mejores rootkits logran hookear las apis mientras que estas estan cargadas, un ejemplo claro era el NT rootkit que hookeaba ExCreateObject() pero esto ya es detectado. SIguiendo con el hooking, si observan la estructura de los PE, es de la forma.
**************************************************** Direcciones altas
| MS DOS Header |||| Offset 0 |
*-------------------------------+
| PE Header
*-------------------------------+
| .text Aca esta el codigo del programa y los modulos
*-------------------------------+
| .data Variables estaticas
*-------------------------------+
| .idata | Informacion de las variables que importa
| |
*-------------------------------+
| .edata | Las variables que exporta
| |
*********************************************************************************************
En .idata estan todas las direcciones de lo que se importa. Ahora cuando uno llama una API, el compilador no linkea directamente al modulo sino al .idata. Entonces, es solo cuestion de encontrar la direccion del api que queremos hookear en .idata, y cambiar la direccion para que salte al codigo que nosotros queramos, supongo esto tambien se podria usar en linux con el global access table .GOT. Para encontrar las direccion de .idata, usen ImageDirectoryEntryToData que se encuentra en imagehlp.dll.
Bueno espero que esta parte alla quedado clara. Como podran darse cuenta una vez estan los hooks en los apis, es literalmente imposible detectar el rootkit a menos que el programa que lo detecta no halla sido hookeado.....pero uno nunca puede confiarse en esto, por ello lo mejor es simplemente iniciar el disco con un Live-cd o en otro computador y analisar los binarios, el primero que analizaria yo es kernel32.dll