Автор: (c)Крис Касперски ака мыщъх
Кому не хотелось хакнуть ядро Linux'а? Каждый уважающий себя линуксоид должен попробовать это сделать! Ведь Linux, в отличие от Windows - настоящий полигон для хакерства, таящий в себе неожиданные возможности. Взять хотя бы лого, появляющееся на экране. Пришла пора взять в руки GIMP и что-нибудь нарисовать.
"Хаками" (hacks) называются всякие хитрости, забавные шутки и оригинальные приемы, в то время как под "хакерством" (hacking) традиционно понимается взлом программ или сетевые атаки. Вроде бы, похожие термины, а какая разница!
Эта статья открывает целый цикл публикаций, рассказывающих о том, что крутого можно сделать с ядром. И начнем мы с изменения логотипа.
Обычно при загрузке Linux'а появляется характерный пингвин, которым уже никого не удивишь, и который ужасно раздражает. Хочется чего-нибудь новенького. Как изменить стандартное лого на что-то свое? Есть несколько путей.
Рисунок 1. Стандартное лого.
Начнем с компиляции ядра. За отображение лого ответственны следующие файлы: /usr/src/linux/drivers/video/* и /usr/src/linux/include/linux/linux_logo.h. Всякий раз, когда ядро загружается в отладочном (debug) или молчаливом (quiet) режиме, эти файлы (в откомпилированном виде, конечно) получают управление и выводят изображение на экран.
Само лого обитает в файле linux_logo.h, где оно хранится в виде обыкновенного массива данных, кусочек которого для наглядности приведен ниже:
Листинг 1. Фрагмент файла linux_logo.h, содержащего logo.
Изменять его можно как вручную, так и автоматически. Ручной режим мы трогать не будем, поскольку ничего интересного в нем нет (так, сплошная рутина), гораздо проще запустить специальную утилиту и она все сделает сама. В отличие от мира Windows, погруженного в корпоративный мрак, в котором бродят зубастые монстры, под Linux народ не зажимает исходники и мы легко можем проанализировать, что делает та или иная программа и нужно ли это нам. Вмешательство в ядро всегда чревато фатальными последствиями. Один неверный шаг - и система отказывается закружаться или уничтожает все данные жесткого диска подчистую. Поэтому перед всякой установкой потенциально небезопасной программы необходимо пролистать ее исходный текст и посмотреть, какие именно файлы она изменяет. Остается зарезервировать их на дискету, CD-R/RW диск или карту FLASH-памяти (в просторечии - "свисток"). А загрузиться можно и с Live CD!
Мы будем использовать утилиту logo, которую можно скачать с демократичного бельгийского сервера: http://members.chello.be/cr26864/Linux/fbdev/logo.tar.bz2. Распаковав архив, мы обнаружим три Си-файла и один makefile. Двоичных файлов, увы, нет и их приходится компилировать самостоятельно. Поддерживаются две версии ядер - с номерами 2.2 и 2.4. В версии 2.6 все сильно по-другому и к ней нужен свой подход, о котором мы чуть позже и поговорим, а пока вернемся к нашей текущей задаче.
Анализ показывает, что утилита logo фактически состоит из двух частей: конвертора входного изображения, сосредоточенного в файле pnmtologo.c, и непосредственного самого патчера ядра, сосредоточенного в файлах logo_2_2.c и logo_2_4.c (каждый - для своей версии ядра). Строго говоря, logo_2_4.c включает в себя экстрактор текущего лого и патчер, а logo_2_2.c только экстрактор лого старого формата, но это уже детали. Само же logo в обоих случаях представляет собой обыкновенный PCX-файл с глубиной цветности не более 256 цветов и общей площадью не более чем 786432 пикселей (что соответствует разрешению 1024x768).
Конвертор нам совершенно неинтересен (кстати говоря, вместо него можно воспользоваться плагином для редактора GIMP: http://registry.gimp.org/detailview.phtml?plugin=Linux+Logo), а вот к экстрактору/патчеру мы присмотримся повнимательнее.
Ниже приведен ключевой фрагмент файла logo_2_4.c:
Листинг 2. Ключевой фрагмент файла logo_2_4.c, меняющего лого.
Алгоритм работы понять нетрудно. Как мы видим, в процессе изменения лого модифицируются файлы logo_2_4.ppm, logo_bw_2_4.pbm и logo16_2_4.ppm, которые мы и должны сохранить на "спасательную" дискету перед запуском утилиты. Подробнее об этом хаке можно почитать с статье "HOWTO Linux Logo Hack" (http://gentoo-wiki.com/HOWTO_Linux_Logo_Hack).
А вот другой способ изменения лого, подходящий для старых ядер 2.2.x, которые все еще встречаются в природе. Сначала забэкапим оригинальный файл /usr/include/linux/linux_logo.h (впрочем, если бэкапа не будет, его всегда можно скачать из сети), затем подготавливаем свое собственное лого в формате .xpm с разрешением 80х80 пикселей и палитрой ровно из 214 цветов (в этом нам опять-таки поможет GIMP), натравливаем на нее утилиту boot_logo-1.01 (http://lug.umbc.edu/~mabzug1/boot_logo-1.01), представляющей собой обыкновенный перловый скрипт, запущенный следующим образом "./boot_logo-1.01 your_image.xpm > linux_logo.h" и если все пройдет без ошибок, в текущей директории образуется файл linux_logo.h, который нам предстоит скопировать в каталог /usr/include/linux. Теперь необходимо перекомпилировать ядро и перезагрузиться. Если мы не повиснем, на экране высветиться новое лого, которое может выглядеть, например, так, как показано на рис 2. При возникновении трудностей обращайтесь к http://lug.umbc.edu/~mabzug1/boot_logo.html.
Рисунок 2. Видоизмененное лого.
С ядром 2.6 все намного проще. Создаем изображение в формате png любого разумного размера и пропускаем его через штатную утилиту pngtopnm, запущенную со следующими ключами командной строки: "./pngtopnm logo.png | pnmtoplainpnm > logo_linux_clut224.ppm", а затем полученный файл перебрасываем на место постоянной дислокации утилитой cp: "./cp logo_linux_clut224.ppm /usr/src/linux/drivers/video/logo/".
Остается настроить ядро, для чего можно воспользоваться интерактивным конфигуратором. Среди прочих полезных (и не очень) пунктов в нем будет "Bootup logo" и "Standard 224-color Linux logo". Вот их-то и необходимо взвести.
Device Drivers -> Graphics Support -> [*] Support for frame buffer devices [*] VESA VGA graphics support Console display driver support -> [*] Video mode selection support <*> Framebuffer Console support [*]Select compiled-in fonts [*]VGA 8x16 font Logo configuration-> [*] Bootup logo [*] Standard 224-color Linux logo
Рисунок 3. Интерактивное конфигурирование лого в kernel 2.6.
После всего этого перекомпилируем ядро, запустив make и настроим конфигурационный файл /boot/grub/menu.lst, добавив ключ 'vga=0x318' и kernel (hd0,0)/vmlinuz root=/dev/sda3 vga=0x318. Перезагрузимся. Новое лого торжественно появится на экране, сияющее всеми своими 224-цветами. Красиво? Скорее, аляповато. Настоящие хакеры признают только текстовой терминал и консольный режим с ANSI-псвевдрографикой, а GUI облагают матом и прогоняют прочь.
Большой популярностью пользуются ASCII-лого, которые можно установить с помощью Linux_logo программы (http://www.deater.net/weave/vmwprod/linux_logo/). Там же на сервере находится коллекция готовых образцов, два из которых приведены ниже:
Рисунок 4. Нестандартное ASCII-лого.
Рисунок 5. Еще один пример ASCII-лого.
Вот мы и хакнули Linux, причем не одним, а сразу несколькими вариантами. Простор для творчества здесь поистине безграничен и поиск по ключевым словам "linux logo" в Интернете выдает огромное количество ресурсов, один интереснее другого. Так что, налетайте!