Вирусы в UNIX, или Гибель Титаника II


Заражение посредством расширения кодовой секции файла


Наибольшую скрытность вирусу обеспечивает внедрение в кодововую секцию заражаемого файла, находящуюся глубоко в середине последнего. Тело вируса, сливаясь с исходным машинным кодом, виртуально становится совершенно неотличимым от "нормальной" программы, и обнаружить такую заразу можно лишь анализом ее алгоритма (см. так же "Основные признаки вирусов").

Безболезненное расширение кодовой секции возможно лишь в ELF- и COFF-файлах (под "безболезненностью" здесь понимается отсутствие необходимости в перекомпиляции файла-жертвы), и достигается оно за счет того замечательного обстоятельства, что стартовые виртуальные адреса сегментов/секций отделены от их физических смещений, отсчитываемых от начала файла.

Алгоритм заражения ELF-файла в общем виде выглядит так (внедрение в COFF-файлы осуществляется аналогичным образом):

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

q       заголовок таблицы секций (Section Header Table) перемещается вниз на величину, равную длине тела вируса. Для этого вирус увеличивает содержимое поля e_shoff, оккупирующего 20h – 23h байты ELF-заголовка, (примечание: заголовок таблицы секций, равно как и сами секции, имеет значение только для компоновочных файлов, загрузчик исполняемых файлов их игнорирует, независимо от того присутствуют они в файле или нет);

q       просматривая Program Header Table, вирус находит сегмент, наиболее предпочтительный для заражения (т. е. тот сегмент, в который указывает точка входа);

q       длина найденного сегмента увеличивается на величину, равную размеру тела вируса. Это осуществляется путем синхронной коррекции полей p_filez и p_memz;

q       все остальные сегменты смещаются вниз, при этом поле p_offset каждого из них увеличивается на длину тела вируса;

q       анализируя заголовок таблицы секций (если он только присутствует в файле), вирус находит секцию, наиболее предпочтительную для заражения (как правило заражается секция, находящаяся в сегменте последней: это избавляет вируса от необходимости перемещения всех остальных секций вниз);




Начало  Назад  Вперед