Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lweb20 en 4 Diciembre 2011, 22:09 pm



Título: Trabajo con procesos [modo kernel]
Publicado por: lweb20 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


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol en 5 Diciembre 2011, 00:38 am
ZwOpenProcess (http://msdn.microsoft.com/en-us/library/windows/hardware/ff567022%28v=vs.85%29.aspx) 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 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684280%28v=vs.85%29.aspx)  (si, la documentacion es para Nt* pero vos llama a Zw*) con ProcessImageFileName.

PD. Usar hooks per se es mala idea.


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 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....


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol 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) ...


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 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


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol 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.


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 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 ;)


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol 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.


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 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


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol 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.


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 en 5 Diciembre 2011, 01:24 am
ahh ok :)

y lo del NtQueryInformationProcess  :huh: no logro usarlo correctamente

Te pido por favor que me ayudes ( lo que descubrí: PROCESSINFOCLASS no me deja usar ProcessImageFileName )

Perdona la ignorancia por lo de NtQueryInformationProcess 


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol en 5 Diciembre 2011, 01:40 am
Podes poner 27 directamente ... igual como te dije antes tenes que llamar a ZwQueryInformationProcess (tenes que prototiparla y ya que estas resolve la direccion dinamicamente).


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 en 5 Diciembre 2011, 01:47 am
Voy a hacer unas pruebas y te cuento. Muchas gracias y perdona por haberme expresado mal, como te digo soy nuevo y estoy algo desorientado. Gracias


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol en 5 Diciembre 2011, 01:52 am
Bueno de nada y no hay problema, suerte con eso. Aca ya son casi las 2 AM asi que me voy a dormir, chau.


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 en 5 Diciembre 2011, 21:06 pm
Hola de nuevo. Bueno ahorita no estoy en mi casa :P

En un driver en C se declara el ZwQueryInformationProcess? y la variable que incluye el dato es ProcessInformation?

Porque eso es lo que he hecho y el driver finaliza inesperadamente y la pc se apaga por error del kernel driver. u.u

De todas maneras hoy voy a intentar de nuevo.... Tal vez no sólo es la declaración sino que ¿debo asignar algo? o explícame si me entiendes :xD


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol en 5 Diciembre 2011, 21:24 pm
Si queres usar la funcion si, no esta en el W/DDK si recuerdo bien. ProcessInformation es un puntero opaco (por eso es PVOID) dependiendo de la clase que se use sera diferente, fijate en la documentacion que te deje antes.

Si te da una excepcion no controlada (BSOD) depuralo para ver EXACTAMENTE que esta pasando.


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 en 6 Diciembre 2011, 17:55 pm
Una pregunta si no es de mucha molestia...

Para depurar creo que es el WinDbg pero el driver ¿lo compilo con Free Build? creo  :huh:

Referencias:
http://msdn.microsoft.com/en-us/library/ff543450.aspx (http://msdn.microsoft.com/en-us/library/ff543450.aspx)
http://msdn.microsoft.com/en-us/library/ff544635.aspx (http://msdn.microsoft.com/en-us/library/ff544635.aspx)


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol en 6 Diciembre 2011, 18:11 pm
Si, para usar WinDbg necesitas 2 maquinas (y conectarlas via serial o firewire). El modulo de modo Kernel lo generas como CHECKED que es Debug y no FREE que es Release, igual esa pagina que dejaste no habla de eso exactamente sino de la version de Windows checked (es decir Debug).


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: lweb20 en 6 Diciembre 2011, 20:56 pm
pero tengo una sola máquina... ¿podrá ser virtual o hay otra manera?


Título: Re: Trabajo con procesos [modo kernel]
Publicado por: Eternal Idol en 6 Diciembre 2011, 21:38 pm
Si, en VMWare por ejemplo podes crear un puerto serial virtual muy facilmente.

http://silverstr.ufies.org/lotr0/windbg-vmware.html