Jak rozpakować vmlinuz do vmlinux?

20

Próbowałem już rozpakować, gzip i wszystkie inne rozwiązania, które pojawiają się jako wyniki google i te nie działały dla mnie.

Aby uzyskać tylko wyszukiwanie obrazu dla podpisu 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

więc obraz zaczyna się od 24576+8 => 24584. Następnie po prostu skopiuj obraz z punktu i rozpakuj go -

> 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

Dostałem te instrukcje dosłownie z forum online: http://www.codeguru.com/forum/showthread.php?t=415186

Ten proces nie działa dla mnie i kończy się podawaniem błędów, które informują, że nie znaleziono pliku 0024576 i wszystkich kolejnych numerów.

Jak kontynuować wydobywanie vmlinux z vmlinuz?

Dziękuję Ci.

ZMIENIONO: To pytanie inżynierii odwrotnej. Nie mam dostępu do dystrybucji, aby zainstalować RPM lub ponownie skompilować. Zaczynam od nic oprócz vmlinuz.

Lord Loh.
źródło
2
Dlaczego chcesz to zrobić?
Flimzy
To jest właściwie dla przyjaciela, który musiał coś z tym zrobić. Pytanie wydawało się interesujące i podążałem za nim ze względu na moje zainteresowania naukowe. Alternatywą jest zbudowanie jądra: - /
Cóż, dla celów akademickich nie wiem, czy jest to łatwo możliwe. Wierzę, że jądro vmlinuz ma wykonywalną preambułę - jest to w zasadzie samorozpakowujące się archiwum. Dlatego użycie prostego pistoletu nie działało dla ciebie. Cytowana metoda próbuje pominąć tę preambułę. Dlaczego to nie działa, nie jestem pewien. Może ktoś o podobnych zainteresowaniach akademickich może udzielić użytecznej odpowiedzi. :)
Flimzy

Odpowiedzi:

30

Być może źle zrozumiałeś, co miał na myśli autor tego postu.

  1. vmlinuzPlik zawiera inne rzeczy oprócz zgzipowanego treści, więc trzeba dowiedzieć się, gdzie gzipped rozpoczyna treści. Aby to zrobić, użyj:

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

    To pokazuje, gdzie w tym pliku można znaleźć nagłówek gzip. Dane wyjściowe wyglądają następująco:

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

    Oznacza to, że w 0024576(przynajmniej dla autora postu twój może być zupełnie inny) w vmlinuzpliku, znajdziesz wartości binarne „ 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45”. Szukasz 1f 8b 08 00, który znajdziesz od postaci 9 lub od 0024576 + 8(zacznij od zera) = 24584.

  2. Teraz, gdy wiesz, gdzie zaczyna się zawartość spakowana gzipem (w pozycji 24584), możesz użyć jej dddo wyodrębnienia jej i rozpakowania. Aby to zrobić, użyj:

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

    Pierwsze polecenie będzie szukało tej pozycji i skopiuje wszystko na standardowe wyjście. zcatnastępnie rozpakuje wszystko, co otrzyma ze standardowego wejścia i wyśle ​​nieskompresowany ciąg znaków na standardowe wyjście. Następnie >przekieruje zcatdane wyjściowe do nowego pliku o nazwie vmlinux.

pozbyć się
źródło
Dzięki! To ma teraz sens. Jednak „1f 8b 08 00” nie zwrócił ani nic dla mojego jądra po kilku sekundach wykonania. Najwyraźniej kod się zmienił. Wszelkie sugestie, jak uzyskać nowy zestaw magicznych liczb?
@ Lord Loh .: Dwie możliwości: 1) Liczby magiczne przekraczają granice linii na odwyjściu. Użyj bgrep, aby wyszukać 1f8b0800. 2) Jądro jest kompresowane przy użyciu innego algorytmu. Spróbuj fd377a585a00na XZ lub 425a6839dla bzip2 .
user1686
@ grawity - Dziękujemy za odpowiedź. Próbowałem tego. ani 1f8b0800, fd377a585a00, ani 425a6839 nie zwróciły żadnych wyników. Zacząłem więc odcinać bajt po bajcie, aż uzyskałem kilka wyników, a były to setki dopasowań :-( Więc nadal nie mam sukcesu.
Lord Loh.
LZMA to „5d 00 00 80” według minimodding.com/… . Nadal nie działało dla mnie.
Sam Brightman,
27

Źródła jądra zawierają obecnie skrypt dla tegoextract-vmlinux . Nie musisz rzucać własnym.

Zobacz tę SO odpowiedź .

Craig Ringer
źródło
1
Czy jest to dostępne w Ubuntu 14.04? Widziałem to w repozytorium git, w jakim pakiecie ubuntu mogę go znaleźć? - Dziękuję :-)
Lord Loh.
@LordLoh apt-file search extract-vmlinuxdaje kilka pakietów nagłówków jądra Linuksa i locate extract-vmlinuxprowadzi do kilku trafień na mojej lokalnej maszynie Ubuntu 18.04: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxchociaż nic na PATHto nie wygląda.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
W przypadku ARM nie działa z „extract-vmlinux: Cannot find vmlinux”: unix.stackexchange.com/questions/352215/...
Ciro Santilli 事件 改造 中心 法轮功 六四 事件
7

W rzeczywistości przed wygenerowaniem vmlinuzpliku większość symboli jest usuwana. Więc nie można odbudować prawdziwy vmlinuxze vmlinuzplik nie będzie tak użyteczne dla debugowania.

ninjalj
źródło
2

Natknąłem się na prosty problem - szukam poprawnej wersji vmlinux na wypadek awarii. Zamiast próbować dekompresować vmlinuz do vmlinux.

Lepszym rozwiązaniem jest: zainstaluj RPM:, kernel-debuginfoże RPM zawiera odpowiedni plik vmlinux.

Zwróć uwagę na nazwę rpm, istnieje wiele podobnych (mylących) nazw. Musi być:kernel-debuginfo-$(version).rpm

Henz
źródło
1

Nowoczesne jądra nie zawsze są (w rzeczywistości nie zawsze) skompresowane przez gzip. Mogą używać bzip2 lub LZMA. Szybkie wyszukiwanie w Internecie nie pomogło mi znaleźć magicznych ciągów dla tych metod kompresji - być może lepiej będzie sprawdzić kilka obrazów jądra, aby znaleźć niezmienny nagłówek zawierający kod dekompresyjny.

CarlF
źródło
1

Powyższe linie dekompresyjne działały dla mnie i, oczywiście, jądro zostało rozebrane. Dlatego nie ma tam dobrych informacji.

Jeśli chcesz wprowadzić zmiany w starym jądrze, na przykład w debugowaniu, użyj go, uname -raby uzyskać wersję swojego jądra i uzyskać jego źródło:

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

Źródło znajdzie się w /usr/src/linux... cddrzewie źródeł i:

make oldconfig
make

Spróbuje to znaleźć plik zawierający konfigurację dla aktualnie działającego jądra - zwykle

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

i użyj go do tej kompilacji, odtwarzając w ten sposób działające jądro.

Zbuduj to tak, jak chcesz; w razie potrzeby mają dostęp do niezakończonego jądra.

Pociski powyżej prawdopodobnie nie znajdą magicznej liczby gzip z powodu odstępów. Tak, nadal są kompresowane w ten sam sposób, chociaż piszę rok po oryginalnej dyskusji. Wyślij dane wyjściowe lessi wyszukaj 1f 8blub nawet 1f. Sprawdź resztę bajtów ręcznie, aby ustalić dopasowanie i sprawdź, czy masz pierwszą instancję. Użyj znalezionego przesunięcia, pamiętając, że jest dziesiętny.

kdm
źródło