LINUX.ORG.RU

Перепаковка bzImage

 ,


0

1

Немного странный вопрос, учитывая то, что с Линуксами я на «Вы».

Итак, задача. Есть bzImage размером больше 100Мб. Не спрашивайте про версии, чем собиралось и т.д. Этого я не знаю. Насколько я понимаю, внутри код загрузчика, ядра и есть большая часть упакованных данных. Смещение этих данных собственно нашел интуитивно, т.е по префиксу заголовка .z Распаковал и получил большой ELF - 130Мб. Этот ELF содержит много секций, но примечательны две init.text и init.data init.data - это упакованный initrd. Т.е из него получаем ram-диск с полным образом системы.

Очень нужно распаковать все это дело, но правильно. Не интуитивно искать нужный поток данных в bzImage, а как-то «по понятиям». И в итоге распаковать содержимое ram-диска. Затем в этом содержимом нужно изменить часть файлов (пропатчить/заменить - не суть) и все упаковать обратно. Подскажите пожалуйста правильное направление. Компилировать мне не из чего, нужно собрать как было и возможно откорректировать смещения/crc/размеры... Заменить секцию ELF - не проблема. Проблема правильно создать inird - образ и затем правильно создать конечный bzImage

Ответ на: комментарий от intelfx

Т. е. по сути ты уже всё сделал, просто откуси от bzImage всё что идёт раньше сжатого заголовка, разожми, вытащи секцию через objcopy, отредактируй образ, запихни секцию обратно (тем же инструментом), сожми, припиши в начало то, что откусил.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Спасибо за ответ.

Просто я не совсем понимаю как работает bzImage. Смотрю его в IDA. Видно стартовый код в реальном режиме, но кода распаковки не вижу. В самом конце файла есть куски текста от этого кода, но код скорее всего работает не в реальном режиме и непонятно по каким адресам. Т.е нормально интерпретировать его не получается. Хочется понять как происходит распаковка содержимого bzImage. Где то ведь в коде есть указатели и размер. Чтобы грамотно создать новый образ, нужно откорректировать эти вещи. Что касается ELF - тут всё немного проще. Заменить секцию - не проблема. Проблема лишь правильно создать образ, т.е правильно упаковать обратно распакованное. Может есть какие-то нюансы, я не знаю. Но сейчас основная проблема - это bzImage. Ктстати за ссылку отдельное спасибо, скрипт extract-vmlinux делает то же самое, что я своей интуицией. Но похоже скрипт тоже применяет интуицию и ищет признаки сжатого блока. На той же странице написано, что bzImage - это bootsect.o + setup.o + misc.o + piggy.o но в моем случае как-то больше похоже на bootsect.o + setup.o + piggy.o + misc.o поэтому не понятно. Нигде нет толковой нормальной информации по каким адресам и как грузится bzImage, в какой момент переключается в защищенный режим, как распаковывает образ и куда и как его запускает. В общем проблемы в отсутствии знаний и опыта(

planetzeus
() автор топика
Ответ на: комментарий от planetzeus

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

Зачем это всё?

Ищешь по сигнатуре начало сжатого блока. Это сжатый vmlinux. Меняешь его как хочешь, потом втыкаешь обратно вместо старого.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Так после сжатого блока какой-то кусок несжатого. Я не знаю что это. Говорю, похоже на код распаковки, но не могу его правильно интерпретировать. Если мой сжатый образ будет больше на несколько байт - может быть всё поломается. Шансов, что новый сжатый образ будет байт в байт размером со старым - 0%

planetzeus
() автор топика
Ответ на: комментарий от planetzeus

Гм. Загляни в скрипты сборки ядра, начиная с make bzImage. Можно включить verbose-режим, чтобы видеть непосредственно выполняемые команды.

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.