Вирус и Пингвин

Xakep, номер #043, стр. 043-058-2


несколько слов о задачах. Практика показывает, что максимальный урон наносят те

вирусы, которые тихо лежат, ожидая своей 13-ой пятницы или дня смерти Ленина :).

Это факт. Ведь господа Касперские, Соломоны и Лозинские помогут тебе, вирусмейкеру, если твое детище выявлено, стреножено и каст... тьфу, ты...

препарировано =). Основной ущерб от вирусов будет только тогда, когда они

сработают синхронно на большом количестве машин, после этого их уже можно лечить

и убивать сколько вздумается: они ведь свое дело сделали. Да и

вирусы-долгожители в современном мире вряд ли возможны. Волшебников не бывает,

поэтому код нашего вируса - платформенно зависим и должен работать вне

зависимости от своего положения в зараженной программе. Также в нем (на то он и

вирус!) нельзя использовать динамические библиотеки (даже С runtime) и выделять

память под глобальные переменные в сегменте данных. С другой стороны, это не

могут быть и вирусы-демоны, так как с ними просто бороться: в конце концов,

можно явно оговорить список разрешенных процессов.

В рамках этой статьи разберем заражение исполняемых файлов, но никакого кода не

жди: я не преследовал цели научить писать вирусы, да и статья не об этом. Все

будет вкратце и общих словах. Итак, для исполняемых файлов и библиотек

используется формат ELF. Форма ELF'a описана в файле /usr/include/elf.h. Советую

тебе внимательно ознакомиться с содержимым этого файла, чтобы представлять себе

в дальнейшем, о чем идет речь. Все исполняемые файлы, созданные ld, всегда

отображаются в одну и ту же область памяти. Заголовок программы лежит по адресу

0x08048001, хотя это и не является постоянной величиной. В принципе

распределение памяти зависит от параметров, с которыми при создании файла

запускался ld, но все почему-то используют параметры по умолчанию. Это облегчает

вирусмейкеру задачу. Вообще, ld всегда создает исполняемые файлы со структурой:

1 - Заголовок ELF (Elf32_Ehdr)

2 - Заголовок программы (Elf32_Phdr)

3 - Интерпретатор программы (если слинковано динамически)

4 - Сегмент кода

5 - Сегмент данных

6 - Заголовок секций (Elf32_Shdr)

Весь файл от начала до конца загружается в единый сегмент, называемый "code" или

"text". Код, производимый gcc, мало пригоден для вирусов, так как он не может

работать в любом месте программы, поэтому внедрить получается только asm. Самое

сложное при написании вируса - сохранение работоспособности зараженной

программы. Для заражения надо рассчитать количество свободного места под код

вируса, вставить вредоносный код между сегментом кода и сегментом данных. Также

нужно модифицировать и настроить код вируса на реальную входную точку программы,

изменить входную точку на входную точку вируса и модифицировать заголовок

программы так, чтобы вирус был включен в сегмент кода, перенастроив все

последующие указатели и записав модифицированный файл. Модификация входной

точки состоит в изменении адреса, с которого должно начинаться выполнение

программы - e_entry. Этот новый адрес должен быть равен сумме базового

виртуального адреса p_vaddr и размера старого сегмента кода в файле p_filesz.

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