|

Вирус и Пингвин
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
|