Làm cách nào để giải nén vmlinuz sang vmlinux?


20

Tôi đã thử giải nén, gzip và tất cả các giải pháp khác được đưa ra dưới dạng kết quả của google và những giải pháp này không hiệu quả với tôi.

Để chỉ nhận được tìm kiếm hình ảnh cho chữ ký 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

vì vậy hình ảnh bắt đầu lúc 24576+8 => 24584. Sau đó, chỉ cần sao chép hình ảnh từ điểm và giải nén nó -

> 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

Nhận các hướng dẫn này nguyên văn từ một diễn đàn trực tuyến: http://www.codeguru.com/forum/showthread.php?t=415186

Quá trình này không hoạt động đối với tôi và cuối cùng đưa ra lỗi mà trạng thái tệp không tìm thấy 0024576 và tất cả các số tiếp theo.

Làm cách nào để tôi tiến hành trích xuất vmlinux từ vmlinuz?

Cảm ơn bạn.

EDITED: Đây là một câu hỏi kỹ thuật đảo ngược. Tôi không có quyền truy cập vào bản phân phối để cài đặt bất kỳ RPM hoặc biên dịch lại. Tôi bắt đầu không có gì ngoài vmlinuz.


2
tại sao bạn muốn làm việc này?
Flimzy

Điều này thực sự dành cho một người bạn đã phải làm một cái gì đó với nó. Câu hỏi có vẻ thú vị và tôi đã theo đuổi nó vì sở thích học tập của mình. Một thay thế cho điều này là để xây dựng kernel: - /

Chà, vì lợi ích học tập, tôi không biết liệu điều đó có dễ dàng không. Tôi tin rằng một hạt nhân vmlinuz có một lời mở đầu thực thi - về cơ bản nó là một kho lưu trữ tự giải nén. Đó là lý do tại sao sử dụng gunzip thẳng không hiệu quả với bạn. Phương pháp được trích dẫn cố gắng bỏ qua phần mở đầu đó. Tại sao nó không hoạt động, tôi không biết chắc chắn. Có lẽ ai đó khác có cùng sở thích học thuật có thể cho bạn một câu trả lời hữu ích. :)
Flimzy

Câu trả lời:


30

Có thể bạn đã hiểu nhầm ý của tác giả bài viết đó.

  1. Các vmlinuztập tin chứa những thứ khác bên cạnh những nội dung đã giải nén, vì vậy bạn cần phải tìm ra nơi bắt đầu nội dung đã giải nén. Để làm điều đó, sử dụng:

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

    Điều này làm là cho bạn thấy nơi trong tệp đó bạn có thể tìm thấy tiêu đề gzip. Đầu ra trông như sau:

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

    Điều này có nghĩa là tại 0024576(ít nhất là đối với tác giả của bài đăng, của bạn có thể ở một nơi hoàn toàn khác) trong vmlinuztệp, bạn sẽ tìm thấy các giá trị nhị phân " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45". Bạn đang tìm kiếm 1f 8b 08 00, có thể tìm thấy từ ký tự 9 trở đi, hoặc, tại 0024576 + 8(bắt đầu đếm từ 0) = 24584.

  2. Bây giờ bạn đã biết nội dung được nén được bắt đầu (tại vị trí 24584), bạn có thể sử dụng ddđể trích xuất nội dung được nén đó và giải nén nó. Để làm điều đó, sử dụng:

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

    Lệnh đầu tiên sẽ tìm đến vị trí đó và sao chép mọi thứ vào thiết bị xuất chuẩn. zcatsau đó sẽ giải nén mọi thứ nó nhận được từ stdin và sẽ xuất chuỗi không nén thành stdout. Sau đó, đầu ra >sẽ chuyển hướng zcatđến một tệp mới có tên vmlinux.


Cảm ơn! Điều đó có ý nghĩa bây giờ. Tuy nhiên, '1f 8b 08 00' cũng không trả lại bất cứ thứ gì cho kernel của tôi sau vài giây thực thi. Rõ ràng mã đã thay đổi. Bất kỳ đề nghị về làm thế nào để có được bộ số ma thuật mới?

@Lord Loh.: Hai khả năng: 1) Các số ma thuật vượt qua ranh giới trong odsản lượng. Sử dụng bgrep để tìm kiếm 1f8b0800. 2) Nhân được nén bằng thuật toán khác. Hãy thử fd377a585a00cho xz hoặc 425a6839cho bzip2 .
grawity

@ grawity - Cảm ơn bạn đã trả lời. Tôi đã thử nó. không 1f8b0800, fd377a585a00 và 425a6839 không trả lại bất kỳ kết quả nào. Vì vậy, tôi bắt đầu chặt từng byte chuỗi ma thuật theo byte cho đến khi tôi nhận được một số kết quả và chúng là hàng trăm trận đấu :-( Vì vậy, tôi vẫn không thành công.
Lord Loh.

LZMA là "5d 00 00 80" theo minimodding.com/ . Vẫn không làm việc cho tôi.
Sam Brightman

27

1
Điều này có sẵn trong Ubuntu 14.04 không? Tôi đã nhìn thấy nó trong git repo, tôi có thể tìm thấy gói ubfox nào? - Cảm ơn bạn :-)
Lord Loh.

@LordLoh apt-file search extract-vmlinuxcung cấp một số gói tiêu đề hạt nhân linux và locate extract-vmlinuxdẫn đến một vài lần truy cập trên máy Ubuntu 18.04 cục bộ của tôi: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxmặc dù PATHdường như không có gì trong đó.
Ciro Santilli 心 心

Đối với ARM nó không thành công với "chiết xuất-vmlinux: Không thể tìm thấy vmlinux": unix.stackexchange.com/questions/352215/...
Ciro Santilli新疆改造中心法轮功六四事件

7

Trên thực tế, trước khi tạo vmlinuztập tin, hầu hết các biểu tượng đều bị tước. Vì vậy, bạn không thể xây dựng lại một sự thật vmlinuxtừ vmlinuz, tệp sẽ không hữu ích cho việc gỡ lỗi.


2

Tôi gặp vấn đề đơn giản - tìm kiếm phiên bản chính xác của vmlinux cho sự cố. Thay vì cố gắng giải nén vmlinuz thành vmlinux.

Giải pháp tốt hơn là: cài đặt RPM : kernel-debuginfo, RPM đó chứa tệp vmlinux thích hợp.

Hãy chú ý đến tên vòng / phút, có nhiều tên tương tự (khó hiểu). Phải:kernel-debuginfo-$(version).rpm


1

Hạt nhân hiện đại không phải lúc nào cũng (trên thực tế, không nói chung) gzip được nén. Họ có thể sử dụng bzip2 hoặc LZMA. Một tìm kiếm trên web nhanh không giúp tôi tìm được chuỗi ma thuật cho các phương thức nén đó - tốt hơn hết là bạn nên kiểm tra một số hình ảnh hạt nhân để tìm tiêu đề bất biến bao gồm mã giải nén.


1

Các dòng giải nén ở trên đã làm việc cho tôi và tất nhiên, kernel đã bị tước. Do đó không có thông tin tốt ở đó.

Nếu bạn cần thực hiện các thay đổi đối với kernel cũ của mình, như đưa nó vào gỡ lỗi, hãy sử dụng uname -rđể có được bản sửa đổi của kernel và lấy nguồn của nó:

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

Nguồn sẽ ở trong /usr/src/linux... cdcây nguồn và:

make oldconfig
make

Điều này sẽ cố gắng tìm tệp chứa cấu hình cho kernel hiện đang chạy - thường

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

và sử dụng nó cho bản dựng này, do đó, tạo lại kernel đang chạy.

Xây dựng theo cách bạn muốn; có quyền truy cập vào kernel chưa được xử lý khi cần thiết.

Các shell ở trên có thể sẽ không tìm thấy số ma thuật gzip do khoảng cách. Vâng, họ vẫn bị nén theo cùng một cách, mặc dù tôi đang viết một năm sau cuộc thảo luận ban đầu. Gửi đầu ra lessvà tìm kiếm 1f 8bhoặc thậm chí 1f. Kiểm tra phần còn lại của byte theo cách thủ công để xác định khớp và xác minh bạn có phiên bản đầu tiên. Sử dụng phần bù tìm thấy ghi nhớ nó là số thập phân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.