Como descompactar vmlinuz no vmlinux?

20

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

Para obter apenas a pesquisa de imagens da assinatura 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

então a imagem começa às 24576+8 => 24584. Em seguida, basta copiar a imagem do ponto e descompactá-la -

> 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

Obtenha estas instruções literalmente em um fórum on-line: http://www.codeguru.com/forum/showthread.php?t=415186

Esse processo não funciona para mim e acaba gerando erros que indicam o arquivo não encontrado 0024576 e todos os números subseqüentes.

Como proceder para extrair o vmlinux do vmlinuz?

Obrigado.

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

Lorde Loh.
fonte
2
Por que você quer fazer isso?
Flimzy
Na verdade, isso é para um amigo que teve que fazer algo com isso. A pergunta parecia interessante e eu a busquei pelo meu interesse acadêmico. Uma alternativa para isso é construir o kernel: - /
Bem, por interesse acadêmico, não sei se é facilmente possível. Eu acredito que um kernel vmlinuz tem um preâmbulo executável - é essencialmente um arquivo de extração automática. É por isso que usar o gunzip direto não funcionou para você. O método citado tenta pular esse preâmbulo. Por que não funciona, não sei ao certo. Talvez alguém com interesses acadêmicos semelhantes possa lhe dar uma resposta útil. :)
Flimzy

Respostas:

30

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

  1. O vmlinuzarquivo contém outras coisas além do conteúdo compactado, então você precisa descobrir onde o conteúdo compactado começa. Para fazer isso, use:

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

    O que isso faz é mostrar 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 0024576(pelo menos para o autor da postagem, o seu pode estar em algum lugar completamente diferente) no vmlinuzarquivo, 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 1f 8b 08 00, que pode ser encontrado do personagem 9 em diante ou em 0024576 + 8(comece a contar de 0) = 24584.

  2. Agora que você sabe onde o conteúdo compactado é compactado (na posição 24584), você pode usar ddpara extrair esse conteúdo compactado e descompactá-lo. Para fazer isso, use:

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

    O primeiro comando procurará nessa posição e copiará tudo para stdout. zcatentão, descompactará tudo o que obtém do stdin e exibirá a string não compactada no stdout. Em seguida, o >redirecionará zcata saída para um novo arquivo chamado vmlinux.

livrar
fonte
Obrigado! Isso faz sentido agora. No entanto, '1f 8b 08 00' não retornou nada para o meu kernel após alguns segundos de execução. Aparentemente, o código mudou. Alguma sugestão sobre como obter o novo conjunto de números mágicos?
@ Lord Loh .: Duas possibilidades: 1) Os números mágicos cruzam os limites de linha na odsaída de. Use bgrep para procurar 1f8b0800. 2) O kernel é compactado usando um algoritmo diferente. Tente fd377a585a00para xz ou 425a6839para bzip2 .
grawity
@ grawity - Obrigado pela resposta. Eu tentei isso. nem 1f8b0800, fd377a585a00 nem 425a6839 retornaram nenhum resultado. Então comecei a cortar a seqüência mágica de bytes em bytes até obter alguns resultados, e foram centenas de correspondências :-( Portanto, ainda estou sem sucesso.
Lord Loh.
LZMA é "5d 00 00 80" de acordo com minimodding.com/… . Ainda não funcionou para mim.
Sam Brightman
27

As fontes do kernel agora contêm um script para issoextract-vmlinux ,. Você não precisa rolar sozinho.

Veja esta resposta SO .

Craig Ringer
fonte
11
Isso está disponível no Ubuntu 14.04? Eu o vi no repositório git, em qual pacote ubuntu posso encontrá-lo? - Obrigado :-)
Lorde Loh.
O @LordLoh apt-file search extract-vmlinuxfornece vários pacotes de cabeçalho do kernel do linux e locate extract-vmlinuxleva a alguns hits na minha máquina local Ubuntu 18.04: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxembora nada PATHpareça.
Ciro Santilli escreveu
Para o ARM, ele falha com "extract-vmlinux: Não é possível encontrar o vmlinux": unix.stackexchange.com/questions/352215/…
Ciro Santilli
7

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

ninjalj
fonte
2

Corri para um problema simples - procurando a versão correta do vmlinux para travar. Em vez de tentar descomprimir o vmlinuz no vmlinux.

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

Preste atenção ao nome da rpm, existem vários nomes semelhantes (confusos). Tem de ser:kernel-debuginfo-$(version).rpm

Henry
fonte
1

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

CarlF
fonte
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 no seu kernel antigo, como colocá-lo em depuração, use uname -rpara obter a revisão do seu kernel e obter sua fonte:

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

A fonte estará na /usr/src/linux... cdárvore de fontes e:

make oldconfig
make

Isso tentará encontrar o arquivo que contém a configuração do kernel atualmente em execução - geralmente

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

e use-o para essa compilação, recriando o kernel em execução.

Construa da maneira que você deseja; tenha acesso ao kernel sem remoção, conforme necessário.

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

kdm
fonte