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