SchwiegerSohn hat folgendes geschrieben: |
Das einzige was ich im WWW, und hier im board finde, ist
das unter 9x hooks auf die Kernel32 immer global sind..und das die DLL im shared memory liegt ( was ich überhaupt nicht blicke ).
|
Unter Windows 32Bit Systemen hat jeder Prozess seinen eigenen virtuellen Speicherbereich von (in der Regel) 4GB Größe. Der obere Bereich wird vom Betriebssystem genutzt, der untere Bereich ist dem User und laufenden Programmen zugänglich.
Für NT basierende Systeme: Wird eine DLL geladen, die bereits ein anderer Prozess geladen hat, zeigen die virtuellen Adressen zunächst auf die gleichen realen Adressen im Speicher. Wird nun in einem Prozess mittels WriteProcessMemory eine Änderung innerhalb der geladenen DLL vorgenommen, erscheint die Änderung nur in dem Prozess, in dessen Speicher auch geschrieben wurde, da der Bereich, in dem diese Änderung vorgenommen worden ist, einem neuen realen Speicher zugewiesen wird.
Unter Windows95/98/ME gibt es einen zusätzlichen Speicherbereich zwischen 2GB und 3GB, in dem virtuelle Adressen eines Prozesses
immer auf die gleichen realen Adressen verweisen. Was von einem Prozess in diesen Speicher geladen wird, erscheint in allen anderen Prozessen auch - und was in einem Prozess dort geändert wird erscheint ebenfalls in jedem anderen Prozess. Einige wichtige System DLL werden zum Beispiel in diesen Bereich geladen - unter anderem die KERNEL32, die USER32 und die GDI32 (alle DLLs mit negativem Handle - siehe
TNT).
Das Problem dabei: Willst du nur deinen Prozess hooken (bei den angegebenen DLLs mit negativem Handle), aber nicht alle anderen auch, ist das gar nicht möglich, da die für den Hook nötigen Änderungen innerhalb der DLL ja auch in den anderen Prozessen erscheinen. Ein Hook auf diese DLLs muss also immer global ausgeführt werden und kann nie lokal sein.
Der Vorteil dabei: Gelingt es mittels eines Tricks seine DLL, auf die die Hooks verweisen sollen, in diesen Speicherbereich zwischen 2GB und 3GB zu laden (ist möglich und habe ich schon in anderer Programmiersprache getan), muss die DLL gar nicht über SetWindowsHookEx injiziert werden, um einen globalen Hook auszuführen.
Ich hoffe, das ist einigermaßen verständlich.
PS: Das ist übrigens auch ein Grund dafür, dass es unter 95/98/ME so oft zu schweren Abstürzen kommt. Schreibt ein Programm "versehentlich" in diese Sperbereiche zwischen 2GB und 3GB erwischt es diese System-DLL und damit auch sämtliche anderen laufenden Programme.
Gruß
AHT