Einzelnen Beitrag anzeigen

_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#1

LoadedImage->OptionalHeader->ImageBase bei DLL anders als bei Exe?

  Alt 29. Jun 2012, 14:50
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?

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
  Mit Zitat antworten Zitat