
Инструмент для восстановления полностью анализируемого .ELF-файла из сырого ядра путем извлечения таблицы символов ядра (kallsyms)
Этот инструмент позволяет получить полностью анализируемый файл .ELF из образа ядра vmlinux/vmlinuz/bzImage/zImage (либо из «сырого» бинарного файла, либо из уже существующего, но лишённого символов файла .ELF) с восстановленными символами функций и переменных.
Для этого он сканирует ваше ядро на наличие таблицы символов ядра (kallsyms) — сжатой таблицы символов, которая присутствует почти в каждом ядре в почти неизменном виде.
Поскольку соответствующая таблица символов изначально сжата, инструмент позволяет восстановить строки, которые не видны в исходном бинарном файле.
На выходе получается файл .ELF, который можно анализировать с помощью IDA Pro и Ghidra. Поэтому этот инструмент полезен для реверс-инжиниринга встраиваемых систем.
Использование:
# 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
Установка:
# 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
Настройка локального окружения для разработки:
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! или UNCOMPRESSED_IMG [OK]Краткая история таблицы символов «kallsyms» приведена в начале файла «kallsyms.py». Вкратце, она появилась в ядре Linux примерно в 2004 году в своём нынешнем виде и используется, среди прочего, для вывода сообщений «Kernel oops».
Она содержит кортежи «имя символа», «адрес символа», «тип символа» (типы символов обозначаются одной буквой, аналогично утилите nm), и эта информация плотно упакована простым алгоритмом сжатия.
На схеме ниже показано, как эта информация сериализуется в ядре; смещение каждой соответствующей структуры определяется vmlinux-to-elf с помощью эвристик: