Пингвин на операционном столе Крис Касперски ака мыщъх Хакер, номер #081, стр. 081-102-2 Анализ показывает, что утилита 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: registry.gimp.org/detailview.phtml?plugin=Linux+Logo), а вот к экстрактору/патчеру мы присмотримся повнимательнее. Один из ключевых фрагментов файла logo_2_4.c, изменяющего лого static struct entry{unsigned char red; unsigned char green; unsigned char blue;} palette16[16] = { { 0, 0, 0, }, { 0, 0, 170, }, { 0, 170, 0, }, { 0, 170, 170, }, { 170, 0, 0, }, { 170, 0, 170, }, { 170, 85, 0, }, { 170, 170, 170,}, { 85, 85, 85, }, { 85, 85, 255, }, { 85, 255, 85, }, { 85, 255, 255, }, { 255, 85, 85, }, { 255, 85, 255, }, { 255, 255, 85, }, { 255, 255, 255 }, }; static void write_logo16(const char *filename, const unsigned char *data) { FILE *stream; int i, j, d; stream = fopen(filename, "w"); if (!stream) { perror("file open error: "); exit(1); } fputs("P3\n80 80\n255\n", stream); for (i = 0; i < 80*80/2; i += 2) { for (j = 0; j < 2; j++) { d = data[i+j] >> 4; fprintf(stream, " %3d %3d %3d", palette16[d].red, palette16[d].green, palette16[d].blue); d = data[i+j] & 15; fprintf(stream, " %3d %3d %3d", palette16[d].red, palette16[d].green, palette16[d].blue); } fputc('\n', stream); } fclose(stream); } int main(int argc, char *argv[]) { write_logo("logo_2_4.ppm",linux_logo,linux_logo_red,linux_logo_green,linux_logo_blue); write_logo_bw("logo_bw_2_4.pbm", linux_logo_bw); write_logo16("logo16_2_4.ppm", linux_logo16); return 0; } Алгоритм работы понять нетрудно. Как мы видим, в процессе изменения лого модифицируются файлы logo_2_4.ppm, logo_bw_2_4.pbm и logo16_2_4.ppm, которые мы и должны сохранить на «спасательную» дискету перед запуском утилиты. Подробнее об этом хаке можно почитать в статье HOWTO Linux Logo Hack (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 (lug.umbc.edu/~mabzug1/boot_logo-1.01), представляющую собой обыкновенный перловый скрипт, запущенный следующим образом: |