Via ReadProcessMemory Pfad und Parameter eines Prozesses bekommen
-
Hi, weiß einer wie das geht?
Ich habe gehört, dass man an einer bestimmten Stelle lesen muss, und da stehen dann der Pfad und die Parameter des Prozesses.
-
Hm gehen sollte das theoretisch schon, allerdings musst Du ja wissen, *wo* Du den Prozess-Speicher auslesen musst. Mir ist kein Weg bekannt, wie man an diese Adresse kommen soll
.
-
Es gibt entsprechende Funktionen dafür:
Für Vista QueryFullProcessImageName!
XP GetProcessImageFileName!Obsolete müsste aber gehen: NtQueryInformationProcess (sollte mit LoadLibrary/GetProcAddress benutzt werden)
-
Das hört sich gut an:
GetProcessImageFileName
Retrieves the name of the executable file for the specified process.Danke, aber wie macht man das mit den Parametern?
-
Man gibt sie an und bekommt ein Ergebnis...
Welche Parameter bei welcher Funktion bereiten Dir Schwierigkeiten?
-
Ne, ich meine, die Parameter eines Prozesses auslesen ^^
-
Hmmm... Ich vermute, dazu musst Du eine DLL in den anderen Prozess injezieren um GetCommandLine auszuführen.
Was anderes fällt mir dazu jetzt nicht ein.
Wofür benötigst Du die Infos?
-
Nicht immer gleich mit Kanonen auf Spatzen schiessen...
Das "einfachste" ist WMI mit Win32_Process
Da kommt z.B. sowas raus:Caption: WINWORD.EXE [b]CommandLine: "C:\Programme\Microsoft Office\OFFICE11\WINWORD.EXE" -Embedding[/b] CreationClassName: Win32_Process CreationDate: 20070717112000.390625+120 CSCreationClassName: Win32_ComputerSystem CSName: PIV3200 Description: WINWORD.EXE ExecutablePath: C:\Programme\Microsoft Office\OFFICE11\WINWORD.EXE Handle: 3644 HandleCount: 410 KernelModeTime: 57812500 MaximumWorkingSetSize: 1413120 MinimumWorkingSetSize: 204800 Name: WINWORD.EXE OSCreationClassName: Win32_OperatingSystem OSName: Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1 OtherOperationCount: 8374 OtherTransferCount: 333916 PageFaults: 36330 PageFileUsage: 32206848 ParentProcessId: 2176 PeakPageFileUsage: 40337408 PeakVirtualSize: 278630400 PeakWorkingSetSize: 65769472 Priority: 8 PrivatePageCount: 32206848 ProcessId: 3644 QuotaNonPagedPoolUsage: 15760 QuotaPagedPoolUsage: 149716 QuotaPeakNonPagedPoolUsage: 18560 QuotaPeakPagedPoolUsage: 202636 ReadOperationCount: 1503 ReadTransferCount: 5872832 SessionId: 2 ThreadCount: 8 UserModeTime: 91718750 VirtualSize: 199839744 WindowsVersion: 5.1.2600 WorkingSetSize: 58900480 WriteOperationCount: 11368 WriteTransferCount: 7569554
-
Na sie mal an. Danke! Ich vergesse WMI zu oft.
Wäre jetzt die interessante Frage wie WMI es macht...
-
WMI läuft ja im Kernel und kann alles
-
Was ist "WMI"?
Und wie kann ich damit etwas machen? ._.
-
Die Frage ist ja erstmal ob du das mit deinem eigenen oder einem anderen Prozess machen willst? Wenns dein eigener sein soll und du unbedingt das mit ReadProcessMemory machen willst, kannst du deinen Process Environment Block auslesen. Falls es ein anderer Prozess sein soll, musst du zuerst deinen Code irgendwie im anderen Prozess zum laufen bekommen und dann das gleiche machen.
Aber warum willst du es denn unbedingt so umständlich machen, wenn es dafür sowieso fertige Funktionen für gibt?
-
-
Hallo
Hab extra diesen Thread rausgekramt, wollte keinen neuen erstellen.
Habe ähnliches Problem, habe eine PID dessen handle ich per OpenProcess() bekomme.
Nur wie komme ich an die executable bzw. nur der Name (ich will nichts manipulieren etc.).Ich habe es mit GetProcessImageFileName versucht - aber bekomme nur zerstückeltes bzw. gar kein richtigen Namen im Pointer.
Habe OpenProcess mit 0x1000 besetzt, allerdings scheint das bei XP ja nicht zureichen denn man muss 0x0400 Rechte haben?
Dann stürzt das Programm aber ab (sind ja irgendwelche PIDs und nichts was ich unter dem user etc. ausgeführt hätte).
Wie mache ich das denn am einfachsten, hier wurde ja von WMI gesprochen ist das auch die Lösung für mich?Gibt es keinen einfachen Weg nur den Namen der Executable zu bekommen, sollte unter XP und Vista funktionieren.
-
GetProcessImageFileName, QueryFullProcessImageName
-
@ascda
Naja dein Post beantwortet in keinsterweise meine Frage.
-
sicher tut er das. wenn du irgendwelche "zerstückelten" strings bekommst, machst du wohl was falsch. schonmal was von GetLastError gehört und MSDN mal durchlesen wäre auch ned schlecht, ich wette nämlich es liegt an OpenProcess
-
sicher tut er das. wenn du irgendwelche "zerstückelten" strings bekommst, machst du wohl was falsch. schonmal was von GetLastError gehört und MSDN mal durchlesen wäre auch ned schlecht, ich wette nämlich es liegt an OpenProcess
Ja schon klar, aber das war doch meine Frage - der Rückgabewert ist 0 ich weiß das es an OpenProcess liegt
Aber die Frage für mich ist, wie geht es nun?Auf XP exitiert dieses Recht nicht "PROCESS_QUERY_LIMITED_INFORMATION (0x1000)" - man soll "PROCESS_QUERY_INFORMATION (0x0400)" nutzen.
Das Problem ist es ist kein Prozess den ich erstellt habe, sondern irgendeiner ich kann das Recht also nicht bekommen - wie komme ich also an den Prozessnamen?
Das ist meine Frage die ganze Zeit
-
Hallo,
Therion schrieb:
Das Problem ist es ist kein Prozess den ich erstellt habe, sondern irgendeiner ich kann das Recht also nicht bekommen - wie komme ich also an den Prozessnamen?
Das ist meine Frage die ganze ZeitVielleicht übersehen?:
MSDN-Doku schrieb:
Remarks
To open a handle to another another process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.Alternative:
CreateToolhelp32Snapshot, Liste durchgehen, und PROCESSENTRY32-Struktur auswerten.
MfG,
Probe-Nutzer