elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Trabajo con procesos [modo kernel]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Trabajo con procesos [modo kernel]  (Leído 7,414 veces)
lweb20

Desconectado Desconectado

Mensajes: 43



Ver Perfil WWW
Trabajo con procesos [modo kernel]
« en: 4 Diciembre 2011, 22:09 pm »

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:

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 Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #1 en: 5 Diciembre 2011, 00:38 am »

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

Desconectado Desconectado

Mensajes: 43



Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #2 en: 5 Diciembre 2011, 00:53 am »

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 Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #3 en: 5 Diciembre 2011, 00:58 am »

¿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

Desconectado Desconectado

Mensajes: 43



Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #4 en: 5 Diciembre 2011, 01:02 am »

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
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #5 en: 5 Diciembre 2011, 01:06 am »

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

Desconectado Desconectado

Mensajes: 43



Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #6 en: 5 Diciembre 2011, 01:09 am »

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 Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #7 en: 5 Diciembre 2011, 01:16 am »

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

Desconectado Desconectado

Mensajes: 43



Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #8 en: 5 Diciembre 2011, 01:16 am »

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
« Última modificación: 5 Diciembre 2011, 01:19 am por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Trabajo con procesos [modo kernel]
« Respuesta #9 en: 5 Diciembre 2011, 01:21 am »

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

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,215 Último mensaje 11 Junio 2006, 20:53 pm
por jauma
Equivalente a SetWindowsHookEx en modo kernel?
Programación C/C++
Zzombi 6 5,016 Último mensaje 31 Julio 2010, 21:11 pm
por Littlehorse
Sincronizar modo kernel y modo usuer.
Programación C/C++
Distorsion 2 3,115 Último mensaje 28 Diciembre 2010, 16:45 pm
por Distorsion
Duda con modo kernel y CNC
Programación C/C++
achernar_ 4 4,206 Último mensaje 24 Agosto 2012, 04:36 am
por achernar_
Un problema con WinDbg en modo kernel local.
Windows
Usuario887 1 2,405 Último mensaje 31 Julio 2020, 09:33 am
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines