AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) LoadedImage->OptionalHeader->ImageBase bei DLL anders als bei Exe?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von _BlackDragon_ · begonnen am 29. Jun 2012 · letzter Beitrag vom 4. Jul 2012
Antwort Antwort
_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, 15: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
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#2

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

  Alt 2. Jul 2012, 12:49
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
  Mit Zitat antworten Zitat
_BlackDragon_

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

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

  Alt 4. Jul 2012, 14:18
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.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 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