ฉันเจอการอ้างอิงถึงมันเมื่อเร็ว ๆ นี้ในproggitและ (ณ ตอนนี้) มันไม่ได้อธิบาย
ฉันสงสัยว่ามันอาจเป็นไปได้ แต่ฉันไม่รู้แน่นอน
ฉันเจอการอ้างอิงถึงมันเมื่อเร็ว ๆ นี้ในproggitและ (ณ ตอนนี้) มันไม่ได้อธิบาย
ฉันสงสัยว่ามันอาจเป็นไปได้ แต่ฉันไม่รู้แน่นอน
คำตอบ:
หากคุณตั้งค่าLD_PRELOAD
เป็นพา ธ ของวัตถุที่ใช้ร่วมกันไฟล์นั้นจะถูกโหลดก่อนไลบรารีอื่น ๆ (รวมถึง C runtime libc.so
) ดังนั้นในการรันls
ด้วยmalloc()
การติดตั้งแบบพิเศษให้ทำดังนี้
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD
เส้นทางไปยัง เหตุผลก็คือมันเป็นตัวแปรสภาพแวดล้อม แต่สืบทอดโดยกระบวนการลูก - ซึ่งอาจมีไดเรกทอรีทำงานแตกต่างจากกระบวนการหลัก ดังนั้นเส้นทางสัมพัทธ์ใด ๆ จะล้มเหลวในการค้นหาไลบรารีเพื่อโหลดล่วงหน้า
LD_PRELOAD
คุณสามารถแทนที่สัญลักษณ์หุ้นในห้องสมุดโดยการสร้างห้องสมุดที่มีสัญลักษณ์เดียวกันและระบุห้องสมุดใน
บางคนใช้เพื่อระบุไลบรารีในตำแหน่งที่ตั้งที่ไม่เป็นมาตรฐาน แต่LD_LIBRARY_PATH
ดีกว่าสำหรับจุดประสงค์นั้น
ด้วยLD_PRELOAD
คุณสามารถให้ความสำคัญกับห้องสมุด
ตัวอย่างเช่นคุณสามารถเขียนห้องสมุดที่ใช้และmalloc
free
และโดยการโหลดสิ่งเหล่านี้กับLD_PRELOAD
คุณmalloc
และfree
จะถูกประหารชีวิตแทนที่จะเป็นแบบมาตรฐาน
calloc
? มันจะไม่เลอะทุกอย่างเหรอ?
malloc
และฟรีได้รับการออกแบบมาโดยเฉพาะใน glibc ที่จะอนุญาตให้นี้และสต็อกพอที่จะเรียกที่นำเข้าcalloc
malloc
อย่าลองด้วยฟังก์ชั่นอื่น ๆ มันทำงานได้ไม่ดีนัก
ดังที่หลายคนพูดถึงการใช้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)
...
LD_PRELOAD
รายการห้องสมุดสาธารณะที่มีฟังก์ชั่นที่แทนที่ชุดมาตรฐานเช่นเดียวกับที่/etc/ld.so.preload
ไม่ /lib/ld-linux.so
เหล่านี้จะถูกนำมาใช้โดยโหลด หากคุณต้องการที่จะแทนที่เพียงฟังก์ชั่นที่เลือกไม่กี่คุณสามารถทำเช่นนี้โดยการสร้างไฟล์วัตถุเอาชนะและการตั้งค่าLD_PRELOAD
; ฟังก์ชั่นในไฟล์วัตถุนี้จะแทนที่เพียงฟังก์ชั่นเหล่านั้นออกจากคนอื่น ๆ เช่นที่พวกเขา
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับห้องสมุดสาธารณะให้ไปที่ http://tldp.org/HOWTO/Program-Library-HOWTO/shared-library.html
นี่คือโพสต์บล็อกโดยละเอียดเกี่ยวกับการโหลดล่วงหน้า:
มันง่ายที่จะส่งออกmylib.so
ไปยัง env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
ปิดการใช้งาน:
$ export LD_PRELOAD=
unset LD_PRELOAD
เมื่อ LD_PRELOAD ถูกใช้ไฟล์นั้นจะถูกโหลดก่อนที่$export LD_PRELOAD=/path/lib
lib อื่น ๆ
จะถูกโหลดไว้ล่วงหน้าแม้จะสามารถใช้ในโปรแกรมได้เช่นกัน
การใช้LD_PRELOAD
พา ธ คุณสามารถบังคับให้โหลดเดอร์ของแอปพลิเคชันให้วัตถุที่ใช้ร่วมกันผ่านค่าเริ่มต้นที่ให้ไว้
นักพัฒนาใช้สิ่งนี้เพื่อดีบักแอปพลิเคชันของพวกเขาโดยจัดเตรียมวัตถุที่ใช้ร่วมกันรุ่นต่างๆ
เราใช้มันเพื่อแฮ็กแอปพลิเคชันบางอย่างโดยการแทนที่ฟังก์ชั่นที่มีอยู่โดยใช้วัตถุที่ใช้ร่วมกันที่เตรียมไว้