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.ONaja 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