mdavis@pro-sol.cts.COM (Morgan Davis) (07/24/88)
Okay, I've written a vaccine for this virus (which I'm calling WOPFOG, because
that's what the screen says: WOP = Worshippers of Patrick, FOG = Friends of
Glen Bredon). No where in it does it say "CyberAIDS" -- so I don't know where
that name came from.
This BASIC program will detect the virus in all SYS files in your root
directory (or just one file you select). It will also, on your command, strip
the infection out of a sick file and will restore the file to its original
contents. In addition, it will fix byte $1FF in Block #2 of your root volume.
The virus uses this byte as a counter to determine when the henchman cometh
to lop off the vital part of your volume directory: Blocks #2 through #5 !!
----------------------------( cut here )-----------------------------------
100 REM ***********************************
110 REM * *
120 REM * [WOP] "Festering Hate" [FOG] *
130 REM * Vaccination Utility *
140 REM * by Morgan Davis *
150 REM * *
160 REM * This will detect and remove the *
170 REM * virus from SYS files. It will *
180 REM * also fix byte $1FF of Block 2. *
190 REM * *
200 REM ***********************************
210 :
220 DIM F$(52):D$ = CHR$ (4):BUF = 768:ADR = 8192
230 HOME
240 PRINT "*** NOTE ***": PRINT
250 PRINT "This program will detect and disinfect"
260 PRINT "only a certain strain of virus. If it"
270 PRINT "doesn't detect a virus, it does not"
280 PRINT "mean that one does not exist in a file!"
290 PRINT
300 PRINT "Check a (F)ile or (V)olume: ";: GOSUB 750
310 FIL = A$ = "F":VOL = A$ = "V"
320 IF NOT (FIL OR VOL) THEN PRINT : END
330 PRINT : INPUT "Pathname: ";P$:F$(1) = P$:F = 1
340 IF P$ = "" THEN END
350 PRINT D$"VERIFY"P$: PRINT
360 IF FIL THEN 450
370 PRINT D$"OPEN"P$",TDIR": PRINT D$"READ"P$
380 INPUT A$: INPUT A$: INPUT A$:F = 0
390 INPUT A$: IF A$ = "" THEN 420
400 IF MID$ (A$,18,3) = "SYS" THEN F = F + 1:F$(F) = MID$ (A$,2,15)
410 GOTO 390
420 PRINT D$"CLOSE"
430 IF NOT F THEN PRINT "Volume "P$" contains no SYS files.": END
440 :
450 FOR I = 1 TO F
460 PRINT "Checking "F$(I)"...";
470 PRINT D$"BLOAD"F$(I)",TSYS,A"BUF",L3"
480 IF PEEK (BUF) < > 76 THEN 640
490 OFF = ( PEEK (BUF + 1) + PEEK (BUF + 2) * 256) - ADR - 6
500 X = BUF + 6
510 PRINT D$"BLOAD"F$(I)",TSYS,A"BUF",L114,b"OFF
520 IF PEEK (X + 107) < > 199 THEN 640
530 RESTORE
540 READ N: IF N = PEEK (X) THEN X = X + 1: GOTO 540
550 ON N > = 0 GOTO 640
560 CALL - 198: PRINT "INFECTED! Kill the virus? ";: GOSUB 750
570 IF A$ < > "Y" THEN 650
580 PRINT "Working hard...";
590 PRINT D$"BLOAD"F$(I)",TSYS,A"ADR
600 FOR X = 0 TO 5: POKE ADR + X, PEEK (BUF + X): NEXT
610 PRINT D$"DELETE"F$(I): PRINT D$"CREATE"F$(I)",TSYS"
620 PRINT D$"BSAVE"F$(I)",TSYS,A"ADR",L"OFF
630 PRINT F$(I)" cured!": GOTO 650
640 PRINT "not infected."
650 NEXT
660 :
670 OP = 128: GOSUB 790: REM READ_BLOCK
680 I = PEEK (ADR + 511): IF NOT I THEN END
690 PRINT : PRINT P$" has a fuse! (counter = "I"/30)"
700 PRINT "Extinguish it? ";: GOSUB 750
710 IF A$ < > "Y" THEN END
720 POKE ADR + 511,0:OP = 129: GOSUB 790: REM WRITE_BLOCK
730 PRINT "Done.": END
740 :
750 GET A$: IF A$ = CHR$ (27) THEN END
760 IF A$ > "_" THEN A$ = CHR$ ( ASC (A$) - 32)
770 PRINT A$: RETURN
780 :
790 POKE 768,32: POKE 769,0: POKE 770,191: REM JSR $BF00
800 POKE 771,OP: POKE 772,9: POKE 773,3: REM DB OP / DW $0309
810 POKE 774,133: POKE 775,0: POKE 776,96: REM STA $00 / RTS
820 POKE 777,3: POKE 778, PEEK (48944)
830 POKE 779,ADR - INT (ADR / 256) * 256: POKE 780, INT (ADR / 256)
840 POKE 781,2: POKE 782,0
850 CALL 768:I = PEEK (0): IF I THEN PRINT "MLI Err #"I" OP="OP: END
860 RETURN
870 :
880 DATA 32,88,255,186,189,0,1,141,1,3,202,189,0,1,141,0,3,238,0,3,-1
----------------------------( cut here )-----------------------------------
--Morgan Davis
UUCP: crash!pnet01!pro-sol!mdavis
ProLine: mdavis@pro-sol
ARPANet: crash!pnet01!pro-sol!mdavis@nosc.mil
InterNet: mdavis@pro-sol.cts.com