
Un outil pour récupérer un .ELF entièrement analysable à partir d'un noyau brut, en extrayant la table des symboles du noyau (kallsyms)
Cet outil permet d'obtenir un fichier .ELF entièrement analysable à partir d'une image kernel vmlinux/vmlinuz/bzImage/zImage (qu'il s'agisse d'un blob binaire brut ou d'un fichier .ELF préexistant mais dépouillé de ses symboles), avec les symboles de fonctions et de variables récupérés.
Pour ce faire, il analyse votre kernel à la recherche d'une table de symboles kernel (kallsyms), une table de symboles compressée présente dans presque tous les kernels, la plupart du temps non modifiée.
Comme la table de symboles concernée est compressée à l'origine, il devrait récupérer des chaînes qui ne sont pas visibles dans le binaire d'origine.
Il produit un fichier .ELF que vous pouvez analyser avec IDA Pro et Ghidra. Cet outil est donc utile pour la rétro-ingénierie de systèmes embarqués.
Utilisation :
# Ligne de commande :
vmlinux-to-elf <input_kernel.bin> <output_kernel.elf>
# Ligne de commande, lister uniquement les adresses des symboles :
kallsyms-finder <input_kernel.bin> # Si installé avec uv
vmlinux-to-elf.kallsyms-finder # Si installé avec snap
# Ligne de commande, décompresser simplement le kernel :
vmlinuz-decompressor <input_kernel.bin> <output_kernel.bin> # Si installé avec uv
vmlinux-to-elf.vmlinuz-decompressor # Si installé avec snap
# Interface graphique :
vmlinux-to-elf-gui # Si installé avec uv
vmlinux-to-elf.gui # Si installé avec snap
flatpak run re.fossplant.vmlinux-to-elf # Si installé avec flatpak
Installation :
# Installer CLI+GUI avec Snap (recommandé sur Ubuntu)
sudo snap install vmlinux-to-elf
# Installer CLI+GUI avec yay (recommandé sur Arch, Manjaro)
yay -S vmlinux-to-elf libadwaita python-gobject
# Installer CLI+GUI avec uv (exemple avec Fedora)
sudo dnf install -y uv glib2-devel libadwaita-devel gtk4-devel \
gobject-introspection-devel python3-gobject-devel \
python3-devel cairo-devel @development-tools
uv tool install vmlinux-to-elf[gui]
vmlinux-to-elf-gui --install-metadata # Installer le fichier .desktop
# Installer CLI avec uv et GUI avec Flatpak (recommandé sur
# les distributions avec libadwaita < 1.6)
sudo dnf install -y uv flatpak @development-tools
uv tool install vmlinux-to-elf
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install re.fossplant.vmlinux-to-elf
Configuration de l'environnement de développement local :
sudo snap install --classic astral-uv
sudo apt install git
git clone [email protected]:marin-m/vmlinux-to-elf.git
# Dépendances pour l'interface graphique GTK-4
sudo apt install libgirepository-2.0-dev libadwaita-1-dev \
gir1.2-adw-1 gir1.2-gtk-4.0 python3-dev blueprint-compiler
cd vmlinux-to-elf
cp -a .github/hooks/* .git/hooks/
# Télécharger les modules Python et initialiser virtualenv (crée « .venv »,
# appeler « source .venv/bin/activate » pour l'activer)
uv sync --extra gui
# Ajouter vmlinux-to-elf au $PATH, afin que les commandes soient appelables
# à l'échelle du système (crée un lien symbolique vers la source dans « ~/.local/bin »)
uv tool install -e .[gui]
boot.img, commençant par une signature magique ANDROID! ou UNCOMPRESSED_IMG [OK]Un bref historique de la table de symboles « kallsyms » se trouve en haut du fichier « kallsyms.py ». En bref, elle a été introduite vers 2004 dans le kernel Linux sous sa forme actuelle et sert, entre autres, à afficher les messages « Kernel oops ».
Elle contient des tuples « nom du symbole », « adresse du symbole », « type du symbole » (les types de symboles étant désignés par une seule lettre, d'une manière similaire à l'utilitaire nm), ces informations étant densément empaquetées avec un algorithme de compression simple.
Le schéma ci-dessous montre comment ces informations sont sérialisées dans le kernel, le décalage de chaque structure respective étant détecté par vmlinux-to-elf via des heuristiques :