18

Я уже пробовал распаковывать, 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.

6 ответов6

27

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

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

    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 .

24

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

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

7

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

2

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

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

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

1

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

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 . Проверьте остальные байты вручную, чтобы определить соответствие и убедиться, что у вас есть первый экземпляр. Используйте найденное смещение, помня, что оно десятичное.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .