Bagaimana cara saya membuka kompresi vmlinuz ke vmlinux?

19

Saya sudah mencoba uncompress, gzip, dan semua solusi lain yang muncul sebagai hasil google dan ini belum bekerja untuk saya.

Untuk mendapatkan hanya pencarian gambar untuk tanda tangan 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

jadi gambar dimulai pada 24576+8 => 24584. Kemudian cukup salin gambar dari titik dan dekompres itu -

> 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

Dapatkan instruksi ini kata demi kata dari forum online: http://www.codeguru.com/forum/showthread.php?t=415186

Proses ini tidak bekerja untuk saya dan akhirnya memberikan kesalahan yang menyatakan file tidak ditemukan 0024576 dan semua nomor berikutnya.

Bagaimana cara saya melanjutkan mengekstraksi vmlinux dari vmlinuz?

Terima kasih.

Diedit: Ini adalah pertanyaan rekayasa terbalik. Saya tidak memiliki akses ke distro untuk menginstal RPM atau mengkompilasi ulang. Saya mulai dengan apa pun kecuali vmlinuz.

Tuan Loh.
sumber
2
Mengapa Anda ingin melakukan ini?
Flimzy
Ini sebenarnya untuk teman yang harus melakukan sesuatu dengannya. Pertanyaan itu tampak menarik dan saya mengusahakannya untuk kepentingan akademis saya. Alternatif untuk ini adalah membangun kernel: - /
Ya, untuk kepentingan akademis, saya tidak tahu apakah itu mudah. Saya percaya kernel vmlinuz memiliki mukadimah yang dapat dieksekusi - ini pada dasarnya adalah arsip yang mengekstraksi sendiri. Itu sebabnya menggunakan straight gunzip tidak berhasil untuk Anda. Metode yang dikutip mencoba untuk melewati mukadimah itu. Mengapa itu tidak berhasil, saya tidak tahu pasti. Mungkin orang lain dengan minat akademis yang sama dapat memberikan jawaban yang berguna. :)
Flimzy

Jawaban:

27

Mungkin Anda salah mengerti apa yang dimaksud oleh penulis posting itu.

  1. The vmlinuzfile berisi hal-hal lain selain konten gzip, sehingga Anda perlu mencari tahu di mana konten gzip dimulai. Untuk melakukannya, gunakan:

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

    Apa yang dilakukan adalah untuk menunjukkan kepada Anda di mana dalam file itu Anda dapat menemukan header gzip. Outputnya terlihat seperti:

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

    Ini berarti bahwa 0024576setidaknya (untuk pembuat posting, milik Anda mungkin berada di tempat yang sama sekali berbeda) dalam vmlinuzfile, Anda akan menemukan nilai-nilai biner " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45". Anda sedang mencari 1f 8b 08 00, yang dapat ditemukan dari karakter 9 dan seterusnya, atau di 0024576 + 8(mulai menghitung dari 0) = 24584.

  2. Sekarang Anda tahu di mana konten gzip dimulai (pada posisi 24584) yang dapat Anda gunakan dduntuk mengekstrak konten gzip itu dan melepaskannya. Untuk melakukannya, gunakan:

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

    Perintah pertama akan mencari ke posisi itu dan menyalin semuanya ke stdout. zcatkemudian akan mengompres semua yang didapatnya dari stdin dan akan menampilkan string yang tidak terkompresi ke stdout. Kemudian >akan mengarahkan zcatkeluaran ke file baru bernama vmlinux.

membersihkan
sumber
Terima kasih! Itu masuk akal sekarang. Namun, '1f 8b 08 00' tidak mengembalikan apa pun untuk kernel saya setelah beberapa detik eksekusi. Ternyata kodenya sudah berubah. Ada saran tentang cara mendapatkan set angka ajaib yang baru?
@ Tuan Loh .: Dua kemungkinan: 1) Angka ajaib melewati garis batas dalam odkeluaran. Gunakan bgrep untuk mencari 1f8b0800. 2) Kernel dikompres menggunakan algoritma yang berbeda. Coba fd377a585a00untuk xz atau 425a6839untuk bzip2 .
grawity
@ grawity - Terima kasih atas jawabannya. Saya mencobanya. tidak 1f8b0800, fd377a585a00 atau 425a6839 tidak memberikan hasil apa pun. Jadi saya mulai memotong string sulap byte demi byte sampai saya mendapat beberapa hasil, dan ada ratusan pertandingan :-( Jadi saya masih belum berhasil.
Lord Loh.
LZMA adalah "5d 00 00 80" menurut minimodding.com/… . Masih tidak bekerja untuk saya.
Sam Brightman
26

Sumber kernel sekarang berisi skrip untuk iniextract-vmlinux ,. Anda tidak perlu menggulung sendiri.

Lihat jawaban SO ini .

Craig Ringer
sumber
1
Apakah ini tersedia di Ubuntu 14.04? Saya melihatnya di git repo, paket ubuntu apa yang bisa saya temukan? - Terima kasih :-)
Tuan Loh.
@LordLoh apt-file search extract-vmlinuxmemberikan beberapa paket header kernel Linux, dan locate extract-vmlinuxmengarah ke beberapa hits di mesin Ubuntu 18.04 lokal saya: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxwalaupun PATHsepertinya tidak ada apa-apa di dalamnya.
Ciro Santilli 新疆 改造 中心 996ICU 六四 事件
Untuk ARM gagal dengan "extract-vmlinux: Tidak dapat menemukan vmlinux": unix.stackexchange.com/questions/352215/…
Ciro Santilli 新疆 改造 中心 996ICU 六四 事件
7

Sebenarnya, sebelum membuat vmlinuzfile, sebagian besar simbol dilucuti. Jadi Anda tidak dapat membangun kembali true vmlinuxdari vmlinuz, file tidak akan berguna untuk debugging.

ninjalj
sumber
2

Saya mengalami masalah sederhana - mencari versi yang benar dari vmlinux untuk crash. Alih-alih mencoba mendekompresi vmlinuz ke vmlinux.

Solusi yang lebih baik adalah: instal RPM:, kernel-debuginfobahwa RPM berisi file vmlinux yang tepat.

Perhatikan nama rpm, ada beberapa nama yang mirip (membingungkan). Harus:kernel-debuginfo-$(version).rpm

Henry
sumber
1

Kernel modern tidak selalu (pada kenyataannya, tidak secara umum) terkompresi gzip. Mereka dapat menggunakan bzip2 atau LZMA. Pencarian web cepat tidak membantu saya menemukan string ajaib untuk metode kompresi tersebut - Anda mungkin lebih baik memeriksa beberapa gambar kernel untuk menemukan header invarian yang menyertakan kode dekompresi.

CarlF
sumber
1

Baris dekompresi di atas bekerja untuk saya dan, tentu saja, kernelnya dilucuti. Karena itu tidak ada informasi yang baik di sana.

Jika Anda perlu membuat perubahan pada kernel lama Anda, seperti memasukkannya ke dalam debug, gunakan uname -runtuk mendapatkan revisi dari kernel Anda dan dapatkan sumbernya:

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

Sumber akan berada di /usr/src/linux... cdpohon sumber dan:

make oldconfig
make

Ini akan berusaha menemukan file yang berisi konfigurasi untuk kernel yang sedang berjalan - biasanya

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

dan menggunakannya untuk build ini sehingga menciptakan kembali kernel yang berjalan.

Bangun seperti yang Anda inginkan; memiliki akses ke kernel unstripped sesuai kebutuhan.

Kerang di atas mungkin tidak akan menemukan nomor ajaib gzip karena spasi. Ya mereka masih dikompresi dengan cara yang sama, meskipun saya menulis setahun setelah diskusi awal. Kirim output ke lessdan cari 1f 8batau bahkan 1f. Periksa sisa byte secara manual untuk menentukan kecocokan dan memverifikasi Anda memiliki instance pertama. Gunakan offset yang ditemukan mengingat itu desimal.

kdm
sumber