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