NtQuerySystemInformation -- Speicherzugriffsfehler



  • Hi ich bins wieder 😉
    Da heute das Wochenende angefangen hat hatte ich wieder Zeit zum coden,
    und wollte NtQuerySystemInformation benutzen,nur leider klappt das nicht so
    richtig.

    In google hab ich verschiedene _SYSTEM_PROCESS_INFORMATION Strukturen gefunden,ich verwende die von der MSDN.

    Auch den Rest des Codes hab ich ausm Netz/selbst gecodet.

    Und hier ist der Output:

    33032 << Return von NtQuerySystemInformation benutzen
    Ÿ << Name des 1. Prozesses (schaut nachm Idle Prozess aus)
    312 << der 1. NextEntryOffset
    Ÿ << Name des 2. Prozesses (schaut nachm Idle Prozess aus)
    1698929696 << der 2. NextEntryOffset,viel zu groß

    Naja und danach stürzts ab,wie solls auch anders sein,der Prozess will bei
    info+1698929696+312 lesen o.O

    Naja hier noch der Code,und schon mal
    vielen Dank für jeden Tipp,
    Xalon

    #include <windows.h>
    #include <iostream>
    #include <psapi.h>
    
    #define SystemProcessInformation 5
    
    using namespace std;
    
    typedef struct _SYSTEM_PROCESS_INFORMATION {
        ULONG NextEntryOffset;
        ULONG NumberOfThreads;
        BYTE Reserved1[48];
        PVOID Reserved2[3];
        HANDLE UniqueProcessId;
        PVOID Reserved3;
        ULONG HandleCount;
        BYTE Reserved4[4];
        PVOID Reserved5[11];
        SIZE_T PeakPagefileUsage;
        SIZE_T PrivatePageCount;
        LARGE_INTEGER Reserved6[6];
    } SYSTEM_PROCESS_INFORMATION;
    
    int main(void)
    {
     ULONG needed;
    
     typedef DWORD (CALLBACK* NTQUERYSYSTEMINFORMATION)(  DWORD, void*, ULONG, PULONG   );
     char buf[50000];
    
     HINSTANCE hDLL = LoadLibrary("Ntdll.dll");
     NTQUERYSYSTEMINFORMATION NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(hDLL,"NtQuerySystemInformation");   
    
     NtQuerySystemInformation(SystemProcessInformation,buf,sizeof(buf),&needed);
     SYSTEM_PROCESS_INFORMATION* info;
     info = (SYSTEM_PROCESS_INFORMATION*)buf;
    
     cout << needed << endl; 
     char exename[1024];
     HMODULE hMod;
     DWORD cbNeeded;
    
     while(1)
     {
     HANDLE victim = info->UniqueProcessId;
     EnumProcessModules( victim, &hMod, sizeof(hMod),&cbNeeded);
     GetModuleBaseName( victim, hMod, exename,sizeof(exename));
     cout << exename << endl;
     cout << info->NextEntryOffset << endl;
     if (info->NextEntryOffset == 0)
      break;
     sizeof(BYTE)*48 + sizeof(PVOID)*3 + sizeof(HANDLE);
     info += info->NextEntryOffset;
     }
     system("pause");
     return 0;    
    }
    


  • Pointerarithmetik ! 🙂

    "info += info -> NextEntryOffset" erhöht "info" um ( (info -> NextEntryOffset) * sizeof (SYSTEM_PROCESS_INFORMATION) ).

    Vorschlag :

    unsigned int index = 0;
     ...
     while (1) {
      ...
      info = (SYSTEM_PROCESS_INFORMATION *) &buf [index];
      ...
      if ( info -> NextEntryOffset == 0 ) { break; }
      index += info -> NextEntryOffset;
     }
    


  • Ahh Danke,scheint zu klappen 🙂
    Jetzt hab ich nur noch ein Problem:
    Wie komm ich an den .exe Name?

    EnumProcessModules( info->UniqueProcessId, &hMod, sizeof(hMod),&cbNeeded);
     GetModuleBaseName( info->UniqueProcessId, hMod, exename,sizeof(exename));
    

    gibt immmer Ÿ zurück.

    Und bei

    HANDLE hndl =  OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, FALSE, info->UniqueProcessId);
     EnumProcessModules( hndl, &hMod, sizeof(hMod),&cbNeeded);
     GetModuleBaseName( hndl, hMod, exename,sizeof(exename));
    

    mekert er immmer das ihm der Typ nicht passt 😕

    Benutz ich überhaupt die richtige _SYSTEM_PROCESS_INFORMATION wenn ich
    NtQuerySystemInformation mit SystemProcessInformation (#defined als 5) aufrufe?

    Schon mal vielen Dank 🙂

    Xalon



  • Die "SYSTEM_PROCESS_INFORMATION" enthält einen Fehler :

    Member "HANDLE UniqueProcessId" ist in "Wirklichkeit" ein "DWORD UniqueProcessId". 🙂



  • Tatsächlich,Danke 🙂

    Das Microsoft nicht mal sowas auf die Reihe bekommt? Ich mein ich hab das 1:1 aus
    der msdn ...

    Xalon


Anmelden zum Antworten