Trabajo con procesos [modo kernel]

Iniciado por lweb20, 4 Diciembre 2011, 22:09 PM

0 Miembros y 3 Visitantes están viendo este tema.

lweb20

Hola que tal :D soy nuevo aquí :P.

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

Eternal Idol

#1
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.
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....

Eternal Idol

#3
¿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) ...
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?  :xD

Eternal Idol

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.
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 ;)

Eternal Idol

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.
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

#8
Lo tengo compilado. Te lo paso si quieres :P  :laugh:  :silbar:  :xD

EI: juntando mensajes.

Bueno el error de comparación sí me di cuenta

Eternal Idol

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.
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