les dejo una función que les puede servir tanto para hacer hook en las IRP_MJ_XXX u ocultar Objetos en modo kernel
y si quieren también se los listara. Con mínimas modificaciones
GetPointerObjet proc PNDirObjet:PUNICODE_STRING,PNObjet:dword
LOCAL buff[260]:byte
LOCAL handel
LOCAL pDrectoriObject
LOCAL DirectoryEntry
LOCAL DirObjet:OBJECT_ATTRIBUTES
LOCAL count:dword
LOCAL resul
push edx
push ebx
push ecx
lea ebx,DirObjet
InitializeObjectAttributes ebx,PNDirObjet ,OBJ_CASE_INSENSITIVE,NULL,NULL
lea edx,[handel]
push edx
push null
push 80000000h
push null
push KernelMode
push null
push ebx
call ObOpenObjectByName ;Abro el directorio de objetos
lea edx,[pDrectoriObject]
push NULL
push edx
push KernelMode
push null
push FILE_ANY_ACCESS
push [handel]
call ObReferenceObjectByHandle ;Consigo un puntero a partir del Handle
xor ecx,ecx
mov [count],ecx
mov eax,[pDrectoriObject]
HASH_BUCKETS:
movzx ecx,word ptr[count]
cmp dword ptr[eax+ecx*4],0
je fin
mov eax,[pDrectoriObject]
mov ebx,[eax+ecx*4] ;ebx = pDrectoriObject->HashBuckets[Bucket]
ChainLink:
mov DirectoryEntry,ebx
mov ebx,[ebx+4] ;ebx = ebx->Object ;HashBuckets _OBJECT_DIRECTORY_ENTRY
lea ebx,[ebx- 18h] ;OBJECT_TO_OBJECT_HEADER
assume ebx:ptr _OBJECT_HEADER
movzx edx,byte ptr[ebx].NameInfoOffset
sub ebx,edx ;OBJECT_HEADER_TO_NAME_INFO
lea edx,[ebx+4] ;NAME_INFO->name
assume ebx:nothing
lea edi,buff
push edi
push edx
call UnicodeStrToAsciiStr ;Combierte de UNICODE_STRING a cadena ASCII
push edi
push PNObjet
call cmpsrt
cmp eax,0
je encontrado
mov ebx,DirectoryEntry
mov ebx,[ebx]
cmp ebx,0 ;comprueva si es un puntero NULL
jne ChainLink
fin:
inc count
mov eax,[pDrectoriObject]
cmp count,37 ;Comprueva si ha llegado al limite
jne HASH_BUCKETS
xor eax,eax ;Si no encuentra coincidencias devuelve NULL
jmp error
encontrado:
mov ebx,DirectoryEntry
mov eax,[ebx+4]
lea ebx,[eax-18h]
inc dword ptr[ebx] ;Aumento la cuenta del puntero al Objeto para que no sea borrado
error:
mov resul,eax
push pDrectoriObject
call ObDereferenceObject
push [handel]
call ZwClose
mov eax,resul
pop ecx
pop ebx
pop edx
ret
GetPointerObjet endp