
Uno strumento per recuperare un .ELF completamente analizzabile da un kernel grezzo, estraendo la tabella dei simboli del kernel (kallsyms)
Questo strumento consente di ottenere un file .ELF completamente analizzabile da un'immagine kernel vmlinux/vmlinuz/bzImage/zImage (sia un blob binario grezzo che un file .ELF preesistente ma privo di simboli), con simboli di funzioni e variabili recuperati.
A tale scopo, esegue una scansione del kernel per individuare una tabella dei simboli del kernel (kallsyms), una tabella dei simboli compressa presente in quasi tutti i kernel, per lo più invariata.
Poiché la tabella dei simboli in questione è originariamente compressa, dovrebbe recuperare stringhe che non sono visibili nel binario originale.
Produce un file .ELF che è possibile analizzare con IDA Pro e Ghidra. Questo strumento è quindi utile per il reverse engineering di sistemi embedded.
Utilizzo:
# Command line:
vmlinux-to-elf <input_kernel.bin> <output_kernel.elf>
# Command line, list symbol addresses only:
kallsyms-finder <input_kernel.bin> # If installed with uv
vmlinux-to-elf.kallsyms-finder # If installed with snap
# Command line, just decompress the kernel:
vmlinuz-decompressor <input_kernel.bin> <output_kernel.bin> # If installed with uv
vmlinux-to-elf.vmlinuz-decompressor # If installed with snap
# Graphical:
vmlinux-to-elf-gui # If installed with uv
vmlinux-to-elf.gui # If installed with snap
flatpak run re.fossplant.vmlinux-to-elf # If installed with flatpak
Installazione:
# Install CLI+GUI with Snap (recommended on Ubuntu)
sudo snap install vmlinux-to-elf
# Install CLI+GUI with yay (recommended on Arch, Manjaro)
yay -S vmlinux-to-elf libadwaita python-gobject
# Install CLI+GUI with uv (example with 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 # Install .desktop file
# Install CLI with uv and GUI with Flatpak (recommended on
# distributions with 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
Configurazione dell'ambiente di sviluppo locale:
sudo snap install --classic astral-uv
sudo apt install git
git clone [email protected]:marin-m/vmlinux-to-elf.git
# Dependencies for the GTK-4 GUI
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/
# Download Python modules and initialize virtualenv (creates ".venv",
# call "source .venv/bin/activate" to set up)
uv sync --extra gui
# Add vmlinux-to-elf to $PATH, so that the commands are callable
# system-wide (creates a symlink to the source in "~/.local/bin")
uv tool install -e .[gui]
boot.img Android, che iniziano con una magic ANDROID! o UNCOMPRESSED_IMG [OK]Una breve storia della tabella dei simboli "kallsyms" si trova all'inizio del file "kallsyms.py". In breve, è stata introdotta nel kernel Linux nella sua forma attuale intorno al 2004 e viene utilizzata, tra le altre cose, per stampare i messaggi "Kernel oops".
Contiene tuple di "nome simbolo", "indirizzo simbolo", "tipo simbolo" (i tipi di simbolo sono designati con una singola lettera in modo simile all'utility nm); queste informazioni sono compattate con un semplice algoritmo di compressione.
Lo schema seguente mostra come queste informazioni vengono serializzate nel kernel; l'offset di ciascuna struttura viene rilevato da vmlinux-to-elf tramite euristiche: