ฉันจะยกเลิกการบีบอัด vmlinuz ถึง vmlinux ได้อย่างไร


20

ฉันได้ลอง uncompress, gzip และโซลูชันอื่น ๆ ทั้งหมดที่เกิดขึ้นเป็นผลลัพธ์ของ google และสิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน

ที่จะได้รับเพียงการค้นหาภาพสำหรับลายเซ็น GZ 1f 8b 08 00-

> od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45

24576+8 => 24584เพื่อให้ภาพเริ่มต้นที่ จากนั้นเพียงคัดลอกภาพจากจุดและขยาย -

> dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
1450414+0 records in
1450414+0 records out
1450414 bytes (1.5 MB) copied, 6.78127 s, 214 kB/s

รับคำแนะนำเหล่านี้เป็นคำต่อคำจากฟอรัมออนไลน์: http://www.codeguru.com/forum/showthread.php?t=415186

กระบวนการนี้ใช้ไม่ได้สำหรับฉันและท้ายสุดแสดงข้อผิดพลาดที่แจ้งว่าไม่พบไฟล์ 0024576 และหมายเลขที่ตามมาทั้งหมด

ฉันจะแยก vmlinux ออกจาก vmlinuz ได้อย่างไร

ขอขอบคุณ.

แก้ไข: นี่คือคำถามวิศวกรรมย้อนกลับ ฉันไม่มีสิทธิ์เข้าถึง distro เพื่อติดตั้ง RPM หรือคอมไพล์ใหม่ ฉันเริ่มต้นด้วยไม่มีอะไรนอกจาก vmlinuz


2
ทำไมคุณถึงต้องการทำเช่นนี้?
Flimzy

นี่เป็นจริงสำหรับเพื่อนที่ต้องทำอะไรกับมัน คำถามดูเหมือนน่าสนใจและฉันได้ดำเนินการเพื่อผลประโยชน์ทางวิชาการ อีกทางเลือกหนึ่งคือสร้างเคอร์เนล: - /

สำหรับความสนใจด้านวิชาการฉันไม่รู้ว่ามันเป็นไปได้หรือเปล่า ฉันเชื่อว่าเคอร์เนล vmlinuz มีคำนำที่สามารถเรียกใช้ได้ - โดยพื้นฐานแล้วมันเป็นไฟล์เก็บถาวรแบบขยายตัวเอง นั่นเป็นสาเหตุที่การใช้ gunzip แบบตรงไม่ได้ผลสำหรับคุณ วิธีการที่ยกมาพยายามที่จะข้ามผ่านคำนำที่ ทำไมมันไม่ทำงานฉันไม่รู้แน่ บางทีคนอื่นที่มีความสนใจด้านวิชาการที่คล้ายกันอาจให้คำตอบที่เป็นประโยชน์ :)
Flimzy

คำตอบ:


30

บางทีคุณอาจเข้าใจผิดว่าผู้แต่งบทความนั้นหมายถึงอะไร

  1. vmlinuzไฟล์มีสิ่งอื่น ๆ นอกเหนือจากเนื้อหา gzipped ดังนั้นคุณจึงจำเป็นที่จะหาที่เริ่มต้นเนื้อหา gzipped ในการทำเช่นนั้นให้ใช้:

    od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
    

    สิ่งนี้จะแสดงให้คุณเห็นว่าในไฟล์นั้นคุณสามารถหาส่วนหัว gzip ได้ ผลลัพธ์ดูเหมือนว่า:

    0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45
    

    ซึ่งหมายความว่าที่0024576(อย่างน้อยสำหรับผู้โพสต์คุณอาจแตกต่างอย่างสิ้นเชิงในvmlinuzไฟล์) คุณจะพบค่าไบนารี่ " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45" คุณกำลังมองหา1f 8b 08 00ซึ่งสามารถพบได้จากตัวละครที่ 9 เป็นต้นไปหรือที่0024576 + 8(เริ่มนับจาก = 245840)

  2. หลังจากที่คุณทราบว่าเนื้อหา gzipped เริ่มต้น (ที่ตำแหน่ง24584) คุณสามารถใช้ddเพื่อแยกเนื้อหา gzipped นั้นและ ungzip ในการทำเช่นนั้นให้ใช้:

    dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
    

    คำสั่งแรกจะพยายามไปยังตำแหน่งนั้นและคัดลอกทุกอย่างเพื่อ stdout zcatจากนั้นจะคลายการบีบอัดทุกอย่างที่ได้รับจาก stdin และจะส่งออกสตริงที่ไม่บีบอัดไปยัง stdout จากนั้น>จะเปลี่ยนเส้นทางของการส่งออกไปยังแฟ้มใหม่ที่ชื่อว่าzcatvmlinux


ขอบคุณ! นั่นสมเหตุสมผลแล้ว อย่างไรก็ตาม '1f 8b 08 00' ไม่ได้ทำอะไรคืนค่าเคอร์เนลของฉันหลังจากการประหารสองสามวินาที เห็นได้ชัดว่ามีการเปลี่ยนแปลงรหัส ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการรับหมายเลขมายากลชุดใหม่?

@ ลอร์ดโลห์: ความเป็นไปได้สองอย่าง: 1) ตัวเลขเวทย์มนตร์ข้ามเส้นแบ่งodออกของเอาท์พุต ใช้bgrep1f8b0800เพื่อค้นหา 2) เคอร์เนลถูกบีบอัดโดยใช้อัลกอริทึมที่แตกต่างกัน ลองfd377a585a00สำหรับXZหรือ425a6839สำหรับbzip2
grawity

@ grawity - ขอบคุณสำหรับการตอบกลับ ฉันลองมัน 1f8b0800 ทั้ง fd377a585a00 และ 425a6839 ไม่แสดงผลลัพธ์ใด ๆ ดังนั้นฉันจึงเริ่มตัดสตริงมายากลไบต์ต่อไบต์จนกว่าฉันจะได้รับผลและพวกเขาเป็นหลายร้อยแมตช์ :-( ดังนั้นฉันยังคงไม่ประสบความสำเร็จ
ลอร์ดโลห์

LZMA คือ "5d 00 00 80" ตามminimodding.com/... ยังไม่ได้ผลสำหรับฉัน
Sam Brightman

27

1
มีให้ใน Ubuntu 14.04 หรือไม่ ฉันเห็นมันใน git repo ฉันสามารถหาแพ็คเกจของ Ubuntu ได้ในอะไร? - ขอบคุณ :-)
ลอร์ดโลห์

@LordLoh apt-file search extract-vmlinuxให้แพคเกจส่วนหัวเคอร์เนล linux หลายชุดและlocate extract-vmlinuxนำไปสู่ความนิยมบางอย่างบนเครื่อง Ubuntu 18.04 ในเครื่องของฉัน: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxแม้ว่าPATHจะดูเหมือนไม่มีอะไรก็ตาม
Ciro Santilli 事件改造中心法轮功六四事件

สำหรับ ARM มันล้มเหลวด้วย "extract-vmlinux: ไม่พบ vmlinux": unix.stackexchange.com/questions/352215/…
Ciro Santilli 新疆改造改造中心法轮功六四事件

7

จริงๆแล้วก่อนที่จะสร้างvmlinuzไฟล์สัญลักษณ์ส่วนใหญ่จะถูกถอดออก ดังนั้นคุณจึงไม่สามารถสร้างจริงได้vmlinuxจากvmlinuzนั้นไฟล์จะไม่เป็นประโยชน์สำหรับการดีบัก


2

ฉันพบปัญหาอย่างง่าย - กำลังค้นหา vmlinux รุ่นที่ถูกต้องสำหรับความผิดพลาด แทนที่จะพยายามขยาย vmlinuz เป็น vmlinux

ทางออกที่ดีกว่าคือ: ติดตั้ง RPM:, RPM kernel-debuginfoนั้นมีไฟล์ vmlinux ที่เหมาะสม

ให้ความสนใจกับชื่อรอบต่อนาทีมีหลายชื่อที่คล้ายกัน (สับสน) จะต้องเป็น:kernel-debuginfo-$(version).rpm


1

เมล็ดสมัยใหม่ไม่ได้ถูกบีบอัดเสมอ (อันที่จริงไม่ใช่โดยทั่วไป) พวกเขาอาจใช้ bzip2 หรือ LZMA การค้นหาเว็บอย่างรวดเร็วไม่ได้ช่วยฉันค้นหาสายเวทย์มนตร์สำหรับวิธีการบีบอัดเหล่านั้น - คุณอาจจะดีกว่าการตรวจสอบภาพเคอร์เนลหลาย ๆ อันเพื่อค้นหาส่วนหัวคงที่ที่มีรหัสการคลายการบีบอัด


1

เส้นการบีบอัดด้านบนทำงานได้สำหรับฉันและแน่นอนเคอร์เนลถูกถอดออก ดังนั้นจึงไม่มีข้อมูลที่ดี

หากคุณต้องการเปลี่ยนแปลงเคอร์เนลเก่าของคุณเช่นวางไว้ในดีบั๊กใช้uname -rเพื่อรับการแก้ไขเคอร์เนลของคุณและรับซอร์ส:

sudo apt-get source linux-image-\`uname -r\`

แหล่งที่มาจะอยู่ใน/usr/src/linux... cdแผนผังต้นไม้และ:

make oldconfig
make

นี่จะพยายามค้นหาไฟล์ที่มีการกำหนดค่าสำหรับเคอร์เนลที่กำลังทำงานอยู่ - โดยปกติ

/boot/config-\`uname -r\` 

และใช้มันสำหรับการสร้างนี้จึงสร้างเคอร์เนลที่ทำงานอยู่

สร้างตามแบบที่คุณต้องการ มีการเข้าถึงเคอร์เนลที่ไม่ถูกสับเปลี่ยนตามต้องการ

กระสุนด้านบนอาจไม่พบหมายเลขเวทย์มนตร์ gzip เนื่องจากระยะห่าง ใช่พวกเขายังคงบีบอัดในลักษณะเดียวกันแม้ว่าฉันจะเขียนหนึ่งปีหลังจากการสนทนาดั้งเดิม ส่งออกไปlessและค้นหาหรือแม้กระทั่ง1f 8b 1fตรวจสอบไบต์ที่เหลือด้วยตนเองเพื่อตรวจสอบการจับคู่และตรวจสอบว่าคุณมีอินสแตนซ์แรก ใช้ offset พบว่ามันเป็นทศนิยม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.