Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Нет приятней и полезней венерических болезней!

Dr.Klouniz

Спецвыпуск Xakep, номер #035, стр. 035-066-3


Вирусы – паразиты (high level languag parasitic)

Еще одним продвинутым алгоритмом заражения является паразитный способ, суть которого в том, что вирус приписывает себя к зараженной программе. Способов этих туева хуча, но наиболее популярными являются два – приписывание вируса спереди или сзади к программе. В первом случае все ясно – заражение происходит как copy /b virus.exe program.exe, в итоге схема зараженной проги будет такая:

Работает все это тоже очень просто – вместо программы запускается вирус, который затем восстанавливает зараженную прогу (либо вылечивая ее, затем заражая снова, либо – сохраняя оригинальную версию в левый файл) и запускает ее. Опять же – юзер ничего не подозревает, потому что все работает. Для заражения таким способом используются функции WinAPI:

CreateFile, создающая указатель на новый файл, с доступом GENERIC_READ (для чтения из зараженного файла) или GENERIC_WRITE для записи тела вируса в файл. Между прочим, для этой функции есть флаги (dwShareMode), указывающие на то, как открываемый объект должен распределять доступ между процессами, например: FILE_SHARE_READ – другим процессам можно читать из файла, FILE_SHARE_WRITE - то же самое, для чтения. Эти вещи могут очень пригодиться начинающему вирмейкеру, особенно – не читающему Win32.hlp :). Есть еще устаревшая _lopen, но ее используют только в самых простых случаях.

_Lread или ReadFile – позволяют читать данные из файла. Допустим, тебе надо восстановить исходный файл из зараженного. Для этого необходимо сместиться на длину вируса (он же у нас первый) и прочесть все остальные данные в буфер. Сместиться можно с помощью функции _LSeek (ей передается указатель и число, на сколько смещать), а буфер – это, разумеется, массив/динамический массив. Несложно догадаться, что для таких манипуляций тебе надо знать ДЛИНУ вируса. То есть – объявлять специальную константу VirSize, значение которой ты уточнишь после компиляции. А затем – снова компилируешь с новыми значениями.

Итак, тело вируса у нас в одном буфере, программа – в другом, что делать? Смотря что надо сделать :). Если запущен зараженный файл, то после отработки основного вирусного кода прогу придется слить в левый файл на диск (чтобы запустить ее оттуда, разумеется), который, как ты знаешь, создается процедурой _LCreate (ей передается указатель и атрибуты новорожденного, например – 0 - архивный), а запись осуществляется с помощью WriteFile или _LWrite. Прогу можно запустить с помощью функций CreateProcess или WinExec (лучше, все-таки, CreateProcess, не забудь, что вирусу нужно будет ждать завершения ее работы), после чего нам останется только удалить левый файл процедурой DeleteFile. И это все. О, чуть не забыл – любые изменения в файле должны завершаться CloseHandle, закрывающей файл, иначе никаких изменений там не будет, а ты будешь удивлен, почему же ничего не работает ;). Процесс заражения существующей программы в общем выглядит так:

Назад на стр. 035-066-2  Содержание  Вперед на стр. 035-066-4