Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi EnumProcessModules - Nur ein Teil der ReadProcessMemory .. (https://www.delphipraxis.net/131156-enumprocessmodules-nur-ein-teil-der-readprocessmemory.html)

Zacherl 19. Mär 2009 18:01


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:
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
Unter XP funktioniert dies soweit, aber mein Vista X64 wirft mir folgende Meldung, wenn ich GetLastError abfrage:
Zitat:

[Window Title]
Kisikiller

[Content]
Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen

[OK]
Der Aufruf von EnumProcessModules schlägt zudem fehl.

Hat jemand eine Idee woran das liegen kann?

Gruß Zacherl

_BlackDragon_ 20. Mär 2009 10:23

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:
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or GENERIC_READ, false, Process^.ProcessId);
Bei mir funktionierts wunderbar (unter XP) für ALLE Informationen. Ich hatte mit dem DesiredAcces PROCESS_ALL_ACCESS auch schonmal Probleme. :gruebel:

Gruß

BlackDragon

Luckie 20. Mär 2009 10:31

Re: EnumProcessModules - Nur ein Teil der ReadProcessMemory
 
Ist das ein 64-Bit Prozess?

Zacherl 20. Mär 2009 15:23

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.

Apollonius 20. Mär 2009 15:40

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.

Luckie 20. Mär 2009 17:19

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