Como faço para descompactar vmlinuz para vmlinux?

18

Eu já tentei descompactar, gzip e todas as outras soluções que surgem como resultados do google e que não funcionaram para mim.

To get just the image search for the GZ signature - 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

so the image begins at 24576+8 => 24584. Then just copy the image from the point and decompress it -

> 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

Got these instructions verbatim from a forum online: http://www.codeguru.com/forum/showthread.php?t=415186

Este processo não funciona para mim e acaba dando erros que afirma arquivo não encontrado 0024576 e todos os números subseqüentes.

Como faço para extrair o vmlinux do vmlinuz?

Obrigado.

EDITADO: Esta é uma questão de engenharia reversa. Não tenho acesso à distro para instalar qualquer RPM ou recompilar. Eu começo com nada além de vmlinuz.

    
por Lord Loh. 18.06.2011 / 06:09

6 respostas

27

Talvez você tenha entendido mal o que o autor desse post significava.

  1. O arquivo vmlinuz contém outras coisas além do conteúdo gzipado, então você precisa descobrir onde o conteúdo gzipado é iniciado. Para fazer isso, use:

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

    O que isto faz é mostrar a você onde, nesse arquivo, você pode encontrar o cabeçalho gzip. A saída se parece com:

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

    Isso significa que em 0024576 (pelo menos para o autor do post, o seu pode ser um lugar completamente diferente) no arquivo vmlinuz , você encontrará os valores binários " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45 ". Você está procurando por 1f 8b 08 00 , que pode ser encontrado a partir do caractere 9 em diante, ou, em 0024576 + 8 (comece a contar de 0) = 24584 .

  2. Agora que você sabe onde o conteúdo gzip começa (na posição 24584 ) você pode usar dd para extrair o conteúdo gzipado e soltá-lo. Para fazer isso, use:

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

    O primeiro comando irá procurar essa posição e copiar tudo para stdout. zcat , em seguida, irá descompactar tudo o que obtém de stdin e emitirá a cadeia não compactada para stdout. Em seguida, o > redirecionará a saída de zcat para um novo arquivo chamado vmlinux .

por 18.06.2011 / 06:28
24
por 09.08.2013 / 18:41
7

Na verdade, antes de gerar o arquivo vmlinuz , a maioria dos símbolos é removida. Portanto, você não pode reconstruir um verdadeiro vmlinux de vmlinuz , o arquivo não será tão útil para depuração.

    
por 20.06.2011 / 22:22
2

Eu encontrei um problema simples - procurando pela versão correta do vmlinux para travamento. Em vez de tentar descomprimir o vmlinuz para o vmlinux.

A melhor solução é: instalar o RPM: kernel-debuginfo , que o RPM contém o arquivo vmlinux adequado.

Preste atenção no nome do rpm, existem vários nomes similares (confusos). Tem que ser: kernel-debuginfo-$(version).rpm

    
por 19.07.2012 / 02:29
1

Os kernels modernos nem sempre são (na verdade, geralmente não) compactados com gzip. Eles podem usar bzip2 ou LZMA. Uma rápida pesquisa na web não me ajudou a encontrar as seqüências de caracteres mágicas para esses métodos de compactação - é melhor você verificar várias imagens do kernel para encontrar o cabeçalho invariável que inclui o código de descompactação.

    
por 20.06.2011 / 23:11
1

As linhas de descompressão acima funcionaram para mim e, claro, o kernel foi removido. Portanto, não há boas informações lá.

Se você precisar fazer alterações em seu kernel antigo, como colocar em depuração, use uname -r para obter a revisão de seu kernel e obter sua origem:

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

A origem estará em /usr/src/linux... cd na árvore de origem e:

make oldconfig
make

Isto tentará encontrar o arquivo contendo a configuração para o kernel atualmente em execução - geralmente

/boot/config-\'uname -r\' 

e use-o para esta construção, recriando assim o kernel em execução.

Construa do jeito que você quiser; tenha acesso ao kernel não-limitado, conforme necessário.

Os shells acima provavelmente não encontrarão o número mágico do gzip devido ao espaçamento. Sim, eles ainda são comprimidos da mesma maneira, embora eu esteja escrevendo um ano após a discussão original. Envie a saída para less e procure por 1f 8b ou mesmo 1f . Verifique o restante dos bytes manualmente para determinar uma correspondência e verifique se você possui a primeira instância. Use o deslocamento encontrado lembrando que é decimal.

    
por 07.09.2012 / 20:57