Co to jest LD PRELOAD trick?

Natknąłem się na odniesienie do niego niedawno na proggit i (na razie) nie jest wyjaśnione.

Podejrzewam to może być to, ale nie wiem na pewno.

Author: Community, 2009-01-08

9 answers

Jeśli ustawisz LD_PRELOAD na ścieżkę współdzielonego obiektu, plik ten zostanie załadowany przed jakąkolwiek inną biblioteką (w tym runtime C, libc.so). Aby uruchomić {[3] } ze swoją specjalną implementacją malloc(), zrób to:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
 438
Author: JesperE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-29 20:25:57

Możesz nadpisać symbole w bibliotekach stockowych, tworząc bibliotekę z tymi samymi symbolami i określając bibliotekę w LD_PRELOAD.

Niektórzy używają go do określania bibliotek w niestandardowych lokalizacjach, ale LD_LIBRARY_PATH jest do tego lepszy.

 52
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-24 01:12:19

Z LD_PRELOAD możesz nadać bibliotekom pierwszeństwo.

Na przykład możesz napisać bibliotekę, która zaimplementuje malloc i free. I ładując je za pomocą LD_PRELOAD Twoje malloc i free zostaną wykonane zamiast standardowych.

 40
Author: Ronny Brendel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-17 15:36:00

Jak Wiele osób wspomniało, używając LD_PRELOAD do wstępnego załadowania biblioteki. BTW, możesz sprawdzić Jeśli ustawienie jest dostępne za pomocą polecenia ldd.

Przykład: załóżmy, że musisz wstępnie załadować swój własny 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)

Tak więc, ustaw środowisko preload:

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

Sprawdź ponownie bibliotekę:

>ldd /bin/ls
    ...
    libselinux.so.1 =>
    /home/patric/libselinux.so.1 (0x00007fb9245d8000)
    ...
 34
Author: Patric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 08:36:43

LD_PRELOAD wyświetla listę bibliotek współdzielonych z funkcjami, które nadpisują standardowy zestaw, tak jak robi to /etc/ld.so.preload. Są one zaimplementowane przez loader /lib/ld-linux.so. Jeśli chcesz nadpisać tylko kilka wybranych funkcji, możesz to zrobić, tworząc nadpisujący plik obiektowy i ustawiając LD_PRELOAD; funkcje w tym pliku obiektowym nadpisają tylko te funkcje, pozostawiając inne takie, jakie były.

Więcej informacji na temat bibliotek współdzielonych można znaleźć na stronie http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

 9
Author: Rajesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-24 01:11:58

Łatwo jest wyeksportować mylib.so do env:

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

Aby wyłączyć:

$ export LD_PRELOAD=
 4
Author: JulienGenoud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 12:46:33

Oto szczegółowy wpis na blogu o ładowaniu wstępnym:

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

 3
Author: asn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-11 10:11:33

Gdy używany jest LD_PRELOAD, plik zostanie załadowany przed jakimkolwiek innym $export LD_PRELOAD=/path/lib lib być wstępnie załadowany, nawet to może być używane w programach zbyt

 2
Author: Sumith Senarathne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-30 16:29:39

Używając ścieżki LD_PRELOAD, możesz wymusić, aby program ładujący aplikacje załadował podany obiekt współdzielony, nad podanym domyślnym.

Deweloperzy używają tego do debugowania swoich aplikacji poprzez dostarczanie różnych wersji udostępnionych obiektów.

Użyliśmy go do hakowania niektórych aplikacji, nadpisując istniejące funkcje za pomocą przygotowanych obiektów współdzielonych.

 1
Author: dnahc araknayirp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-31 03:16:17