Ir al contenido


Foto

kernel de windows


  • Por favor identifícate para responder
24 respuestas en este tema

#1 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 24 noviembre 2016 - 07:33

Hola quisiera saver si hay alguna forma de detectar si cuando se ejecute una determinada aplicación esta trabaja a nivel de kernel?


  • 0

#2 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 24 noviembre 2016 - 08:39

Hola,

 

Para responder a tu pregunta, es necesario contar con mas información o bien que expliques a detalle, porque decir "a nivel de kernel" resulta ambigüo, es decir, podría entenderse que la aplicación resulta ser otro "kernel" dentro del sistema operativo, o bien "a nivel de kernel" podría entenderse que la aplicación aplica funciones directas al firmware y sin o con necesidad del "kernel".

 

Bien, el "kernel" facilita abstracciones del hardware, administración de procesos, entre otras cosas, ahora bien, una aplicación en "Windows" implícitamente utiliza funciones expuestas en la librería "kernel.dll", y tú como desarrollador, puedes utilizar funciones explicitamente en tu aplicación realizando llamados al API de Windows, en este caso, utilizando funciones de la librería "kernel.dll".

 

 

 

Saludos


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 24 noviembre 2016 - 09:27

Todas las APP trabajan a nivel Kernel pues es éste último donde terminan las API. Hay una estructura en capas de cebolla o anillo que aísla el Kernel de forma que según permisos se filtran accesos. Cuando un código se ejecuta desde el Kernel se dice que está en Ring0, el mismo núcleo y no va a pasar por los filtros. El código desde el Kernel tiene acceso a Todo, es el mismo S.O. aunque suele haber mecanismos de seguridad para evitar errores mortales. Un error  no controlado en Ring0 significa una bonita BSOD.

 

Hay un abismo entre Rin0 y el usuario. La forma de acceder al Kernel generalmente es con un driver que se suele cargar como un servicio. Un driver tiene una estructura de código muy especificada y se trata de un ejecutable completo. El driver suele tener un nombre de archivo con la extensión .sys. Para cargar un driver encontraremos APIs como OpenSCManager, CreateService, StartService...

 

Para cargar un driver necesitamos una app en modo usuario administrador que lo ejecutará y se comunicará con él, Algunas app pueden esconder al driver en su propio código y ocultarlo. Así que si depurando la app con un debugger encontramos un archivo.sys y el uso de API para cargar y manejar servicios, como OpenSCManager, CreateService, StartService, SendIOCTL... probablemente se trate de una app que trata de ejecutar código desde el Kernel

 

 

Saludos.


  • 0

#4 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 24 noviembre 2016 - 10:08

lo q quiero dectectar en concreto es el chetengine, aki esta el codigo fuente de este https://github.com/c...ne/cheat-engine sugun tengo entendido el realiza modificaciones a nivel de kernel en las variables del processo q uno escoja, lo q quiero detectar es cuando algun programa trate de trabaja en la memoria de otro programa,

 

El driver suele tener un nombre de archivo con la extensión .sys.

la aplicacion si lo tiene son dbk64.sys y dbk32.sys, pero mucha otras aplicaciones comunes tienes *.sys, lo q quisiar es algo parecido al ShellMonitor de escafandra pero para saver quien esta ejecutando codigo desde el kernel o se podria hacer un hook a las api OpenSCManager, CreateService, StartService

solo para informarme no para bloquerlas?

 
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 24 noviembre 2016 - 06:10

cheat-engine trabaja con un driver cargado en el Kernel


Saludos.


  • 0

#6 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 25 noviembre 2016 - 07:38

si pero como puedo detectar cuando el trate de cargar ese driver


  • 0

#7 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 25 noviembre 2016 - 09:30

Hola,

 

Tal como dice escafandra:

 

 

 

cheat-engine trabaja con un driver cargado en el Kernel

 

Revisando la estructura del proyecto, creo que el driver es "DBKKernel" y hay una unidad llamada "DBK32functions" en la cual puedes analizar y verificar los llamados a las funciones, y alli puedes iniciar y encontrar la respuesta a tu pregunta acerca de la carga del driver.

 

Realizando un pasos a paso puedes realizar el análisis.

 

Saludos


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 25 noviembre 2016 - 09:37

Para cargar un driver encontraremos APIs como OpenSCManager, CreateService, StartService...


Este fragmento de código es de cheat-engine y coincide con lo que ya te dije:

delphi
  1. hService := OpenService(hSCManager, pchar(servicename), SERVICE_ALL_ACCESS);
  2. if hService=0 then
  3. begin
  4. hService:=CreateService(
  5. hSCManager, // SCManager database
  6. pchar(servicename), // name of service
  7. pchar(servicename), // name to display
  8. SERVICE_ALL_ACCESS, // desired access
  9. SERVICE_KERNEL_DRIVER,// service type
  10. SERVICE_DEMAND_START, // start type
  11. SERVICE_ERROR_NORMAL, // error control type
  12. pchar(driverloc), // service's binary
  13. nil, // no load ordering group
  14. nil, // no tag identifier
  15. nil, // no dependencies
  16. nil, // LocalSystem account
  17. nil // no password
  18. );
  19. end

Fíjate en la API CreateService y el parámetro SERVICE_KERNEL_DRIVER. ¿No te da ya alguna idea de como detectarlo en tiempo de ejecución?
 
 
Saludos.
  • 0

#9 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 25 noviembre 2016 - 09:43

Excelente :ap: , que bien

 

¡Mas detallado....imposible!

 

 

Saludos


  • 0

#10 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 25 noviembre 2016 - 09:47

Para ilustrar un poco más:


cpp
  1. __try
  2. {
  3. //switch to the selected process
  4. if (PsLookupProcessByProcessId((PVOID)(UINT64)(pinp->ProcessID),&selectedprocess)==STATUS_SUCCESS)
  5. {
  6. KAPC_STATE apc_state;
  7. RtlZeroMemory(&apc_state,sizeof(apc_state));
  8. KeStackAttachProcess((PVOID)selectedprocess,&apc_state);
  9.  
  10. __try
  11. {
  12. physical=MmGetPhysicalAddress((PVOID)pinp->BaseAddress);
  13. }
  14. __finally
  15. {
  16. KeUnstackDetachProcess(&apc_state);
  17. }
  18.  
  19.  
  20. ObDereferenceObject(selectedprocess);
  21.  
  22. }
  23. }

La API que nos habilita desde el Kernel para escribir en el espacio de memoria de un proceso es KeStackAttachProcess

Saludos.


  • 0

#11 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 28 noviembre 2016 - 07:50

jeje me pongo a trabajar ahora mismo es q estaba de  vacaciones.


  • 0

#12 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 08 diciembre 2016 - 03:16

uff disculpen la demora es q llevo varios hilos de mi proyecto, estube buscando informacion sobre CreateService y KeStackAttachProcess pero todo me envia a las paginas de microsoft a las cuales no se la rason pero no tengo acceso, la idea q tengo es hacele un hook al estas api pero no encuentro a q libreria pertentecen, estoy trabajando con RAD Studio Berlin.


  • 0

#13 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 08 diciembre 2016 - 04:17

KeStackAttachProcess es exportada por NtosKrnl.exe que pertenece al Kernel y solo puede ser hookeada desde un driver en Ring 0 escrito en C


cpp
  1. VOID KeStackAttachProcess(
  2. _Inout_ PRKPROCESS Process,
  3. _Out_ PRKAPC_STATE ApcState
  4. );

CreateService es exportada por Advapi32.dll


cpp
  1. SC_HANDLE WINAPI CreateService(
  2. _In_ SC_HANDLE hSCManager,
  3. _In_ LPCTSTR lpServiceName,
  4. _In_opt_ LPCTSTR lpDisplayName,
  5. _In_ DWORD dwDesiredAccess,
  6. _In_ DWORD dwServiceType,
  7. _In_ DWORD dwStartType,
  8. _In_ DWORD dwErrorControl,
  9. _In_opt_ LPCTSTR lpBinaryPathName,
  10. _In_opt_ LPCTSTR lpLoadOrderGroup,
  11. _Out_opt_ LPDWORD lpdwTagId,
  12. _In_opt_ LPCTSTR lpDependencies,
  13. _In_opt_ LPCTSTR lpServiceStartName,
  14. _In_opt_ LPCTSTR lpPassword
  15. );

Saludos.


  • 1

#14 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 09 diciembre 2016 - 07:20

entonces desde delphi no hay forma de hookear esas API?, CreateService deve de ejecutarse nadamas cuando levanta el cheatengine no?, si es asi no resuelva nada hookeandolo.


  • 0

#15 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 09 diciembre 2016 - 08:31

Saludos.
 
Felicidades por su presentación.

 

entonces desde delphi no hay forma de hookear esas API?, CreateService deve de ejecutarse nadamas cuando levanta el cheatengine no?, si es asi no resuelva nada hookeandolo.

CreareService es un API normal pero requiere elevación de administrador, para el hookear también. Se puede hacer un hook con delphi
KeStackAttachProcess no se puede hookear con delphi, requiere escribir un driver en modo Kernel en C.



Saludos
  • 0

#16 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 09 diciembre 2016 - 09:15

el problema del CreateService es segun entendi del funcionamieto del cheatengine q el lo usa para agregar el driver al kerner lo cual debe hacerlo al levatar por lo q no me sirve de nada hookearla porque ya el la habra usado o eso pieso no?


  • 0

#17 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 09 diciembre 2016 - 11:02

Si inyectas en explorer.exe una dll con un Hook a la API CreateProcessInternalW controlas todos los procesos que crea y puedes inyectar inmediatamente para hookear el proceso que quieras.

También puedes descargar el driver tranquilamente y luego hookear la API para que no lo vuelvan a instalar. Otra opción es estar desinstalando el driver en un bucle localizado en un thread.


Saludos.
  • 0

#18 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 09 diciembre 2016 - 11:54

eso de desintalar el driver q usa es lo q creo q seria mejor, como se hace eso


  • 0

#19 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 4.014 mensajes
  • LocationMadrid - España

Escrito 09 diciembre 2016 - 03:09

Como desinstalador completo paso a paso de un driver en C
 


cpp
  1. //---------------------------------------------------------------------------
  2. // Detiene el driver y lo descarga
  3. // Driver es el nombre del driver sin extensión.sys (Simbolic Link)
  4. BOOL UnLoadDriver(char* driver)
  5. {
  6. SERVICE_STATUS ssService;
  7. SC_HANDLE scManager;
  8. SC_HANDLE scService;
  9.  
  10. scManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  11. if(scManager == NULL){
  12. return FALSE; //No se ha contactado con Service Control Manager
  13.  
  14. }
  15.  
  16. scService = OpenService(scManager, TEXT(driver), SERVICE_ALL_ACCESS);
  17. if(!scService){
  18. if(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST){
  19. CloseServiceHandle(scManager);
  20. return TRUE;
  21. }else{
  22. CloseServiceHandle(scManager);
  23. return FALSE; //No se contactado con el driver
  24. }
  25. }
  26.  
  27. if(!ControlService(scService, SERVICE_CONTROL_STOP, &ssService)){
  28. if(GetLastError() != ERROR_SERVICE_NOT_ACTIVE){
  29. CloseServiceHandle(scService);
  30. CloseServiceHandle(scManager);
  31. return FALSE; // No se ha podido detener el servicio
  32. }
  33. }
  34.  
  35. if(!DeleteService(scService)){
  36. CloseServiceHandle(scService);
  37. CloseServiceHandle(scManager);
  38. return FALSE; // No ha podido eliminarse el driver
  39. }
  40.  
  41. CloseServiceHandle(scService);
  42. CloseServiceHandle(scManager);
  43. return TRUE;
  44. }

Desinstalador simple de un driver en delphi. Fragmento de código tomado de ZwOpenProcess. Un Hook al mismo Kernel.


delphi
  1. var
  2. scManager: Integer;
  3. scService: Integer;
  4. ssService: SERVICE_STATUS;
  5. DriverName: String;
  6. DriverPath: String;
  7.  
  8. begin;
  9. Result:= FALSE;
  10. DriverName:= ChangeFileExt(DriverFileName, '');
  11. scManager := OpenSCManager(nil, nil, SC_MANAGER_CONNECT or _DELETE or SC_MANAGER_CREATE_SERVICE);
  12. if (scManager <> 0) then
  13. begin
  14. scService:= OpenService(scManager, PCHAR(DriverName), SERVICE_ALL_ACCESS);
  15. if(scService <> 0)then
  16. begin;
  17. Result:= ControlService(scService, SERVICE_CONTROL_STOP, ssService);
  18. end;
  19. end;
  20. CloseServiceHandle(scService);
  21. CloseServiceHandle(scManager);
  22.  
  23. DriverPath:= SystemDir + '\drivers\' + DriverFileName;
  24. DeleteFile(DriverPath);
  25. end;

Saludos.


  • 1

#20 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 15 diciembre 2016 - 11:18

intente lo de desintalar el driver y no me sirvio, pues al trabajar con otra version , no encontre el driver en el system32/driver/... ni lo pone en el registro como aparece el en la unidad DBK32functions.pas como me orientaron, al parecer el cambia esto en cada version, pues se me ocurio la idea de si es posible obtener un listado de servicios de tipo SERVICE_KERNEL_DRIVER?


  • 0