Was ist der LD_PRELOAD-Trick?

Lesezeit: 5 Minuten

Benutzeravatar von Hank Gay
Hank Gay

Ich bin kürzlich auf einen Hinweis darauf gestoßen proggit und (bis jetzt) ​​wird es nicht erklärt.

Ich vermute, dass es daran liegen könnte, bin mir aber nicht sicher.

  • Nicht wirklich eine Antwort, also werde ich sie nicht als eine posten, aber … Stephen Kell verwendet LD_PRELOAD in diesem Video für seine Liballocs-Bibliothek, und wenn Sie sich die vorherigen Teile ansehen, können Sie besser verstehen, wie / warum. liballocs scheint verwendet zu werden, damit andere dynamische Sprachen miteinander kommunizieren können. In diesem Vortrag werden einige tiefe Interna erklärt. youtu.be/LwicN2u6Dro?t=24m10s

    – Elijah Lynn

    29. Februar 2016 um 12:30 Uhr


Benutzeravatar von JesperE
JesperE

Wenn Sie einstellen LD_PRELOAD zum Pfad eines gemeinsam genutzten Objekts, wird diese Datei geladen Vor jede andere Bibliothek (einschließlich der C-Laufzeit, libc.so). Also laufen ls mit deinem besonderen malloc() Umsetzung, tun Sie dies:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls

  • Ich hatte keine Ahnung, dass es so etwas gibt … es scheint, als wäre es ein wichtiger Vektor für Sicherheitsangriffe. Hast du eine Ahnung wie das gesichert ist?

    – rméador

    8. Januar 2009 um 22:25 Uhr

  • Es wird durch die Tatsache gesichert, dass der Lader LD_PRELOAD ignoriert, wenn ruid != euid — Joshua

    – Josua

    8. Januar 2009 um 22:30 Uhr

  • @Joshua: was sind ruid und euid?

    – heinrich5991

    4. November 2012 um 10:27 Uhr

  • @heinrich5991 Echte und effektive Benutzer-IDs: lst.de/~okir/blackhats/node23.html

    – gsx

    2. März 2013 um 6:22 Uhr

  • Eine wichtige Sache, die Sie im Hinterkopf behalten sollten: Normalerweise möchten Sie eine angeben absolut Weg nach LD_PRELOAD. Der Grund dafür ist, dass es sich um eine Umgebungsvariable handelt, die von untergeordneten Prozessen geerbt wird, die möglicherweise ein anderes Arbeitsverzeichnis als der übergeordnete Prozess haben. Daher würde jeder relative Pfad die vorab zu ladende Bibliothek nicht finden.

    – Frerich Raabe

    10. September 2013 um 11:36 Uhr

Joshuas Benutzeravatar
Josua

Sie können Symbole in den Materialbibliotheken überschreiben, indem Sie eine Bibliothek mit denselben Symbolen erstellen und die Bibliothek in angeben LD_PRELOAD.

Einige Leute verwenden es, um Bibliotheken an nicht standardmäßigen Orten anzugeben, aber LD_LIBRARY_PATH ist dafür besser geeignet.

  • “Einige Leute verwenden es, um Bibliotheken an nicht standardmäßigen Orten anzugeben” … Wirklich? Klingt nach “Manche Leute verwenden es falsch”!

    – Tom

    10. Juni 2011 um 7:52 Uhr

  • LD_PRELOAD kann aufgrund der Ladereihenfolge anwendungsspezifische hartcodierte Pfade abfangen.

    – Josua

    10. Juni 2011 um 16:05 Uhr

  • Wäre es ein Missbrauch, eine andere vorzuladen Ausführung einer Bibliothek – vorausgesetzt, sie sind kompatibel?

    – z0r

    26. November 2013 um 7:17 Uhr

  • Ich habe gesehen, dass es verwendet wurde, um eine Debug- oder instrumentierte Variante zu laden, oder um eine Bibliothek zu laden, die etwas völlig radikal anderes als die Basisbibliothek macht, als ob sie ein anderes System emulieren würde.

    – Josua

    26. November 2013 um 15:35 Uhr

  • Für den Fall, dass Bibliotheken nicht korrekt kompiliert werden (früher ist dies bei mysql immer wieder aufgetreten, wo es eine lose Kopplung zu einem generischen libmysql_client hatte, der den Symlink einer älteren Version überschrieb – je nachdem, welche Version von Perl Sie verwendet haben, mussten Sie angeben / erzwingen Sie es mit LD_PRELOAD.. nützlicher Trick. Wenn ich mich richtig erinnere, verwendet Valgrind diese Technik, um Binärdateien Debugging-Fähigkeiten bereitzustellen, ohne dass sie neu kompiliert werden müssen.

    – Synthesizerpatel

    27. Februar 2014 um 10:04 Uhr

Benutzeravatar von Patric
Patrick

Wie viele Leute erwähnt haben, mit LD_PRELOAD Bibliothek vorab zu laden. Kannst du übrigens ÜBERPRÜFEN wenn die Einstellung verfügbar ist ldd Befehl.

Beispiel: Angenommen, Sie müssen Ihre eigene vorab laden libselinux.so.1.

> ldd /bin/ls
    ...
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)

Stellen Sie also Ihre Vorladeumgebung ein:

export LD_PRELOAD=/home/patric/libselinux.so.1

Überprüfen Sie Ihre Bibliothek erneut:

>ldd /bin/ls
    ...
    libselinux.so.1 =>
    /home/patric/libselinux.so.1 (0x00007fb9245d8000)
    ...

Benutzeravatar von Ronny Brendel
Ronny Brendel

Mit LD_PRELOAD Sie können Bibliotheken Vorrang geben.

Sie können beispielsweise eine Bibliothek schreiben, die implementiert malloc und free. Und indem Sie diese mit laden LD_PRELOAD dein malloc und free statt der standardmäßigen ausgeführt werden.

Benutzeravatar von Rajesh
Rajesh

LD_PRELOAD listet gemeinsam genutzte Bibliotheken mit Funktionen auf, die den Standardsatz überschreiben, genauso wie /etc/ld.so.preload tut. Diese werden vom Lader implementiert /lib/ld-linux.so. Wenn Sie nur einige wenige ausgewählte Funktionen überschreiben möchten, können Sie dies tun, indem Sie eine überschreibende Objektdatei und Einstellung erstellen LD_PRELOAD; die Funktionen in dieser Objektdatei überschreiben nur diese Funktionen und lassen andere unverändert.

Weitere Informationen zu gemeinsam genutzten Bibliotheken finden Sie unter
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Exportieren mylib.so zu env:

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

So deaktivieren Sie es:

$ unset LD_PRELOAD

Benutzeravatar von asn
asn

Hier ist ein ausführlicher Blogbeitrag über das Vorladen:

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/

  • Danke, dass du deine Antwort gepostet hast! Bitte beachten Sie, dass Sie die wesentlichen Teile der Antwort hier auf dieser Website veröffentlichen sollten, da Ihr Beitrag sonst gelöscht werden könnte. Siehe FAQ, wo Antworten erwähnt werden, die „kaum mehr als ein Link“ sind. Sie können den Link trotzdem einfügen, wenn Sie möchten, aber nur als „Referenz“. Die Antwort sollte für sich alleine stehen, ohne dass der Link benötigt wird.

    – Tarin

    6. Oktober 2014 um 11:20 Uhr

1427750cookie-checkWas ist der LD_PRELOAD-Trick?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy