Как мне распаковать vmlinuz в vmlinux?

20

Я уже пробовал распаковывать, gzip и все другие решения, которые появляются как результаты Google, и они не работают для меня.

Чтобы получить только поиск изображения для подписи GZ - 1f 8b 08 00.

> od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45

поэтому изображение начинается с 24576+8 => 24584. Затем просто скопируйте изображение с точки и распакуйте его -

> dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
1450414+0 records in
1450414+0 records out
1450414 bytes (1.5 MB) copied, 6.78127 s, 214 kB/s

Получил эти инструкции дословно с форума онлайн: http://www.codeguru.com/forum/showthread.php?t=415186

Этот процесс не работает для меня и в итоге выдает ошибки, в которых говорится, что файл не найден 0024576 и все последующие номера.

Как мне продолжить извлечение vmlinux из vmlinuz?

Спасибо.

РЕДАКТИРОВАНИЕ: Это вопрос обратной инженерии. У меня нет доступа к дистрибутиву, чтобы установить любой RPM или перекомпилировать. Я начинаю только с vmlinuz.

Лорд лох
источник
2
почему ты хочешь сделать это?
Хлипкий
Это на самом деле для друга, который должен был что-то сделать с этим. Вопрос казался интересным, и я преследовал его ради академического интереса. Альтернативой этому является сборка ядра: - /
Ну, для академического интереса, я не знаю, легко ли это возможно. Я считаю, что ядро ​​vmlinuz имеет исполняемую преамбулу - по сути, это самораспаковывающийся архив. Вот почему использование прямой пушки не работает для вас. Приведенный метод пытается пропустить эту преамбулу. Почему это не работает, я не знаю точно. Может быть, кто-то другой с похожими академическими интересами может дать вам полезный ответ. :)
Хлипкий

Ответы:

30

Возможно, вы не поняли, что имел в виду автор этого поста.

  1. vmlinuzФайл содержит другие вещи , кроме сжата GZIP содержания, так что вам нужно , чтобы узнать, где начинается с gzip'нутым контентом. Для этого используйте:

    od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
    

    Это показывает, где в этом файле вы можете найти заголовок gzip. Вывод выглядит так:

    0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45
    

    Это означает, что в 0024576(по крайней мере, для автора поста ваш vmlinuzфайл может быть совершенно другим) в файле вы найдете двоичные значения " 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45". Вы ищете 1f 8b 08 00, который можно найти начиная с символа 9 или, 0024576 + 8начиная с (начинайте считать с 0) = 24584.

  2. Теперь, когда вы знаете, где начинается сжатый контент (в позиции 24584), вы можете использовать его ddдля распаковки и разархивирования. Для этого используйте:

    dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
    

    Первая команда будет искать эту позицию и копировать все в стандартный вывод. zcatзатем распакует все, что получает от stdin, и выведет несжатую строку в stdout. Затем >перенаправит zcatвывод в новый файл с именем vmlinux.

избавиться
источник
Благодарность! Это имеет смысл сейчас. Однако '1f 8b 08 00' ничего не вернул моему ядру после нескольких секунд выполнения. Видимо код изменился. Любое предложение о том, как получить новый набор магических чисел?
@Lord Loh .: Две возможности: 1) Магические числа пересекают границы в odвыходных данных. Используйте bgrep для поиска 1f8b0800. 2) Ядро сжимается с использованием другого алгоритма. Попробуйте fd377a585a00для xz или 425a6839для bzip2 .
user1686
@ grawity - Спасибо за ответ. Я попробовал это. ни 1f8b0800, ни fd377a585a00, ни 425a6839 не дали никаких результатов. Поэтому я начал разбивать магическую строку побайтно до тех пор, пока не получил несколько результатов, а их были сотни матчей :-( Так что я все еще безуспешен.
Лорд Лох.
LZMA является "5d 00 00 80" в соответствии с minimodding.com/... . Все еще не работал для меня.
Сэм Брайтман
27

Исходники ядра теперь содержат скрипт для этогоextract-vmlinux . Вам не нужно кататься самостоятельно.

Смотрите этот так ответ .

Крейг Рингер
источник
1
Это доступно в Ubuntu 14.04? Я видел это в git repo, в каком пакете ubuntu я могу найти его? - Спасибо :-)
Лорд Лох.
@LordLoh apt-file search extract-vmlinuxпредоставляет несколько пакетов заголовков ядра linux и locate extract-vmlinuxприводит к нескольким попаданиям на мою локальную машину с Ubuntu 18.04: /usr/src/linux-headers-4.15.0-33/scripts/extract-vmlinuxхотя в PATHэтом ничего нет .
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
Для ARM он не работает с «extract-vmlinux: Не удается найти vmlinux»: unix.stackexchange.com/questions/352215/…
Сиро Сантилли, 19 ноября 1818 г.
7

На самом деле, перед генерацией vmlinuzфайла большинство символов удаляются. Таким образом , вы не можете восстановить истинные vmlinuxиз vmlinuz, файл не будет столь же полезен для отладки.

ninjalj
источник
2

Я столкнулся с простой проблемой - ищу правильную версию vmlinux для сбоя. Вместо того, чтобы пытаться распаковать vmlinuz в vmlinux.

Лучшее решение: установите RPM: kernel-debuginfoэтот RPM содержит правильный файл vmlinux.

Обратите внимание на название rpm, есть несколько похожих (сбивающих с толку) имен. Должен быть:kernel-debuginfo-$(version).rpm

Генри
источник
1

Современные ядра не всегда (на самом деле не всегда) сжимаются gzip. Они могут использовать bzip2 или LZMA. Быстрый веб-поиск не помог мне найти магические строки для этих методов сжатия - вам лучше проверить несколько образов ядра, чтобы найти инвариантный заголовок, который включает код распаковки.

CarlF
источник
1

Линии декомпрессии выше работали для меня и, конечно, ядро ​​было удалено. Поэтому никакой хорошей информации там нет.

Если вам нужно внести изменения в ваше старое ядро, например, поставить его в отладочный uname -rрежим , используйте для получения ревизии вашего ядра и получения его источника:

sudo apt-get source linux-image-\`uname -r\`

Источник будет в /usr/src/linux... cdдереве исходников и:

make oldconfig
make

Это попытается найти файл, содержащий конфигурацию для работающего в данный момент ядра - обычно

/boot/config-\`uname -r\` 

и использовать его для этой сборки, воссоздав тем самым работающее ядро.

Постройте это так, как вы хотите; иметь доступ к незарезанному ядру по мере необходимости.

Снаряды выше, вероятно, не найдут магический номер gzip из-за расстояния. Да, они по-прежнему сжимаются так же, хотя я пишу через год после первоначального обсуждения. Отправьте вывод на lessи найдите 1f 8bили даже 1f. Проверьте остальные байты вручную, чтобы определить соответствие и убедиться, что у вас есть первый экземпляр. Используйте найденное смещение, помня, что оно десятичное.

KDM
источник