Offene Handles auflisten mit NtQuerySystemInformation



  • Hallo zusammen,

    ich bin nun seit einiger Zeit bemüht, diese Überschrift umzusetzen...
    Ich glaube aber auch, dass mein Code an einigen Stellen fehlerhaft ist. Das kann ich aber nicht so leicht überprüfen, da die "Nt"-Funktionen, ja nicht sooo ordentlich dokumentiert sind...
    Ich poste jetzt einfach mal meinen Code samt Fehler, wäre klasse, wenn mir jemand helfen könnte...

    typedef struct _SYSTEM_HANDLE_ENTRY 
    {
    	UINT32  OwnerPid;
    	BYTE   ObjectType;
    	BYTE   Flags;
    	UINT16 Handle;
    	PVOID  Object;
    	ACCESS_MASK  AccessMask;
    } SYSTEM_HANDLE_ENTRY, *PSYSTEM_HANDLE_ENTRY;
    typedef struct _SYSTEM_HANDLE_INFORMATION 
    {
    	UINT32               Count;
    	SYSTEM_HANDLE_ENTRY Handle[1];
    }SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
    
    typedef NTSTATUS (WINAPI *T_NtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, UINT32, UINT32*);
    typedef NTSTATUS (WINAPI *T_NtQueryObject)(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, UINT32, UINT32*);
    //...
    void blub(UINT32 pid)
    {
    PSYSTEM_HANDLE_INFORMATION handle_info;
    T_NtQuerySystemInformation NtQuerySystemInformation;
    T_NtQueryObject NtQueryObject;
    UINT32 mem;
    NTSTATUS ret;
    UINT32* ptr; 
    
    NtQuerySystemInformation = (T_NtQuerySystemInformation)GetProcAddress(LoadLibrary(L"NTDLL"),"NtQuerySystemInformation");
    NtQueryObject = (T_NtQueryObject)GetProcAddress(LoadLibrary(L"NTDLL"),"NtQueryObject");
    if((!NtQuerySystemInformation) || (!NtQueryObject)){
    	return;
    }
    
    mem = 4;
    ptr = (UINT32*)Memory::Alloc(mem, TRUE);
    
    while(1)
    {
    	ret = NtQuerySystemInformation(SystemHandleInformation, ptr, mem, &mem);
    	if(ret != STATUS_SUCCESS){
    		if(ret == STATUS_INFO_LENGTH_MISMATCH){
    			ptr = (UINT32*)Memory::ReAlloc(ptr, mem, TRUE);
    		}
    		else{
    			return;
    		}
    	}
    	else{
    		break;
    	}
    }
    
    handle_info = (PSYSTEM_HANDLE_INFORMATION)(ptr + 1);
    UINT count = handle_info->Count;
    
    for(UINT i = 0; i < handle_info->Count - 1; ++i)
    {
    	_SYSTEM_HANDLE_ENTRY handle = handle_info->Handle[i]; //Zugriffsverletzung
    	if(handle.OwnerPid != ProcessId)
    		continue;
    }
    Memory::Free(ptr);
    }
    

Log in to reply