Comment décompresser vmlinuz en vmlinux?

20

J'ai déjà essayé de décompresser, gzip et toutes les autres solutions qui apparaissent sous la forme de résultats Google et celles-ci n'ont pas fonctionné pour moi.

Pour obtenir juste la recherche d'image pour la signature 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

donc l'image commence à 24576+8 => 24584. Il suffit ensuite de copier l'image à partir du point et de la décompresser -

> 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

Vous avez ces instructions textuellement sur un forum en ligne: http://www.codeguru.com/forum/showthread.php?t=415186

Ce processus ne fonctionne pas pour moi et finit par donner des erreurs qui indiquent le fichier non trouvé 0024576 et tous les numéros suivants.

Comment dois-je procéder pour extraire vmlinux de vmlinuz?

Je vous remercie.

EDITÉ: Il s'agit d'une question de rétro-ingénierie. Je n'ai pas accès à la distribution pour installer un RPM ou recompiler. Je commence avec rien mais vmlinuz.

Lord Loh.
la source
2
Pourquoi veux-tu faire cela?
Flimzy
C'est en fait pour un ami qui a dû en faire quelque chose. La question semblait intéressante et je l'ai poursuivie pour mon intérêt académique. Une alternative à cela est de construire le noyau: - /
Eh bien, pour l'intérêt académique, je ne sais pas si c'est facilement possible. Je crois qu'un noyau vmlinuz a un préambule exécutable - c'est essentiellement une archive auto-extractible. C'est pourquoi l'utilisation de gunzip droit n'a pas fonctionné pour vous. La méthode citée tente de sauter ce préambule. Pourquoi ça ne marche pas, je n'en suis pas sûr. Peut-être que quelqu'un d'autre ayant des intérêts académiques similaires peut vous donner une réponse utile. :)
Flimzy

Réponses:

30

Vous avez peut-être mal compris ce que l'auteur de ce message voulait dire.

  1. Le vmlinuzfichier contient d'autres éléments que le contenu compressé, vous devez donc savoir où commence le contenu compressé. Pour ce faire, utilisez:

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

    Ce que cela fait, c'est de vous montrer où dans ce fichier vous pouvez trouver l'en-tête gzip. La sortie ressemble à:

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

    Cela signifie que dans 0024576(au moins pour l'auteur de l'article, le vôtre peut être quelque part complètement différent) dans le vmlinuzfichier, vous trouverez les valeurs binaires " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45". Vous recherchez 1f 8b 08 00, que vous pouvez trouver à partir du personnage 9 ou à 0024576 + 8(commencer à compter à partir de 0) = 24584.

  2. Maintenant que vous savez où commence le contenu compressé (à la position 24584), vous pouvez utiliser ddpour extraire ce contenu compressé et le décompresser. Pour ce faire, utilisez:

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

    La première commande cherchera à cette position et copiera tout sur stdout. zcatpuis décompressera tout ce qu'il obtient de stdin et affichera la chaîne non compressée sur stdout. Ensuite, la >redirigera zcatla sortie vers un nouveau fichier nommé vmlinux.

débarrasser
la source
Merci! Cela a du sens maintenant. Cependant, '1f 8b 08 00' n'a rien retourné pour mon noyau après quelques secondes d'exécution. Apparemment, le code a changé. Une suggestion sur la façon d'obtenir le nouvel ensemble de nombres magiques?
@Lord Loh.: Deux possibilités: 1) Les nombres magiques traversent les frontières de ligne dans odla sortie de. Utilisez bgrep pour rechercher 1f8b0800. 2) Le noyau est compressé en utilisant un algorithme différent. Essayez fd377a585a00pour xz ou 425a6839pour bzip2 .
user1686
@ grawity - Merci pour la réponse. J'ai essayé ça. ni 1f8b0800, fd377a585a00 ni 425a6839 n'ont renvoyé de résultats. J'ai donc commencé à couper la chaîne magique octet par octet jusqu'à ce que j'obtienne des résultats, et ils étaient des centaines de correspondances :-( Donc je suis toujours sans succès.
Lord Loh.
LZMA est "5d 00 00 80" selon minimodding.com/… . Ça ne marchait toujours pas pour moi.
Sam Brightman
27

Les sources du noyau contiennent maintenant un script pour celaextract-vmlinux ,. Vous n'avez pas besoin de rouler le vôtre.

Voir cette réponse SO .

Craig Ringer
la source
1
Est-ce disponible dans Ubuntu 14.04? Je l'ai vu dans le dépôt git, dans quel paquetage ubuntu puis-je le trouver? - Merci :-)
Lord Loh.
@LordLoh apt-file search extract-vmlinuxdonne plusieurs paquets d'en-tête du noyau linux, et locate extract-vmlinuxconduit à quelques hits sur ma machine Ubuntu 18.04 locale: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxbien que rien PATHn'y semble.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Pour ARM, il échoue avec "extract-vmlinux: Impossible de trouver vmlinux": unix.stackexchange.com/questions/352215/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
7

En fait, avant de générer le vmlinuzfichier, la plupart des symboles sont supprimés. Vous ne pouvez donc pas reconstruire un vrai à vmlinuxpartir de vmlinuz, le fichier ne sera pas aussi utile pour le débogage.

ninjalj
la source
2

J'ai rencontré un problème simple - à la recherche d'une version correcte de vmlinux pour un crash. Au lieu d'essayer de décompresser vmlinuz en vmlinux.

La meilleure solution est: installez le RPM kernel-debuginfo:, ce RPM contient le fichier vmlinux approprié.

Faites attention au nom du rpm, il existe plusieurs noms similaires (déroutants). Doit y avoir:kernel-debuginfo-$(version).rpm

Henri
la source
1

Les noyaux modernes ne sont pas toujours (en fait, généralement pas) compressés au format gzip. Ils peuvent utiliser bzip2 ou LZMA. Une recherche rapide sur le Web ne m'a pas aidé à trouver les chaînes magiques pour ces méthodes de compression - vous feriez mieux de vérifier plusieurs images du noyau pour trouver l'en-tête invariant qui inclut le code de décompression.

CarlF
la source
1

Les lignes de décompression ci-dessus ont fonctionné pour moi et, bien sûr, le noyau a été dépouillé. Par conséquent, aucune bonne information là-bas.

Si vous devez apporter des modifications à votre ancien noyau, comme le mettre dans le débogage, utilisez uname -rpour obtenir la révision de votre noyau et obtenir sa source:

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

La source sera dans /usr/src/linux... cdl'arborescence source et:

make oldconfig
make

Cela tentera de trouver le fichier contenant la configuration du noyau en cours d'exécution - généralement

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

et l'utiliser pour cette build recréant ainsi le noyau en cours d'exécution.

Construisez-le comme vous le souhaitez; avoir accès au noyau non dépouillé selon les besoins.

Les coquilles ci-dessus ne trouveront probablement pas le nombre magique gzip en raison de l'espacement. Oui, ils sont toujours compressés de la même manière, même si j'écris un an après la discussion d'origine. Envoyez la sortie à lesset recherchez 1f 8bou même 1f. Vérifiez le reste des octets manuellement pour déterminer une correspondance et vérifiez que vous disposez de la première instance. Utilisez le décalage trouvé en vous souvenant qu'il est décimal.

kdm
la source