Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #81, СЕНТЯБРЬ 2005 г.

Пингвин на операционном столе

Крис Касперски ака мыщъх

Хакер, номер #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), представляющую собой обыкновенный перловый скрипт, запущенный следующим образом:

Назад на стр. 081-102-1  Содержание  Вперед на стр. 081-102-3