LD_PRELOAD ट्रिक क्या है?


342

मैं पर हाल ही में इसे करने के लिए एक संदर्भ में आए proggit और (अब तक) यह नहीं समझाया गया है।

मुझे शक है कि यह हो सकता है, लेकिन मुझे यकीन नहीं है।


1
वास्तव में एक जवाब नहीं है इसलिए मैं इसे एक के रूप में पोस्ट नहीं करूंगा ... स्टीफन केल इस वीडियो में अपने liballocs पुस्तकालय के लिए LD_PRELOAD का उपयोग कर रहा है और यदि आप पिछले बिट्स देखते हैं तो आपको समझ में आ सकता है कि कैसे / क्यों। ऐसा लगता है कि अन्य गतिशील भाषाएं एक-दूसरे से बात कर सकती हैं। इस बात को कुछ गहरे इंटर्नल ने समझाया है। youtu.be/LwicN2u6Dro?t=24m10s
एलिजा लिन

जवाबों:


415

यदि आप LD_PRELOADसाझा किए गए ऑब्जेक्ट के पथ पर जाते हैं, तो वह फ़ाइल किसी भी अन्य लाइब्रेरी (C रनटाइम सहित ) से पहले लोड की जाएगी libc.so। तो lsअपने विशेष malloc()कार्यान्वयन के साथ चलने के लिए , यह करें:

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

12
मुझे पता नहीं था कि यह अस्तित्व में है ... ऐसा लगता है कि यह सुरक्षा हमलों के लिए एक प्रमुख वेक्टर होगा। किसी भी विचार यह कैसे सुरक्षित है?
rmeador

141
यह इस तथ्य से सुरक्षित है कि अगर लोडर LD_PRELOAD की अनदेखी करेगा तो बर्बाद हो जाएगा! = Euid - यहोशू
जोशुआ

18
@ जोशुआ: क्या बर्बाद और यूरोप हैं?
Heinrich5991

20
@ heinrich5991 असली और प्रभावी उपयोगकर्ता आईडी: lst.de/~okir/blackhats/node23.html
gsingh2011

59
एक महत्वपूर्ण बात ध्यान में रखना: आप आमतौर पर एक पूर्ण पथ निर्दिष्ट करना चाहते हैं LD_PRELOAD। कारण यह है कि यह एक पर्यावरण चर रहा है, यह बाल प्रक्रियाओं द्वारा विरासत में मिला है - जिसमें मूल प्रक्रिया की तुलना में एक अलग कार्यशील निर्देशिका हो सकती है। इसलिए कोई भी सापेक्ष पथ लाइब्रेरी को प्रीलोड करने में विफल रहेगा।
Frerich Raabe

49

आप एक ही प्रतीक के साथ एक पुस्तकालय बनाकर और पुस्तकालय को निर्दिष्ट करके स्टॉक पुस्तकालयों में प्रतीकों को ओवरराइड कर सकते हैं LD_PRELOAD

कुछ लोग इसका उपयोग गैर-मानक स्थानों में पुस्तकालयों को निर्दिष्ट करने के लिए करते हैं, लेकिन LD_LIBRARY_PATHउस उद्देश्य के लिए बेहतर है।


17
"कुछ लोग इसे गैरमानक स्थानों में पुस्तकालयों को निर्दिष्ट करने के लिए उपयोग करते हैं" ... वास्तव में? लगता है "कुछ लोग इसका गलत उपयोग करते हैं"!
टॉम

6
LD_PRELOAD लोड ऑर्डर इंटरसेप्ट एप्लिकेशन-निर्दिष्ट हार्डकोड मार्गों के आधार पर कर सकता है।
जोशुआ

1
क्या पुस्तकालय का एक अलग संस्करण प्रीलोड करने का दुरुपयोग होगा - यह मानते हुए कि वे संगत हैं?
z0r

2
मैंने देखा है कि यह डिबग या इंस्ट्रूमेंट वेरिएंट को लोड करने के लिए या लाइब्रेरी को लोड करने के लिए इस्तेमाल किया जाता है, जो बेस लाइब्रेरी से पूरी तरह से अलग है, हालांकि कुछ अन्य सिस्टम का अनुकरण करने के लिए।
जोशुआ

1
उस मामले में जहां पुस्तकालयों को सही तरीके से संकलित नहीं किया गया है (हर समय mysql के साथ इस में चलने के लिए जहां यह एक सामान्य libmysql_client के लिए एक ढीली युग्मन था जो एक पुराने संस्करण के सिमिलिंक को ओवरवोट करता है - आपके द्वारा उपयोग किए गए पर्ल के किस संस्करण के आधार पर आपको निर्दिष्ट करना था / LD_PRELOAD के साथ इसे लागू करें। उपयोगी ट्रिक। अगर मुझे सही याद है, तो इस तकनीक का उपयोग इस तकनीक का उपयोग करता है ताकि पुन: प्रयोज्य की आवश्यकता के बिना बायनेरिज़ को डिबगिंग की क्षमता प्रदान की जा सके। यह काफी उपयोगी है।
सिंथेसाइपरटेल

37

साथ LD_PRELOADआप पुस्तकालयों पूर्वता दे सकते हैं।

उदाहरण के लिए आप एक पुस्तकालय लिख सकते हैं जो कार्यान्वित mallocऔर free। और इन्हें LD_PRELOADअपने साथ लोड करके mallocऔर freeमानक के बजाय निष्पादित किया जाएगा।


लेकिन क्या होगा अगर कार्यक्रम का उपयोग करता है calloc? वह सब कुछ गड़बड़ नहीं करेगा?
जानूस ट्रॉल्सन

7
@JanusTroelsen यदि आप जो पुस्तकालय लिखते हैं वह एक निश्चित भाग को लागू नहीं करता है, तो वह हिस्सा मूल पुस्तकालय से लोड किया जाएगा।
वुड्रो बारलो

@JanusTroelsen, दूसरे शब्दों में, LD_PRELOAD आपको यह निर्दिष्ट करने की अनुमति देता है कि कौन से विशिष्ट प्रतीक के कार्यान्वयन का उपयोग किया जाता है। यदि प्रीलोडेड लाइब्रेरी प्रतीक का निर्यात नहीं करती है, तो इसे अन्यत्र पाया जाएगा।
sherrellbc

1
@JanusTroelsen: यह पता चलता है कि mallocऔर मुफ्त में विशेष रूप से इसे बनाने की अनुमति देने के लिए glibc में डिज़ाइन किया गया है और स्टॉक callocआपके आयातित को कॉल करने का प्रबंधन करता है malloc। किसी भी अन्य कार्यों के साथ यह कोशिश मत करो। यह इतना अच्छा काम नहीं करेगा।
जोशुआ

30

जैसा कि कई लोगों ने बताया, LD_PRELOADलाइब्रेरी को प्रीलोड करने के लिए। BTW, यदि सेटिंग कमांड द्वारा उपलब्ध है , तो आप चेक कर सकते हैं ldd

उदाहरण: मान लीजिए कि आपको अपना प्रीलोड करने की आवश्यकता है 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)

इस प्रकार, अपना प्रीलोड वातावरण सेट करें:

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

अपनी लाइब्रेरी को फिर से जांचें:

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

9

LD_PRELOADकार्यों के साथ साझा किए गए पुस्तकालयों को सूचीबद्ध करता है जो मानक सेट को ओवरराइड /etc/ld.so.preloadकरता है , जैसे कि करता है। इन्हें लोडर द्वारा कार्यान्वित किया जाता है /lib/ld-linux.so। यदि आप कुछ चुने हुए कार्यों को ओवरराइड करना चाहते हैं, तो आप एक ओवरराइडिंग ऑब्जेक्ट फ़ाइल और सेटिंग बनाकर ऐसा कर सकते हैं LD_PRELOAD; इस ऑब्जेक्ट फ़ाइल में फ़ंक्शंस बस उन कार्यों को ओवरराइड करेंगे जो दूसरों को छोड़ रहे थे जैसे वे थे।

साझा पुस्तकालयों के बारे में अधिक जानकारी के लिए, http://tldp.org/HOWTO/Program-Library-HOWTO/sared-Inbooks.html देखें


3

यहाँ प्रीलोडिंग के बारे में एक विस्तृत ब्लॉग पोस्ट है:

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


13
अपना उत्तर पोस्ट करने के लिए धन्यवाद! कृपया ध्यान दें कि आपको इस साइट पर उत्तर के आवश्यक भागों को पोस्ट करना चाहिए, या आपके पोस्ट को हटाए जाने के जोखिमों को अक्सर पूछे जाने वाले प्रश्न देखें जहां यह उन उत्तरों का उल्लेख करता है जो 'लिंक से मुश्किल से अधिक हैं'। यदि आप चाहें तो आप अभी भी लिंक को शामिल कर सकते हैं, लेकिन केवल 'संदर्भ' के रूप में। लिंक की आवश्यकता के बिना जवाब अपने दम पर खड़ा होना चाहिए।
टैरिन

3

यह निर्यात mylib.soकरने के लिए आसान है env:

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

निष्क्रिय करने के लिए :

$ export LD_PRELOAD=

7
याunset LD_PRELOAD
मोर्टेन

2

जब LD_PRELOAD का उपयोग किया जाता है, तो फ़ाइल को पहले से लोड किए जाने वाले किसी अन्य $export LD_PRELOAD=/path/libपरिवाद से पहले लोड किया जाएगा, यहां तक ​​कि इसे कार्यक्रमों में भी उपयोग किया जा सकता है


1

का उपयोग करते हुए LD_PRELOADपथ , आप प्रदान की गई डिफ़ॉल्ट पर, साझा किए गए ऑब्जेक्ट को लोड करने के लिए एप्लिकेशन लोडर को मजबूर कर सकते हैं।

डेवलपर्स इसका उपयोग साझा वस्तुओं के विभिन्न संस्करणों को प्रदान करके अपने अनुप्रयोगों को डीबग करने के लिए करते हैं।

हमने तैयार साझा वस्तुओं का उपयोग करके मौजूदा कार्यों को ओवरराइड करके, कुछ अनुप्रयोगों को हैक करने के लिए इसका उपयोग किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.