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/)
-   -   LoadedImage->OptionalHeader->ImageBase bei DLL anders als bei Exe? (https://www.delphipraxis.net/169115-loadedimage-optionalheader-imagebase-bei-dll-anders-als-bei-exe.html)

_BlackDragon_ 29. Jun 2012 14:50

LoadedImage->OptionalHeader->ImageBase bei DLL anders als bei Exe?
 
Hi an die Community,

ich beschäftige mich momentan mit dem PE File Format und bin dabei mir eine Klassenstruktur zu entwickeln und auch schon relativ gut vorangekommen. Nun musste ich bei Tests aber feststellen, dass die Art und Weise, wie ich z.B. den TImageDosHeader ermittle, nicht immer funktioniert. Momentan löse ich das wie folgt:


Delphi-Quellcode:
...
    if MapAndLoad(PAnsiChar(FPath), nil, @FImage, false, true) then
    try
      FImageBase := FImage.FileHeader^.OptionalHeader.ImageBase;
...

Das funktioniert soweit. Um nun den TImageDosHeader auszulesen, nutze ich folgenden Ablauf:


Delphi-Quellcode:
...
  pDosHeader := PImageDosHeader(PEImage.ImageBase);
...
ImageBase enthält hier den Wert, der im ersten Abschnitt gesetzt wurde.

Das funktionierte bei den Exe-Dateien, die ich getestet hab. Da ich mich aber nun an die Implementierung der Export-Section machen wollte, nutzte ich zum testen einige DLLs aus dem Windows-Verzeichnis (z.B. ImageHlp und WtsApi) und musste feststellen, dass an der Stelle, wohin ImageBase verweist, leider nicht die Struktur für TImageDosHeader liegt und mir das ganze mit einer Zugriffsverletzung um die Ohren fliegt.

Verwende ich allerdings LoadLibrary und ermittle den TImageDosHeader, funktioniert das ganze.


Delphi-Quellcode:
...
  FImageBase := LoadLibrary(PAnsiChar(FPath));
  // wts-api.dll -> LoadLibrary = 737C0000
  //             -> OptionalHeader.ImageBase = 3FD00000
...

Gibt es dafür eine Erklärung, bzw. welche? :wink:

Ich weiß, es gibt einen anderen Weg via. CreateFile, CreateFileMapping und MapViewOfFile, aber laut Dokumentation und diverser Artikel im Netz, macht MapAndLoad intern das gleiche. Oder irre ich mich da?

Freu mich auf Antworten.

Gruß Olli

brechi 2. Jul 2012 11:49

AW: LoadedImage->OptionalHeader->ImageBase bei DLL anders als bei Exe?
 
ImageBase gibt nur an, wo die DLL am besten - ohne Anpassung der Relocations - geladen werden kann. Dies muss nicht zwingend vom Loader auf die im tatsaechlich geladenen Adresse abgeaendert werden.
Fuer dein Vorhaben brauchst du die doch aber gar nicht...

Wenn du diese trotzdem ermitteln willst, kannst du folgendes verwenden

Hack: PImageDosHeader(Integer(_LOADED_IMAGE.FileHeader) and $FFFFF000)
Sauberer?: PImageDosHeader(LOADED_IMAGE.MappedAddress))

-> google MapAndLoad hilft, gibts viele Units die genau das schon machen

_BlackDragon_ 4. Jul 2012 13:18

AW: LoadedImage->OptionalHeader->ImageBase bei DLL anders als bei Exe?
 
Super danke, ich werds mir in Ruhe ansehen, wenn ich etwas mehr Zeit habe. Getestet hab ich es schon kurz und ist genau das, was ich suchte. Nun muss ich es für mich nur noch nachvollziehen können und dafür noch ein wenig lesen. Sobald ich die Zeit dafür finde. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 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