home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / virus / xenozap.lha / XenoZap.mod < prev    next >
Text File  |  1989-12-01  |  6KB  |  200 lines

  1. MODULE XenoZap;
  2.  
  3. (*
  4.    PROGRAM :  XenoZap
  5.    VERSION :  1.0
  6.    AUTHOR  :  Kevin Kelm
  7.    LANGUAGE:  Modula-2
  8.    COMPILER:  BenchMark
  9.    DATE    :  2 AM, 12/1/89
  10.    STATUS  :  Public Domain
  11. *)
  12.  
  13. FROM SYSTEM    IMPORT TSIZE, ADR, SETREG, REG, INLINE;
  14. FROM System    IMPORT argc, argv, DOSBase;
  15. FROM InOut     IMPORT WriteString, WriteCard, WriteLn;
  16. FROM AmigaDOS  IMPORT FileHandle, Open, Close, Read, Write, FileLock,
  17.                       Lock, UnLock, Examine, ExNext, FileInfoBlockPtr, Seek,
  18.                       SigBreakCtrlC;
  19. FROM Strings   IMPORT CopyString, ConcatString, StringLength;
  20. FROM Memory    IMPORT AllocMem, FreeMem, MemReqSet;
  21. FROM Tasks     IMPORT TaskPtr, FindTask;
  22.  
  23. VAR
  24.     fh : FileHandle;
  25.     infected, directories : CARDINAL;
  26.     path : ARRAY [0..107] OF CHAR;
  27.     i : CARDINAL;
  28.     mytask : TaskPtr;
  29.     foundinmem : BOOLEAN;
  30.  
  31. TYPE jmpptr = POINTER TO ARRAY [0..8] OF CARDINAL;
  32.  
  33. PROCEDURE Warn;
  34. BEGIN
  35.  IF NOT foundinmem THEN
  36.   WriteString ("\n\n\23333m WARNING:  Xeno virus found in memory. It has been removed.\23331m\n\n");
  37.   foundinmem := TRUE;
  38.  END (* if *);
  39. END Warn;
  40.  
  41.  
  42. PROCEDURE CheckInMem() : BOOLEAN;
  43. VAR vector : jmpptr;
  44. BEGIN
  45.  SETREG ( 8+4, LONGCARD(DOSBase) );
  46.  INLINE ( 41ECH, 0FFE2H );             (* LEA FFE2(A4), A0 *)
  47.  vector := jmpptr(REG(8));
  48.  IF vector^[0] = 4EF9H THEN
  49.   Warn;
  50.   vector^[0] := 70FFH; vector^[1] := 6000H; vector^[2] := 0068H;
  51.  END (* if *);
  52.  
  53.  SETREG ( 8+4, LONGCARD(DOSBase) );
  54.  INLINE ( 41ECH, 0FFACH );             (* LEA FFAC(A4), A0 *)
  55.  vector := jmpptr(REG(8));
  56.  IF vector^[0] = 4EF9H THEN
  57.   Warn;
  58.   vector^[0] := 70F5H; vector^[1] := 6000H; vector^[2] := 009EH;
  59.  END (* if *);
  60.  
  61.  SETREG ( 8+4, LONGCARD(DOSBase) );
  62.  INLINE ( 41ECH, 0FF6AH );             (* LEA FF6A(A4), A0 *)
  63.  vector := jmpptr(REG(8));
  64.  IF vector^[0] = 4EF9H THEN
  65.   Warn;
  66.   vector^[0] := 70EDH; vector^[1] := 6000H; vector^[2] := 00E0H;
  67.  END (* if *);
  68.  
  69.  RETURN foundinmem;
  70. END CheckInMem;
  71.  
  72.  
  73. CONST Xeno = 0D8E5EEEFH;
  74.       XenoAt = 043CH;
  75.  
  76.  
  77. PROCEDURE KillXeno(offset : LONGCARD);
  78. VAR branch : LONGCARD;
  79. BEGIN
  80.  branch := 60000462H;
  81.  IF Seek ( fh, offset, -1D ) # -1D THEN         (* write BRA #0462(PC) *)
  82.   IF Write ( fh, ADR(branch), 4D ) # -1D THEN
  83.   END (* if *);
  84.  END (* if *);
  85.  IF Seek ( fh, offset+LONGCARD(XenoAt), -1D ) # -1D THEN
  86.   IF Write ( fh, ADR("XenoZAPPED!"), 11D ) # -1D THEN
  87.   END (* if *);
  88.  END (* if *);
  89. END KillXeno;
  90.  
  91.  
  92. PROCEDURE CheckForXeno ( name : ARRAY OF CHAR );
  93. VAR lc : LONGCARD;
  94.     offset : LONGCARD;
  95. BEGIN
  96.  fh := Open ( ADR(name), 1004 );
  97.  IF fh # NIL THEN
  98.   IF Read ( fh, ADR( lc ), 4 ) # -1D THEN
  99.    IF lc = LONGCARD(03F3H) THEN           (* executable *)
  100.     WriteString ( "     "); WriteString ( name );
  101.     IF Read ( fh, ADR(lc), 4 ) # -1D THEN END;
  102.     IF Read ( fh, ADR(lc), 4 ) # -1D THEN END;
  103.     offset := 28D + (lc * 4D);
  104.     IF Seek ( fh, LONGCARD(XenoAt)+offset, -1D ) # -1D THEN
  105.      IF Read ( fh, ADR(lc), 4 ) # -1D THEN
  106.       IF lc = Xeno THEN
  107.        WriteString ( "\23333m     <==== INFECTED!\23331m  Now Fixing...");
  108.        INC ( infected );
  109.        KillXeno(offset);
  110.       END (* if *);
  111.      END (* if *);
  112.     END (* if *);
  113.     WriteString ( "\n");
  114.    END (* if *);
  115.   END (* if *);
  116.   Close ( fh );
  117.  END (* if *);
  118. END CheckForXeno;
  119.  
  120.  
  121. PROCEDURE ScanDir ( name : ARRAY OF CHAR );
  122. VAR tpath : ARRAY [0..107] OF CHAR;
  123.     fib : FileInfoBlockPtr;
  124.     fl : POINTER TO FileLock;
  125. BEGIN
  126.  fib := AllocMem ( SIZE(fib^), MemReqSet{});
  127.  fl  := AllocMem ( TSIZE(FileLock), MemReqSet{});
  128.  
  129.  fl^ := FileLock(0);
  130.  fl^ := Lock ( ADR(name), -2D );
  131.  IF fl^ # NIL THEN
  132.   IF Examine ( fl^, fib^ ) THEN
  133.    IF fib^.fibDirEntryType <= 0D THEN   (* executable... check this one *)
  134.     UnLock ( fl^ );
  135.     CheckForXeno ( name );
  136.    ELSE
  137.     WriteString("\23332m"); WriteString ( name ); WriteString("\23331m\n");
  138.     INC (directories);
  139.     WHILE ExNext ( fl^, fib^ ) AND NOT (SigBreakCtrlC IN mytask^.tcSigRecvd) DO
  140.      CopyString ( tpath, path );
  141.      IF (path[0] # 0C) AND (path[StringLength(path)-1] # ":") THEN
  142.       ConcatString ( path, "/");
  143.      END (* if *);
  144.      ConcatString ( path, fib^.fibFileName );
  145.  
  146.      IF fib^.fibDirEntryType <= 0D THEN (* executable... check it out *)
  147.       IF fib^.fibSize > 1124D THEN (* only need to check files big enough *)
  148.        CheckForXeno ( path );
  149.       END (* if *);
  150.      ELSE                               (* recurse into the directory *)
  151.       ScanDir ( path );
  152.      END (* if *);
  153.      CopyString ( path, tpath );  (* restore last path *)
  154.     END (* while *);
  155.     UnLock ( fl^ );
  156.    END (* if *);  
  157.   ELSE
  158.    UnLock ( fl^ );
  159.   END (* if *);
  160.  END (* if *);
  161.  
  162.  FreeMem ( fl, TSIZE(FileLock) );
  163.  FreeMem ( fib, SIZE(fib^) );
  164. END ScanDir;
  165.  
  166.  
  167.  
  168. BEGIN
  169.  WriteString("\23332m         XenoZap 1.0 Public Domain   \23331m\n");
  170.  WriteString("\2333mGREETINGS XENO VIRUS FROM THE AMIGA USERS,\n");
  171.  WriteString("           you scum-sucking PIG!\2330m\n");
  172.  
  173.  foundinmem := FALSE;
  174.  IF NOT CheckInMem() THEN
  175.   WriteString ("\n\n Xeno virus \23332mNOT\23331m active in memory.\n\n");
  176.  END (* if *);
  177.  
  178.  mytask := FindTask(0);  (* find ourselves *)
  179.  
  180.  infected := 0;
  181.  directories := 0;
  182.  IF argc > 1 THEN
  183.   FOR i := 1 TO argc-1 DO
  184.    IF NOT (SigBreakCtrlC IN mytask^.tcSigRecvd) THEN
  185.     CopyString ( path, argv^[i]^);
  186.     ScanDir ( path );
  187.    END (* if *);
  188.   END (* for *);
  189.  ELSE
  190.   WriteString ("\nFORMAT:  XenoZap <dev|dir|file> [dev|dir|file] . . .\n\n");
  191.  END (* if *);
  192.  
  193.  IF SigBreakCtrlC IN mytask^.tcSigRecvd THEN
  194.   WriteString ("\n\2330;31m***** BREAK\n");
  195.  END (* if *);
  196.  
  197.  WriteCard ( infected, 0 ); WriteString(" infected executables found in ");
  198.  WriteCard ( directories, 0 ); WriteString (" directories.\n");
  199. END XenoZap.
  200.