Cómo extraer y desensamblar un kernel de Linux

Extraer y examinar el código de ensamblaje desensamblado para su kernel de Linux puede ser realmente útil si desea buscar algún código que no funcione correctamente o si desea examinar los puntos de entrada para varias funciones. El proceso es bastante intuitivo una vez que conoce las herramientas necesarias que se requieren.

El proceso a continuación se describe para Ubuntu 20.04, pero también debería funcionar para otros sistemas operativos basados ​​en GNU/Linux. Usaremos la  utilidad de línea de comandos objdump que viene preinstalada con todas las distribuciones de Ubuntu. Para verificar si está instalado y funcionando, escriba lo siguiente en su terminal y debería ver la versión y la información de licencia sobre el programa.

objdump --version

El ejecutable del kernel de Linux se llama  vmlinuz . Este es el archivo ejecutable que primero se carga en la memoria cuando iniciamos nuestra computadora y esto es lo que desmontaremos. El archivo se encuentra en  el directorio /boot/ . Sin embargo, está comprimido. Primero tendremos que extraerlo antes de desarmarlo usando el  script extract-vmlinux que viene con los encabezados de Linux.

PASO 1: Copiar el ejecutable comprimido del kernel en una ubicación diferente:
Primero, crearemos una copia de nuestro kernel en una ubicación de nuestra elección y  cd en ese directorio. Los privilegios de superusuario son necesarios para este paso.

mkdir ~/kernel-tmp
sudo cp /boot/vmlinuz-$(uname -r) ~/kernel-tmp
cd kernel-tmp

PASO 2: Extrayendo el kernel:
Ahora extraeremos el kernel comprimido que hemos copiado en nuestro directorio. Usaremos  el script extract-vmlinux que viene con nuestros encabezados de Linux.

sudo /usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux vmlinuz-$(uname -r) > decomp-vmlinuz

El comando anterior ejecutará el  script extract-vmlinux para nuestra copia del kernel y lo generará en un archivo con el nombre  decomp-vmlinuz que se ubicará en nuestro directorio de trabajo actual.

PASO 3: Desmontaje:
Ahora estamos listos para desmontar nuestro ejecutable descomprimido. Simplemente ejecute el siguiente comando

objdump -D decomp-vmlinuz > disassembled-vmlinuz.asm

El código del kernel desensamblado ahora se puede encontrar en el archivo dissassembly-vmlinuz.asm

PASO 4: Encontrar símbolos:
El archivo kernel desensamblado no tiene símbolos, por lo que no podemos encontrar el punto de partida de las funciones muy fácilmente. Linux almacena todos los nombres de los símbolos y su dirección inicial en un archivo separado. Copiaremos ese archivo también para facilitar el acceso.

sudo cp /boot/System.map-$(uname -r) ./

Ahora, podemos buscar fácilmente el nombre de nuestro símbolo en el  archivo System.map-xxx-xx-generic  para obtener la dirección de inicio, luego podemos buscar esa dirección en el  archivo dissassembly-vmlinuz.asm .
Por ejemplo, podríamos grep para  register_keyboard_notifier

sudo cat System.map-$(uname -r) | grep register_keyboard_notifier

lo que dará una salida algo así como:

ffffffff816ec720 T register_keyboard_notifier

Podemos copiar la dirección inicial y buscarla en el código del kernel desensamblado para encontrar algo como esto:

ffffffff816ec720:    e8 4b 13 98 ff           callq  0xffffffff8106da70
ffffffff816ec725:    55                       push   %rbp
ffffffff816ec726:    48 89 fe                 mov    %rdi,%rsi
ffffffff816ec729:    48 c7 c7 a0 f7 d8 82     mov    $0xffffffff82d8f7a0,%rdi
ffffffff816ec730:    48 89 e5                 mov    %rsp,%rbp
ffffffff816ec733:    e8 18 bb 9d ff           callq  0xffffffff810c8250
...

Publicación traducida automáticamente

Artículo escrito por ayush.verma16 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *