EnumProcessModules - Nur ein Teil der ReadProcessMemory ..
Hey,
ich habe ein seltsames Problem. Mit folgendem Code versuche ich alle Module eines Prozesses zu ermitteln:
Delphi-Quellcode:
Unter XP funktioniert dies soweit, aber mein Vista X64 wirft mir folgende Meldung, wenn ich GetLastError abfrage:
var
hProcess: THandle; ModuleList: Array[0..511] of HMODULE; begin hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, Process^.ProcessId); if (hProcess <> 0) and (hProcess <> INVALID_HANDLE_VALUE) then begin try if EnumProcessModules(hProcess, @ModuleList, SizeOf(ModuleList), dwReturnLength) then begin Zitat:
Hat jemand eine Idee woran das liegen kann? Gruß Zacherl |
Re: EnumProcessModules - Nur ein Teil der ReadProcessMemory
Hi,
kannst du denn auch die Fehlernummer posten? Du bist dir sicher, dass du unter XP alle Informationen bekommst? Ich frage bezüglich der Privilegien deines Prozesses. Falls der nämlich nicht die richtigen Privilegien hat (z.B. DebugPrivilege) bekommst du z.B. keine/nicht alle Informationen zu System-Prozessen etc. Wie das mit Vista (und hier speziel der 64bit-Version) aussieht, kann ich so nicht sagen, mangels Testumgebung und Erfahrung. Probiers mal mit:
Delphi-Quellcode:
Bei mir funktionierts wunderbar (unter XP) für ALLE Informationen. Ich hatte mit dem DesiredAcces PROCESS_ALL_ACCESS auch schonmal Probleme. :gruebel:
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or GENERIC_READ, false, Process^.ProcessId);
Gruß BlackDragon |
Re: EnumProcessModules - Nur ein Teil der ReadProcessMemory
Ist das ein 64-Bit Prozess?
|
Re: EnumProcessModules - Nur ein Teil der ReadProcessMemory
Also unter XP funktioniert der Code wie gesagt wunderbar. Es liegt wirklich daran, dass der Zielprozess ein 64 Bit Prozess ist. Im MSDN habe ich bei einer Suche nach der Fehler Konstante die Beschreibung gefunden, nach der 64 Bit Module nicht aus einem 32 Bit Prozess aus aufgelistet werden können.
Hat diese Beschränkung irgendeinen Technischen Hintergrund oder kann man das irgendwie umgehen? Oder anders gefragt: Gibt es eine Möglichkeit die ImageBase der 'kernel32.dll' innerhalb eines anderen Prozesses auszumachen? Ich habe eine Routine gebastelt, die inline Hooks in anderen Prozessen wiederherstellen kann, indem die ersten 7 Bytes eines Exports mit den Originaldaten überschrieben werden. Dazu benötige ich leider die Basisadresse des Moduls. |
Re: EnumProcessModules - Nur ein Teil der ReadProcessMemory
In den allermeisten Fällen hat doch Kernel32.dll seine Preferred Image Base. Die einzige Ausnahme sollte sein, wenn irgendjemand ein Programm so kompiliert, dass es selbst diese Image Base belegt. Nun stellt sich eben die Frage, ob deine Routine "sicher" gegenüber einem Programm sein muss, welches absichtlich so kompiliert wurde.
Ich vermute mal, dass diese Einschränkung einen technischen Hintergrund hat, denn sie existiert auch bei den Toolhelp-Funktionen (das wäre meine nächste Anlaufstelle gewesen) und diversen anderen Funktionen, die Informationen von anderen Prozessen erfragen. Ansonsten einfach auf den 64-Bit-Compiler warten oder eine andere Sprache benutzen. |
Re: EnumProcessModules - Nur ein Teil der ReadProcessMemory
Zum einem könnte ich mir vorstellen, dass die Imagebaseddress an einer anderen Stelle iegt und zum anderen könnte ich mir vorstellen, dass Windows es einfach nicht zu lässt. NicoDE weiß hier bestimmt mehr.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz