Электронная библиотека

Xakep

Xakep

Первый вирь - COMом

Xakep, номер #014, стр. 014-058-4


DTAbuffer db 128 dup(0)

Это увеличит размер тела вируса аж на 128 байт! Эти 128 байт иногда могут оказаться больше, чем сам вирь. Когда вирус получит управление, DTAbuffer будет находиться в конце com-ка. При запуске com-файл получает доступ ко всей свободной памяти, лежащей за его концом (и не только там, не будем распространяться о местонахождении концов :)). Что мешает использовать эту свободную память прямо в он-лайне? Поэтому в конце листинга нужно поставить:

DTAbuffer db ?

Такой DTAbuffer к файлу не линкуется. Что весьма укорачивает аппетиты виря.

Кроме DTA, естественно, нужно сохранять все используемые регистры. Некоторые из них сохранять необязательно, но восстанавливать придется все. :) Просто регистры AX, DX, BX, CX, BP, SI, DI равны нулю, когда стартует COM. Сегментные регистры в вире для com-ков не меняются - просто не нужны данные в других сегментах. Ну... мне не нужны, а кому-то :) может и понадобятся.

Теперь, напрягая свой склероз, надо вспомнить: каким именно был алгоритм поиска жертвы? А! В родительском каталоге и в текущем ищем com-файлы, плюс еще ищем во всех подкаталогах текущего каталога. Неужели все так просто? Конечно, нет!!! Тут появляется одна проблема: когда вирь будет перебирать подкаталоги, он будет в них заходить, чтобы поискать там com-ки. То есть он снова вызовет FindFirst, но уже для файлов, а не для каталогов. И запортит данные для каталогов в DTA. Вернувшись назад, вирь не сможет продолжить свой тримуфально-победный хулигано-бандитский путь. Значит, нужно завести еще одну DTA. Не много ли? Нет, ведь они все равно не линкуются к файлу, а памяти для запуска com-ка обычно больше чем даже килобайт, так что жаловаться не придется. DTA для каталогов я назвал DTAbuffer, а для файлов subDTAbuffer.

Чтобы сэкономить пару байт на поиске, я написал процедурку WALKAROUND, которая просто юзает FindFirst, FindNext, а потом вызывает то, что я ей подсуну. DIRUTIL - как раз одна из двух процедур, которые я прописываю для WALKAROUND:

mov word ptr [bp+util],(offset dirutil)-(offset util)-2

Разницу приходится вычислять потому, что я использую CALL NEAR, а все такие вызовы относительны - то есть адрес нужно давать отсчитывая от текущего.

В DIRUTIL нужно переставить DTA на subDTAbuffer, чтобы можно было искать файлы, а потом включить WALKAROUND прописав для нее FILEUTIL.

FILEUTIL проверяет все найденные под маску *.COM файлы на возможность заражения:

- файл должен быть по размерам в границе от 512 до 64000 байт.

- это не должен быть COMMAND.COM, который на самом деле не всегда COM

- файл должен быть доступен (FILEUTIL снимает все атрибуты, запоминая их)

Если файл подходит - вызывается infected file. Была бы жертва - вирь найдется ;)!

Обе процедуры устанавливают Carry флаг, когда необходимо прекратить поиск, и снимают его, когда поиск можно продолжать. WALKAROUND этот флаг проверяет и действует по обстановке, как сказал шеф. :). Прямо API вениковский получился!

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