Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Vaagish en 30 Octubre 2013, 23:01 pm



Título: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 30 Octubre 2013, 23:01 pm
Hola amigos! Bueno, no quiero quedar pesado, ni aparentar que no he leído nada sobre el tema, pero por mas que busque diferentes fuentes ninguna me despoja de la duda sobre algunos asuntos de los drivers, creo, en parte por no manejar el ingles fluidamente. Si alguien me da una mano sobre algunos conceptos, se lo agradecería mucho. Voy a poner una serie de nombres, algunas con lo que yo entiendo y otras para que si alguien quiere/puede me las "traduzca" al "entendible"  :xD

Citar
IRP: The IRP structure is a partial opaque structure that represents an I/O request packet.
IRP es una estructura que se utiliza para la comunicacion de los drivers
Citar
IO_STACK_LOCATION: The IO_STACK_LOCATION structure defines an I/O stack location, which is an entry in the I/O stack that is associated with each IRP.
Alguien me puede aclarar esto??
Citar
IRP Major Function: Each driver-specific I/O stack location (IO_STACK_LOCATION) for every IRP contains a major function code (IRP_MJ_XXX)
IRP Major Function es un vector de punteros de funciones que necesita nuestro driver, entiendo que eso es asi, pero no porque.
Citar
IoCreateDevice: WDM drivers, other than bus drivers, call IoCreateDevice to create their device objects. Most WDM drivers create their device objects from within their AddDevice routines. Some drivers, such as disk drivers that must respond to drive layout IOCTLs, call IoCreateDevice from a dispatch routine.
Por lo que entiendo aca,, los drivers en windows llaman a IoCreateDevice para crear sus device objects, pero entonces, un driver en windows siempre es considerado como un dispositivo, o "representante" de uno? Aunque sea un driver que no interactue con un dispositivo siempre sera considerado un dispositivo? ( Esta parte me interesa, porque tengo un error de concepto me parece )

Bueno, tengo mas dudas, pero creo que se pueden ir aclarando si puedo despejar un poco estas primero..
Muchas gracias de antemano! Saludos!


Título: Re: Algunas dudas sobre Drivers...
Publicado por: x64core en 3 Noviembre 2013, 01:28 am
Citar
Citar
IRP: The IRP structure is a partial opaque structure that represents an I/O request packet.
IRP es una estructura que se utiliza para la comunicacion de los drivers
Citar
Estructura que es creada por el IO manager el cual lo pasa por todos lo drivers cargados en el kernel,
por ahi en esos libros que supongo que estas leyendo recuerdo que hay una imagen que muestra un diagrama sobre esta estructura y como se relaciona
del IO manager y los drivers.

Citar
IO_STACK_LOCATION: The IO_STACK_LOCATION structure defines an I/O stack location, which is an entry in the I/O stack that is associated with each IRP.
Alguien me puede aclarar esto??
Citar
Es la definicion de la estructura que estamos hablando en la pregunta 1.

Citar
IRP Major Function: Each driver-specific I/O stack location (IO_STACK_LOCATION) for every IRP contains a major function code (IRP_MJ_XXX)
IRP Major Function es un vector de punteros de funciones que necesita nuestro driver, entiendo que eso es asi, pero no porque.
Citar
Es la funcion que sera llamada a los drivers, todo driver tiene un array de punteros que corresponde a cada codigo de funcion para cada proposito.

Citar
IoCreateDevice: WDM drivers, other than bus drivers, call IoCreateDevice to create their device objects. Most WDM drivers create their device objects from within their AddDevice routines. Some drivers, such as disk drivers that must respond to drive layout IOCTLs, call IoCreateDevice from a dispatch routine.
Por lo que entiendo aca,, los drivers en windows llaman a IoCreateDevice para crear sus device objects, pero entonces, un driver en windows siempre es considerado como un dispositivo, o "representante" de uno? Aunque sea un driver que no interactue con un dispositivo siempre sera considerado un dispositivo? ( Esta parte me interesa, porque tengo un error de concepto me parece )
Driver son los controladores de los dispositivos, si un driver es cargado para un proposito legitimo es porque controlara un dispositivo en general, mirar
algunos dispositivos como video camaras instalan driver(s) para controlar y manipular el dispositivo ( camara de video en este caso ). ademas sirve para comunicarse
de modo usuario a modo kernel.



Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 3 Noviembre 2013, 02:23 am
Primero que nada, muchas gracias x64Core! Pensé que ya nadie me iba a responder, hoy ya no tenia ni ganas de leer el libro, esto me anima  ;D

Citar
Estructura que es creada por el IO manager el cual lo pasa por todos lo drivers cargados en el kernel
Entonces todos los irps son enviados a todos los drivers.. por eso había leido en el tuto "Principios básicos de desarrollo de drivers en Windows"
Citar
Es decir, cuando una aplicación en modo usuario llame a algunas de estas funciones:

CreateFile
CloseHandle
WriteFile
ReadFile
DeviceIoControl

se llamara a tu driver.
Lo que esta pasando es que cuando se llama a una API Nativa, la IRP pasa por nuestro driver, entonces ahi podemos modificar el resultado, justo como un hook, no?
Citar
por ahi en esos libros que supongo que estas leyendo recuerdo que hay una imagen que muestra un diagrama sobre esta estructura y como se relaciona
Si que lo estoy leyendo, pero no recuerdo haber visto el diagrama, y si lo vi no lo abre entendido, ahora lo voy a repasar..
Citar
Driver son los controladores de los dispositivos, si un driver es cargado para un proposito legitimo es porque controlara un dispositivo en general
Ok! Eso me aclara bastante, porque había leído que hay diferentes tipos de drivers, pero entonces siempre debería ser esa la función de un driver..

Muchas Gracias! Saludos!!


Título: Re: Algunas dudas sobre Drivers...
Publicado por: x64core en 3 Noviembre 2013, 02:37 am
Citar
Citar
Es decir, cuando una aplicación en modo usuario llame a algunas de estas funciones:

CreateFile
CloseHandle
WriteFile
ReadFile
DeviceIoControl

se llamara a tu driver.
Lo que esta pasando es que cuando se llama a una API Nativa, la IRP pasa por nuestro driver, entonces ahi podemos modificar el resultado, justo como un hook, no?
Lo que los rootkits hacen es reemplazar el puntero del IRP Handler, por ejemplo para ocultar archivos reemplazan el puntero correspondiente en el driver responsable del NTFS/FAT.




Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 3 Noviembre 2013, 03:08 am
Ok,, voy a estudiar eso, suena interesante.. Entonces, cuando se envía un IRP, se envía a todos los drivers, no? (Me quede con esa idea)

EDIT: O sea, si mi driver tiene un Major Function que pueda recibir ese IRP, no?


Título: Re: Algunas dudas sobre Drivers...
Publicado por: x64core en 3 Noviembre 2013, 07:14 am
Ok,, voy a estudiar eso, suena interesante.. Entonces, cuando se envía un IRP, se envía a todos los drivers, no? (Me quede con esa idea)

EDIT: O sea, si mi driver tiene un Major Function que pueda recibir ese IRP, no?

Si tu driver esta añadido a la cadena de drivers, sí (ya veras como va).
De lo contrario capturara solo los de tu device.


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 10 Noviembre 2013, 18:35 pm
Hola! Yo molestanto otra vez..

Citar
Loading the Windows NT kernel[edit]
The operating system starts when certain basic drivers flagged as "Boot" are loaded into memory. The appropriate file system driver for the partition type (NTFS, FAT, or FAT32) which the Windows installation resides are amongst them. At this point in the boot process, the boot loader clears the screen and displays a textual progress bar, (which is often not seen due to the initialization speed); Windows 2000 also displays the text "Starting Windows..." underneath. If the user presses F8 during this phase, the advanced boot menu is displayed, containing various special boot modes including Safe mode, with the Last Known Good Configuration, with debugging enabled, and (in the case of Server editions) Directory Services Restore Mode. Once a boot mode has been selected (or if F8 was never pressed) booting continues.
Next, the Windows NT kernel (Ntoskrnl.exe) and the Hardware Abstraction Layer (hal.dll) are loaded into memory. If multiple hardware configurations are defined in the Windows Registry, the user is prompted at this point to choose one.

Ntoskrnl.exe
Citar
This system binary is not a native application (in that it is not linked against ntdll.dll), instead containing a standard main entry point, a stub that calls the kernel initialization function but is unused as the OS loader (internal symbol OSLOADER) calls KiSystemStartup directly. While ntoskrnl.exe is not linked against ntdll.dll, it is linked against bootvid.dll, hal.dll and kdcom.dll. Because it requires a static copy of C Runtime objects it depends on, the executable is usually about 2MB in size.

Bueno, estos dos archivos no se cargan de forma "Normal", no? (Ntoskrnl.exe y hal.dll) Porque el loader de windows aun no esta cargado en memoria, aparte, el Ntoskrnl.exe, muchas veces esta definido como "el mismo kernel" (Aunque esto no es del todo cierto, o sea, no es solo ese archivo el núcleo de windows), lo que me da a pensar esto, es que gran parte del núcleo de windows es un exe, como todo programa de windows,, es esto así?

Saludos!!


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 10 Noviembre 2013, 22:23 pm
Si, es un PE (http://en.wikipedia.org/wiki/Portable_executable), algo que podes comprobar de varias maneras.


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 11 Noviembre 2013, 01:57 am
Ajam.. interesante... lo voy a ver con el Pe Explorer.. por ende, supongo que puedo ver que funciones exporta..
En realidad, estaba por poner que mas que una duda, una confirmación.. por tener extensión .exe, esperaba que fuera un PE, pero no se carga como los demas PE's.. otra cosa es que ese .exe no se muestra en la lista de procesos, (por ser el mismo kernel, calculo..)
Se podra inyectar?  >:D


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 11 Noviembre 2013, 02:03 am
¿Inyectar? ¿Que? ¿Codigo? Si, aunque en versiones modernas esta el PatchGuard (http://en.wikipedia.org/wiki/Kernel_Patch_Protection).


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 11 Noviembre 2013, 02:45 am
Por lo que leo en la wiki, parece mas un problema que una solución  :rolleyes:
y solo en 64bits, en fin.. supongo que debe haber formas de saltarse eso.. cuando me complique ese asunto lo estudio mejor, esta bueno saberlo...
Por el momento, me queda mucho por aprender de las tablas, estructuras, y funciones para dar los primeros pasos con los drivers..

Otra cosa que no me queda claro son las funciones tipo Zw* y Nt*, esas funciones salen de otros drivers, no? Digamos, son exportadas por otros drivers? (Ahora no tengo el PE Explorer para fijarme), ya leí la wiki, pero no es muy clara, al parecer no existe mayor diferencia entre unas y otras,, ( Zw y Nt )

Editado:
Citar
Nt or Zw are system calls declared in ntdll.dll and ntoskrnl.exe. When called from ntdll.dll in user mode, these groups are almost exactly the same; they trap into kernel mode and call the equivalent function in ntoskrnl.exe via the SSDT. When calling the functions directly in ntoskrnl.exe (only possible in kernel mode), the Zw variants ensure kernel mode, whereas the Nt variants do not.[3] The Zw prefix does not stand for anything.
Antes no me habia quedado claro, ahora si.. Listo!


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 11 Noviembre 2013, 10:39 am
Por lo que leo en la wiki, parece mas un problema que una solución  :rolleyes:
y solo en 64bits, en fin.. supongo que debe haber formas de saltarse eso.. cuando me complique ese asunto lo estudio mejor, esta bueno saberlo...

Un problema sera para los que hacen malware, practicamente (por no decir todo) se puede hacer con callbacks y drivers de tipo filtro asi que no hay necesidad real de hooks.

Otra cosa que no me queda claro son las funciones tipo Zw* y Nt*, esas funciones salen de otros drivers, no? Digamos, son exportadas por otros drivers? (Ahora no tengo el PE Explorer para fijarme), ya leí la wiki, pero no es muy clara, al parecer no existe mayor diferencia entre unas y otras,, ( Zw y Nt )

Son del propio Kernel y si hay una diferencia importante, cuando llamas desde modo Kernel tenes que usar Zw (en modo Usuario una es alias de la otra, tienen la misma direccion).

http://www.osronline.com/article.cfm?id=257


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 11 Noviembre 2013, 17:32 pm
Citar
cuando llamas desde modo Kernel tenes que usar Zw (en modo Usuario una es alias de la otra, tienen la misma direccion).

Okk! Esto se empieza a aclara  :P

Una ultima cosa, y sigo estudiando.. por la vuelta he visto este tipo de funciones:
Citar

ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformationAddress = NULL;

   status = ((ZWQUERYSYSTEMINFORMATION)(ZwQuerySystemInformationAddress)) (
               SystemInformationClass,
               SystemInformation,
               SystemInformationLength,
               ReturnLength );
Por que va entre parentesis? No se usa igual que las funciones en modo usuario..  :silbar:


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 11 Noviembre 2013, 17:47 pm
Okk! Esto se empieza a aclara  :P

Una ultima cosa, y sigo estudiando.. por la vuelta he visto este tipo de funciones:Por que va entre parentesis? No se usa igual que las funciones en modo usuario..  :silbar:

¿Es o no es codigo basura ese? Te recomiendo otra vez aprender con el WDK.


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 11 Noviembre 2013, 18:23 pm
Citar
¿Es o no es codigo basura ese?
Por que codigo basura?

Bueno, si Eternal.. creo que ahora puedo empezar con WDK. Convengamos que el WDK no tiene nada de teoría, es como ir a la guerra con un palito..

Saludos!


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 11 Noviembre 2013, 18:28 pm
Por que codigo basura?

Es muy sencillo: ¿De donde salio?

Bueno, si Eternal.. creo que ahora puedo empezar con WDK. Convengamos que el WDK no tiene nada de teoría, es como ir a la guerra con un palito..

No, el WDK tiene la mayor referencia que existe ... tal vez no la hayas encontrado ... ademas en los ejemplos hay varios misiles pero bueno ...


Título: Re: Algunas dudas sobre Drivers...
Publicado por: x64core en 11 Noviembre 2013, 18:34 pm
El ntosknrl y el hal son cargados durante el proceso de carga del S.O., luego este carga todos los demas drivers y procesos del sistema.

Okk! Esto se empieza a aclara  :P

Una ultima cosa, y sigo estudiando.. por la vuelta he visto este tipo de funciones:Por que va entre parentesis? No se usa igual que las funciones en modo usuario..  :silbar:
Si es una funcion de hook para NtQuerySystemInformation, Se pasa a la funcion original los parametros que son pasados al hook de esta manera
se intercepta el resultado, aunque no hay ninguna necesidad de hacer un casting del puntero a la función si la variable ya es declarada
como tal.


Por cierto:
@EI: No seria usar las Nt's desde modo kernel:

Zw:
Código:
kd> u nt!ZwCreateFile L6
nt!ZwCreateFile:
804fe08c b825000000      mov     eax,25h
804fe091 8d542404        lea     edx,[esp+4]
804fe095 9c              pushfd
804fe096 6a08            push    8
804fe098 e884f40300      call    nt!KiSystemService (8053d521)
804fe09d c22c00          ret     2Ch

Nt:
Código:
kd> u nt!NtCreateFile L25
nt!NtCreateFile:
8056e38c 8bff            mov     edi,edi
8056e38e 55              push    ebp
8056e38f 8bec            mov     ebp,esp
8056e391 33c0            xor     eax,eax
8056e393 50              push    eax
8056e394 50              push    eax
8056e395 50              push    eax
8056e396 ff7530          push    dword ptr [ebp+30h]
8056e399 ff752c          push    dword ptr [ebp+2Ch]
8056e39c ff7528          push    dword ptr [ebp+28h]
8056e39f ff7524          push    dword ptr [ebp+24h]
8056e3a2 ff7520          push    dword ptr [ebp+20h]
8056e3a5 ff751c          push    dword ptr [ebp+1Ch]
8056e3a8 ff7518          push    dword ptr [ebp+18h]
8056e3ab ff7514          push    dword ptr [ebp+14h]
8056e3ae ff7510          push    dword ptr [ebp+10h]
8056e3b1 ff750c          push    dword ptr [ebp+0Ch]
8056e3b4 ff7508          push    dword ptr [ebp+8]
8056e3b7 e860d8ffff      call    nt!IoCreateFile (8056bc1c)
8056e3bc 5d              pop     ebp
8056e3bd c22c00          ret     2Ch
8056e3c0 cc              int     3
8056e3c1 cc              int     3
8056e3c2 cc              int     3
8056e3c3 cc              int     3
8056e3c4 cc              int     3
8056e3c5 cc              int     3




Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 11 Noviembre 2013, 18:49 pm
Citar
Es muy sencillo: ¿De donde salio?
Haa,, si.. seguro es sencillo, no entendia por que usaba asi a la funcion..

Citar
Si es una funcion de hook para NtQuerySystemInformation, Se pasa a la funcion original los parametros que son pasados al hook
Exactamente

Lo que hace, que me maree era esto:
Citar
un casting del puntero a la función si la variable ya es declarada como tal

Citar
No seria usar las Nt's desde modo kernel:
Tengo que aprender a usar Windbg urgente..  :silbar:


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 11 Noviembre 2013, 18:53 pm
El ntosknrl y el hal son cargados durante el proceso de carga del S.O., luego este carga todos los demas drivers y procesos del sistema.

Si, el loader se encarga de cargar todos los boot drivers.

Por cierto:
@EI: No seria usar las Nt's desde modo kernel:

No, Zw, lee el articulo que deje antes.

Haa,, si.. seguro es sencillo, no entendia por que usaba asi a la funcion..

No se, deberia ser MUY sencillo decir de donde lo sacaste ... salvo que no lo quieras decir ... Y no hay razon para llamar de esa manera, es basura simplemente.


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Vaagish en 11 Noviembre 2013, 18:58 pm
Na, por que voy a tener problemas en decir de donde lo saque?
Esta claro que no lo hice yo.. de ser asi, no estaria preguntando tanto.. lo saque de un rootkit, te paso el autor, esta su firma en el codigo..

           Agony rootkit
           
               by Intox

Yo intento aprender EI, nada mas..

Saludos!


Título: Re: Algunas dudas sobre Drivers...
Publicado por: Eternal Idol en 11 Noviembre 2013, 19:01 pm
En fin, era codigo basura como sospechaba. Esa manera de aprender te lleva a entender poco y nada, como esperar todos los IRPs de todos los stacks de todos los DEVICE_OBJECT pasen por un solo Dispatch ... podes optar entre codigo basura o el WDK.