¿Cómo descomprimo vmlinuz a vmlinux?

20

Ya he intentado descomprimir, gzip y todas las demás soluciones que aparecen como resultados de google y estas no me han funcionado.

Para obtener solo la imagen, busque la firma 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

entonces la imagen comienza en 24576+8 => 24584. Luego simplemente copie la imagen desde el punto y descomprímalo.

> 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

Obtuve estas instrucciones textualmente de un foro en línea: http://www.codeguru.com/forum/showthread.php?t=415186

Este proceso no funciona para mí y termina dando errores que indican el archivo no encontrado 0024576 y todos los números posteriores.

¿Cómo procedo a extraer vmlinux de vmlinuz?

Gracias.

EDITADO: Esta es una pregunta de ingeniería inversa. No tengo acceso a la distribución para instalar ningún RPM o recompilar. Empiezo con nada más que vmlinuz.

Lord Loh
fuente
2
¿Por qué quieres hacer esto?
Flimzy
Esto es en realidad para un amigo que tuvo que hacer algo con él. La pregunta parecía interesante y la seguí por mi interés académico. Una alternativa a esto es construir el núcleo: - /
Bueno, por interés académico, no sé si es fácilmente posible. Creo que un kernel vmlinuz tiene un preámbulo ejecutable: es esencialmente un archivo autoextraíble. Es por eso que usar gunzip directo no funcionó para ti. El método citado intenta saltarse ese preámbulo. Por qué no funciona, no estoy seguro. Quizás alguien más con intereses académicos similares pueda darle una respuesta útil. :)
Flimzy

Respuestas:

30

Quizás entendiste mal lo que quería decir el autor de esa publicación.

  1. El vmlinuzarchivo contiene otras cosas además del contenido comprimido, por lo que debe averiguar dónde comienza el contenido comprimido. Para hacer eso, use:

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

    Lo que esto hace es mostrarle dónde en ese archivo puede encontrar el encabezado gzip. El resultado se ve así:

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

    Esto significa que al 0024576(en el vmlinuzarchivo, al menos para el autor de la publicación, el tuyo podría ser completamente diferente) , encontrarás los valores binarios " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45". Estás buscando 1f 8b 08 00, que se puede encontrar desde el personaje 9 en adelante, o, en 0024576 + 8(comienza a contar desde 0) = 24584.

  2. Ahora que sabe dónde comienza el contenido comprimido (en la posición 24584), puede usarlo ddpara extraer ese contenido comprimido y descomprimirlo. Para hacer eso, use:

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

    El primer comando buscará esa posición y copiará todo a stdout. zcatluego descomprimirá todo lo que obtiene de stdin y enviará la cadena sin comprimir a stdout. Luego >, redirigirá zcatla salida a un nuevo archivo llamado vmlinux.

eliminar
fuente
¡Gracias! Eso tiene sentido ahora. Sin embargo, '1f 8b 08 00' no devolvió nada para mi kernel después de unos segundos de ejecución. Al parecer, el código ha cambiado. ¿Alguna sugerencia sobre cómo obtener el nuevo conjunto de números mágicos?
@ Lord Loh .: Dos posibilidades: 1) Los números mágicos cruzan los límites de la línea en odla salida de '. Use bgrep para buscar 1f8b0800. 2) El núcleo se comprime usando un algoritmo diferente. Prueba fd377a585a00con xz o 425a6839con bzip2 .
user1686
@ Grawity - Gracias por la respuesta. Lo intenté ni 1f8b0800, fd377a585a00 ni 425a6839 arrojaron ningún resultado. Así que comencé a cortar el hilo mágico byte a byte hasta que obtuve algunos resultados, y fueron cientos de coincidencias :-( Así que todavía no tengo éxito.
Lord Loh.
LZMA es "5d 00 00 80" según minimodding.com/… . Todavía no funcionó para mí.
Sam Brightman el
27

Las fuentes del núcleo ahora contienen un script para estoextract-vmlinux ,. No necesitas rodar el tuyo.

Ver esta respuesta SO .

Craig Ringer
fuente
1
¿Está disponible en Ubuntu 14.04? Lo vi en el repositorio de git, ¿en qué paquete de ubuntu puedo encontrarlo? - Gracias :-)
Lord Loh.
@LordLoh apt-file search extract-vmlinuxofrece varios paquetes de encabezado de kernel de Linux y locate extract-vmlinuxgenera algunos resultados en mi máquina Ubuntu 18.04 local: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxaunque nada PATHparece.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Para ARM falla con "extract-vmlinux: No se puede encontrar vmlinux": unix.stackexchange.com/questions/352215/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
7

En realidad, antes de generar el vmlinuzarchivo, la mayoría de los símbolos se eliminan. Por lo tanto, no puede reconstruir un verdadero vmlinuxdesde vmlinuz, el archivo no será tan útil para la depuración.

ninjalj
fuente
2

Me encontré con un problema simple: buscaba la versión correcta de vmlinux para el bloqueo. En lugar de intentar descomprimir vmlinuz a vmlinux.

La mejor solución es: instalar RPM: kernel-debuginfoese RPM contiene el archivo vmlinux adecuado.

Presta atención al nombre de rpm, hay varios nombres similares (confusos). Tiene que ser:kernel-debuginfo-$(version).rpm

Enrique
fuente
1

Los núcleos modernos no siempre están (de hecho, no generalmente) comprimidos con gzip. Pueden usar bzip2 o LZMA. Una búsqueda rápida en la web no me ayudó a encontrar las cadenas mágicas para esos métodos de compresión; es mejor que verifique varias imágenes del kernel para encontrar el encabezado invariable que incluye el código de descompresión.

CarlF
fuente
1

Las líneas de descompresión anteriores funcionaron para mí y, por supuesto, el núcleo fue despojado. Por lo tanto, no hay buena información allí.

Si necesita hacer cambios en su núcleo anterior, como ponerlo en depuración, use uname -rpara obtener la revisión de su núcleo y obtener su fuente:

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

La fuente estará en /usr/src/linux... cdel árbol fuente y:

make oldconfig
make

Esto intentará encontrar el archivo que contiene la configuración para el núcleo actualmente en ejecución, generalmente

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

y úselo para esta compilación recreando así el núcleo en ejecución.

Construye eso de la manera que quieras; tener acceso al núcleo sin tirar según sea necesario.

Los proyectiles anteriores probablemente no encontrarán el número mágico gzip debido al espaciado. Sí, todavía están comprimidos de la misma manera, aunque estoy escribiendo un año después de la discusión original. Envíe la salida lessy busque 1f 8bo incluso 1f. Verifique el resto de los bytes manualmente para determinar una coincidencia y verifique que tenga la primera instancia. Use el desplazamiento encontrado recordando que es decimal.

kdm
fuente