Ahora, bien sabemos que la mayoría de los cheats utilizan inyecciones que se realizan por hilo remoto. Los pasos para crear un hilo remoto son los siguientes:
- Encontrar y abrir el proceso (abrir el proceso con permisos)
- Almacenar memoria en el proceso para la dirección de la dll o código a ejecutar
- Escribir la dirección de la dll o rutina a ejecutar
- Crear un hilo remoto para que fuerze al programa ejecutar el código del hack
Entonces teniendo en cuenta lo leído acá:
http://foro.inexinferis.com/index.php?topic=6559.0
Lo que haremos será crear un driver que "hookée" la rutina NtCreateThread y detenga cualquier intento de crear un hilo desde otro programa hacia el juego:
(c):NTSTATUS NTAPI HOOK_ZwCreateThread(OUT PHANDLE ThreadHandle,IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle,OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext,IN PUSER_STACK UserStack, IN BOOLEAN CreateSuspended) { NTSTATUS lStatus; CHAR CurFileName[MAX_PATH]={0},ProcFileName[MAX_PATH]={0}; HANDLE CurrentPID=PsGetCurrentProcessId(); HANDLE ProcessHandleId=(HANDLE)GetProcessIdByHandle(ProcessHandle); PEPROCESS EProc; lStatus=PsLookupProcessByProcessId(CurrentPID,&EProc); if(lStatus==STATUS_SUCCESS) { ImageFileName(EProc,CurFileName); ObDereferenceObject(EProc); } lStatus=PsLookupProcessByProcessId(ProcessHandleId,&EProc); if(lStatus==STATUS_SUCCESS) { ImageFileName(EProc,ProcFileName); ObDereferenceObject(EProc); } if(!strcmp(_strlwr(ProcFileName),"hl.exe")) { if(CurrentPID==ProcessHandleId || !strcmp(_strlwr(CurFileName),"explorer.exe")) return pZwCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes, ProcessHandle,ClientId,ThreadContext,UserStack, CreateSuspended); else { DbgPrint("%s tried to create a remote thread in the game... ACCESS DENIED!!!\n",CurFileName); return STATUS_UNSUCCESSFUL; } } return pZwCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,ProcessHandle, ClientId,ThreadContext,UserStack,CreateSuspended); }
Este es un código muy simple, estoy seguro que se pueden bloquear mejor y de muchas otras formas las inyecciones...
El proyecto tanto el código fuente completo y los binarios de prueba se puede encontrar en el siguiente link:
DESCARGA
El código fue liberado bajo la GPL v3
B#