แยก initramfs ในตัว


9

ฉันมีเคอร์เนลที่ฝังหนึ่ง initramfs ฉันต้องการแยกมัน

ฉันได้ผลลัพธ์x86 boot sectorเมื่อฉันทำfile bzImage

ฉันมีไฟล์ System.map สำหรับเคอร์เนลอิมเมจนี้

มีวิธีใดที่จะดึงอิมเมจ initramfs ที่ฝังอยู่ในเคอร์เนลนี้โดยใช้หรือไม่ใช้ไฟล์System.map ?

สตริงที่น่าสนใจที่พบในไฟล์System mapคือ: (ในกรณีที่มันช่วย)

57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size

คำตอบ:


14

มีข้อมูลบางอย่างเกี่ยวกับสิ่งนี้ในวิกิ gentoo: https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging

มันแนะนำการใช้งานbinwalkที่ทำงานได้ดีเหลือเกิน

ฉันจะยกตัวอย่างแบบรวดเร็ว:

แยกไฟล์ bzImage ด้วย binwalk ก่อน:

> binwalk --extract bzImage
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Microsoft executable, portable (PE)
18356         0x47B4          xz compressed data
9772088       0x951C38        xz compressed data

ฉันสิ้นสุดกับสามไฟล์: 47B4, 47B4.xzและ951C38.xz

> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped

ตอนนี้ให้เรียกใช้ binwalk อีกครั้งใน47B4:

> binwalk --extract 47B4
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
9818304       0x95D0C0        Linux kernel version "4.4.6-gentoo (root@host) (gcc version 4.9.3 (Gentoo Hardened 4.9.3 p1.5, pie-0.6.4) ) #1 SMP Tue Apr 12 14:55:10 CEST 2016"
9977288       0x983DC8        gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
<snip>

สิ่งนี้กลับมาพร้อมกับรายการเส้นทางที่ยาวและไฟล์ที่น่าสนใจหลายไฟล์ มาดูกันเถอะ

> file _47B4.extracted/*
<snip>
_47B4.extracted/E9B348:     ASCII cpio archive (SVR4 with no CRC)

ไฟล์E9B348เป็นไฟล์เก็บถาวร cpio (แตกแล้ว) สิ่งที่เรากำลังมองหา! บิงโก!

หากต้องการคลายบีบอัดไฟล์เก็บถาวร cpio (initramfs ของคุณ!) ในไดเรกทอรีปัจจุบันของคุณให้เรียกใช้

> cpio -i < E9B348

นั่นเกือบจะง่ายเกินไป binwalkเป็นเครื่องมือที่คุณต้องการอย่างแน่นอน สำหรับการอ้างอิงฉันใช้ v2.1.1 ที่นี่


บิงโก !!! คุณจับมัน!
SHW

2

เท่าที่ฉันรู้ไฟล์เก็บถาวร initramfs cpio ก็แค่เชื่อมโยงกับเคอร์เนล

ดังนั้นสิ่งนี้ควรใช้งานได้:

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