Ich versuche die geladene Adresse einer ELF-Binärdatei zu erhalten, aber dlopen
nicht arbeite wie erwartet:
Er gibt 0xb772d918
aus, aber von dem /proc/1510/maps
sagt, dass er nicht auf die geladene Adresse der dlfn
-Datei zeigt, sondern auf die ld-2.15.so
,
Gibt es anders als das Parsen von /proc/pid/maps
eine Möglichkeit, die geladene Adresse einer ELF-Binärdatei abzurufen? (0x0848000 in diesem Fall)
Unter Linux gibt dlopen
nicht die Adresse zurück, an der die ELF-Binärdatei geladen wurde. Es gibt stattdessen struct link_map
zurück, das .l_addr
member hat. Du willst also etwas wie:
Trotz des Kommentars in /usr/include/link.h
ist .l_addr
jedoch auch keine Ladeadresse. Stattdessen ist es die Differenz zwischen wo und ELF-Bild geladen wurde, und wo es tatsächlich geladen wurde.
Für nicht ausführbare PIE-Hauptdateien ist diese Differenz immer 0. Bei nicht vorgemerkener gemeinsam genutzter Bibliothek ist diese Differenz immer die Ladeadresse (weil nicht vorgelagerte gemeinsam genutzte ELF-Bibliotheken zum Laden unter Adresse 0 verknüpft sind).
Wie finden Sie die Basisadresse der Hauptdatei? Die einfachste Methode ist es, diesen Code (in die Hauptdatei ausführbar) zu verwenden:
%Vor%Hier ist, was Sie auf 32-Bit-System sehen sollten:
%Vor% (Die letzte Adresse: 0xf779a000
wird von Lauf zu Lauf variieren, wenn Sie die Adressrandomisierung aktiviert haben (wie Sie sollten)).