Autor
|
Tema: Trabajo con procesos [modo kernel] (Leído 7,285 veces)
|
lweb20
|
Hola que tal soy nuevo aquí . Tengo un driver creado con el DDK y lo que quisiera es obtener la ruta del proceso que se va a ejecutar hookeando a NewZwOpenProcess. He conseguido obtener el nombre del proceso en C++ pero con el DDK no me funciona ya que dice que tlhelp32.h no existe; además no creo que ese archivo funcione con el DDK ( como es C.... ). Mi driver tiene el siguiente código: #include "ntddk.h"
typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTableBase; unsigned int NumberOfServices; unsigned char *ParamTableBase; } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; #define SYSTEMSERVICE(_function)KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
int typedef DWORD (ULONG); PMDL g_pmdlSystemCall; PVOID *MappedSystemCallTable;
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1) #define HOOK_SYSCALL(_Function, _Hook, _Orig )_Orig = (PVOID) InterlockedExchange( (PLONG)&MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG)_Hook) #define UNHOOK_SYSCALL(_Function, _Hook, _Orig )InterlockedExchange( (PLONG)&MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG)_Hook)
//Declaramos la API para poder trabajar con ella. NTSYSAPI NTSTATUS NTAPI ZwOpenProcess (OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL); typedef NTSTATUS (*TypZwOpenProc)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL); TypZwOpenProc ZwOpenProcessIni;
void ObternerRuta( int pid );
NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL) { HANDLE PID; __try //Utilizamos el bloque try para evitar BSOD { PID = ClientId->UniqueProcess; } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_INVALID_PARAMETER; }
DbgPrint("PID: 0x%x",PID); //CORREGÍ UN ERROR ACÁ :P if (ObternerRuta(PID)== "C:\\miprograma.exe") return STATUS_ACCESS_DENIED; //Retornamos acceso denegado else return ZwOpenProcessIni(ProcessHandle,DesiredAccess,ObjectAttributes, ClientId); //Llamamos a la API nativa y retornamos el resultado correcto }
VOID OnUnload(IN PDRIVER_OBJECT DriverObject) { DbgPrint("Descargando driver...");
//Unhookeamos UNHOOK_SYSCALL( ZwOpenProcess, ZwOpenProcessIni, NewZwOpenProcess );
//Eliminamos la MDL if(g_pmdlSystemCall) { MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall); IoFreeMdl(g_pmdlSystemCall); } }
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING theRegistryPath) { DriverObject->DriverUnload = OnUnload; DbgPrint("Driver cargado"); ZwOpenProcessIni =(TypZwOpenProc)(SYSTEMSERVICE(ZwOpenProcess));
//Creamos la MDL para deshabilitar la protección de memoria g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4); if(!g_pmdlSystemCall) return STATUS_UNSUCCESSFUL;
MmBuildMdlForNonPagedPool(g_pmdlSystemCall); g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; MappedSystemCallTable = (PVOID*)MmMapLockedPages(g_pmdlSystemCall, KernelMode); DbgPrint("Hookeando..."); HOOK_SYSCALL( ZwOpenProcess, NewZwOpenProcess, ZwOpenProcessIni );
return STATUS_SUCCESS; }
void ObternerRuta( int pid ) { //AQUÍ ME FALTA CÓDIGO } ¿ALGUIEN ME PODRÍA AYUDAR POR FAVOR? Gracias
|
|
« Última modificación: 5 Diciembre 2011, 01:32 am por lweb20 »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
ZwOpenProcess no se usa para ejecutar nada, obtiene un HANDLE a un proceso ... el (W/D)DK se puede usar perfectamente con C++, el problema es que ese codigo que encontraste es para modo Usuario ... me da la sensacion de que no entendes muy bien que estas haciendo (copy & paste). De cualquier manera vas a tener que obtener el HANDLE y con el podes conseguir el PEB o desde XP en adelante llamar a ZwQueryInformationProcess (si, la documentacion es para Nt* pero vos llama a Zw*) con ProcessImageFileName. PD. Usar hooks per se es mala idea.
|
|
« Última modificación: 5 Diciembre 2011, 00:50 am por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
lweb20
|
El driver funciona perfectamente. Sí sé lo que hago y tengo un gran proyecto... está en modo kernel pero lo he simplificado un poco. Esta función NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL) se ejecuta cada vez que se abre un proceso y devuelve el PID y algunos otros datos como son el handle....
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
¿Esta funcion "NewZwOpenProcess"? Esa funcion es de tu modulo (que no sirve en x64 te adelanto), la funcion del Kernel es ZwOpenProcess y la que vos hookeas en la SSDT es en realidad NtOpenProcess ... y no, no devuelve ningun PID, ese es un parametro de entrada, lo UNICO que devuelve es un HANDLE (ademas del NTSTATUS) ...
|
|
« Última modificación: 5 Diciembre 2011, 01:01 am por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
lweb20
|
tengo el driver funcionando ¬¬ te explico: La API que hookeo es ZwOpenProcess del ntdll.dll y la reemplazo por una función llamada NewZwOpenProcess para que no haya conflicto. Use el DbgPrint como prueba como en algunos manuales de drivers para ver si funcionaba. En la variable ClientId de tipo PCLIENT_ID devuelve el PID... BUENO ¿ME EXPLICAS CÓMO FUNCIONA EL ZwQueryInformationProcess?
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
Como decia no entendes NADA en lo absoluto. Vos lo que hookeas - con un codigo que no hiciste vos y yo conozco hace años - es NtOpenProcess en la SSDT del Kernel (NTOSKRNL.exe). Te explico yo, ves ahi donde dice IN PCLIENT_ID ClientId OPTIONAL, lo que esta en negrita significa que es un parametro de ENTRADA, eso quiere decir que el que llama a esa funcion le pasa (opcionalmente) un puntero a una estructura con el PID que quiere abrir.
Antes te deje la explicacion de la MSDN enlazada, leela y si tenes alguna duda en particular pregunta.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
lweb20
|
OK.. pero tranquilo una pregunta ¿el código que he escrito entonces no debería funcionar? solo por curiosidad
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
Tal y como esta no compila ni por error y ademas tenes un error elemental al asignar en lugar de comparar ... lo que te decia es que nunca funcionara en x64 por usar hooks.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
lweb20
|
|
|
« Última modificación: 5 Diciembre 2011, 01:19 am por Eternal Idol »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
Por algo dije tal y como esta, los que leemos este hilo no tenemos poderes telepaticos, solo podemos ver el codigo aca presente y el mismo no compilaria.
PD. Anda pensando en comparar el path en Unicode (lo que usa internamente Windows), no tiene sentido que hagas transformaciones a ANSI.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema al debuguear paso de modo usuario a modo kernel
Ingeniería Inversa
|
jauma
|
0
|
2,180
|
11 Junio 2006, 20:53 pm
por jauma
|
|
|
Equivalente a SetWindowsHookEx en modo kernel?
Programación C/C++
|
Zzombi
|
6
|
4,958
|
31 Julio 2010, 21:11 pm
por Littlehorse
|
|
|
Sincronizar modo kernel y modo usuer.
Programación C/C++
|
Distorsion
|
2
|
3,074
|
28 Diciembre 2010, 16:45 pm
por Distorsion
|
|
|
Duda con modo kernel y CNC
Programación C/C++
|
achernar_
|
4
|
4,165
|
24 Agosto 2012, 04:36 am
por achernar_
|
|
|
Un problema con WinDbg en modo kernel local.
Windows
|
Usuario887
|
1
|
2,317
|
31 Julio 2020, 09:33 am
por Randomize
|
|