границы сегментов всегда выравниваются на величину 4 Кб, между концом кодового сегмента и началом сегмента данных обычно можно наскрести некоторое количество незанятого пространства. Впрочем, никаких гарантий на этот счет у нас нет, а потому для заражения подходят далеко не все файлы.
1) вирус открывает файл и, считывая его заголовок, убеждается, что это действительно ELF;
2) просматривая program header table, вирус находит сегмент с атрибутом PL_LOAD и (PAGE_SIZE % p_filesz) > = virus_size; если же такого сегмента нет, вирус отказывается от заражения;
3) поля p_filez (размер на диске) и p_memsz (размер в памяти) соответствующего сегмента увеличиваются на длину тела вируса;
4) поле p_offset и факультативно sh_offset всех последующих сегментов/секций увеличивается на длину тела вируса;
5) поля e_phoff и факультативно e_shoff ELF-заголовка увеличивается на величину тела вируса;
2) вирус внедряем себя в конец выбранного сегмента;
6) для перехвата управления вирус корректирует точку входа в файл (e_entry), либо же внедряет в истинную точку входа jmp на свое тело.
Некоторые вирусы внедряются в область памяти между заголовком и началом первого сегмента (во всяком случае, пытаются это сделать). Однако большинство файлов «приклеивают» свой первый сегмент к заголовку, из-за чего для внедрения просто не остается свободного места.
Конкретная структура вирусного кода зависит от фантазии его разработчика и выглядит приблизительно так же, как и в Windows-вирусах. Обычно вначале находится расшифровщик, за ним расположены модуль поиска подходящих жертв, инжектор вирусного кода и процедура передачи управления файлу-носителю.
Для большинства ELF-вирусов характерна следующая последовательность системных вызовов: sys_open (mov eax, 05h/int 80h) открывает файл; sys_lseek (mov eax,13h) перемещает файловый указатель на нужное место; old_mmap (mov eax, 5Ah/int 80h) проецирует файл в память; sys_unmap (mov eax, 5Bh/int 80h) удаляет образ из памяти, записывая на диск все изменения, а sys_close (mov eax, 06/int 80h) закрывает сам файл.
Техника проецирования (mapping) значительно упрощает работу с файлами большого объема. Теперь уже не нужно выделять буфер, копируя туда файл по кускам, и всю черную работу можно переложить на плечи операционной системы, сосредоточив свои усилия непосредственно на процессе заражения. Правда, при заражении файла протяженностью в несколько гигабайт (например, самораспаковывающегося дистрибутива какого-то программного продукта) вирусу придется либо просматривать файл через «окно», проецируя в 4-гигабайтное адресное пространство различные его части, либо попросту отказаться от заражения, выбрав файл поприличнее. Подавляющее большинство вирусов именно так и поступает.
В ближайшее время, по-видимому, следует ожидать значительный рост численности ELF-вирусов, ибо для этого имеются все условия. Всплеск интереса к Linux пошел не на пользу этой операционной системе. В погоне за улучшениями ее превратили в решето, прикрутили «интуитивно понятный» графический интерфейс, но не предупредили пользователей, что прежде чем начать работать с системой, следует перелопатить тысячи страниц технической документации и прочитать хотя бы пару умных книжек, в противном случае зараза не заставит себя долго ждать. Чем больше народу перейдет на *nix, тем больше среди них окажется хакеров и вирусописателей, и тогда с *nix произойдет то же, что в свое время произошло с MS-DOS. Будут ли эти вирусы добродушными или злобными, зависит от тебя.
Классический механизм импорта внешних функций из/в ELF-файлов в общем виде выглядит так: на первом этапе вызова импортируемой функции из секции .text вызывается «переходник», который располагается в секции .plt (Procedure Linkable Table) и ссылается в свою очередь на указатель на функцию printf, что расположен в секции .got («Global Offset Tables»), ассоциированной с таблицей строк, содержащей имена вызываемых функций (или их хэши).
Ниже приведена схема вызова функции printf утилитой ls, позаимствованной из комплекта поставки Red Hat 5.0.
В какое место этой цепочки может внедриться вирус? Ну, прежде всего, он может создать подложную таблицу строк, перехватывая вызовы всех интересующих его функций. Чаще всего заражению подвергается функция printf/fprintf/sprintf (поскольку без нее не обходится практически ни одна программа) и функции файлового ввода/вывода, что автоматически обеспечивает прозрачный механизм поиска новых жертв для заражения.
Вирусы-спутники создают специальную библиотеку-перехватчик во всех заражаемых файлах. Поскольку IDA Pro при дизассемблировании ELF-файлов не отображает имя импортируемой библиотеки, заподозрить что-то неладное в этой ситуации нелегко. К счастью, HEX-редакторы еще никто не отменял. Другие же вирусы склонны манипулировать полями глобальной таблицы смещений, переустанавливая их на свое тело.
WWW
bochs
Качественный эмулятор ПК с интегрированным отладчиком внутри. Хорошо подходит для экспериментов с вирусами непосредственно на твоей рабочей машине без риска уничтожения информации. Бесплатен, распространяется с исходными текстами.
Executable and Linkable Format – Portable Format Specification
www.ibiblio.org/pub/historic-linux/ftp-archives/sunsite.unc.edu/Nov-06- 1994/GCC/ELF.doc.tar.gz
«Родная» спецификация на ELF-формат. Настоятельно рекомендуется к изучению всем вирусописателям, пробующим свои силы на платформе UNIX.
The Linux Virus Writing And Detection HOWTO
www.creangel.com/papers/writingvirusinlinux.pd f
Пошаговое руководство по проектированию и реализации вирусов под LINUX с кучей готовых примеров (на английском языке).
«UNIX viruses» от Silvio Cesare
http://vx.netlux.org/lib/vsc02.html
Статья, описывающая основные принципы функционирования UNIX-вирусов и способы их