Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: lucasluks1004 en 25 Agosto 2011, 02:44 AM

Título: Insertar codigo dentro de una sección del crypter
Publicado por: lucasluks1004 en 25 Agosto 2011, 02:44 AM
Bien como dice el titulo estoy haciendo mi crypter el cual ya es funcional ,,pero me di cuenta (no es gran secreto jaja) q los avs detectan los extra data en el stub como codigo malicisos obviamente el codigo q pego a lo ultimo del stub esta encryptado ,,ahora mi pregunta es como hacer para q ese codigo q meto sea parte del exe osea q este dentro de la ultima sección por ejemplo encotre esto ** algo viejo pero aun no logro hacerlo ,,si alguien me puede dar una mano se lo agredeceria mucho! ,,saludos



** http://foro.elhacker.net/programacion_vb/crear_un_pe_editor_simple-t229389.0.html (http://foro.elhacker.net/programacion_vb/crear_un_pe_editor_simple-t229389.0.html)
Título: Re: Insertar codigo dentro de una sección del crypter
Publicado por: BlackZeroX en 25 Agosto 2011, 02:47 AM
.
Debes realinear las secciones del formato PE, de tal manera que dicha estructura incluya los datos finales...

Dulces Lunas!¡.
Título: Re: Insertar codigo dentro de una sección del crypter
Publicado por: lucasluks1004 en 25 Agosto 2011, 02:52 AM
BlackZeroX gracias por contestar tan rapidamente !!!,,no me puedes dar un empujon un poquito mayor jaja ,,realmente entiendo lo q me dices pero hacerlo realidad es otra cosa ..
Título: Re: Insertar codigo dentro de una sección del crypter
Publicado por: BlackZeroX en 25 Agosto 2011, 03:00 AM
.
Traducelo esta en C (Son solo equivalencias...).



#include <windows.h>
#include <stdio.h>
#define ReadBinary "r+b"

/* Realing PE function
   Programmer : The Swash
   Thanks to  : Thor, Slek
   Dedicated  : Thor, Psymera, [Zero], Steve10120, Karcrack, Cobein
*/

int PEFileSize(char * fPath);
int AlingNum(int num, int aling);
char * BytesAling(int number);

int main(void)
{
    printf("%i ",RealingPE("C:\\hi.exe"));
    getchar();
   
}

int RealingPE(char * FilePath)
{
    int OriginalSize = 0;
    int ActualSize = 0;
    int iEOF = 0, iEOFAlingned = 0, iWrite = 0;
    FILE * lpFile;
    IMAGE_DOS_HEADER IDH;
    IMAGE_NT_HEADERS INH;
    IMAGE_SECTION_HEADER ISH;
   
    OriginalSize = PEFileSize(FilePath);
   
    if (OriginalSize != -1)
    {
                     lpFile = fopen(FilePath, ReadBinary);
                     if (lpFile != NULL)
                     {
                                fseek(lpFile,0,SEEK_END);
                                ActualSize = ftell(lpFile);
                                if (ActualSize - OriginalSize > 0)
                                {
                                               rewind(lpFile);
                                               fread(&IDH, sizeof(IDH), 1, lpFile);
                                               fseek(lpFile, IDH.e_lfanew, SEEK_SET);
                                               fread(&INH, sizeof(INH), 1, lpFile);
                                               fseek(lpFile, IDH.e_lfanew + sizeof(INH) + (sizeof(ISH) * (INH.FileHeader.NumberOfSections-1)), SEEK_SET);
                                               fread(&ISH, sizeof(ISH), 1, lpFile);
                                               iEOF = ActualSize - OriginalSize;
                                               iEOFAlingned = AlingNum(iEOF, INH.OptionalHeader.FileAlignment);
                                               if (ISH.VirtualAddress == INH.OptionalHeader.DataDirectory[2].VirtualAddress)
                                               {
                                                                      ISH.SizeOfRawData += iEOFAlingned;
                                                                      ISH.Misc.VirtualSize += iEOFAlingned;
                                                                      INH.OptionalHeader.SizeOfImage += iEOFAlingned;
                                                                      INH.OptionalHeader.DataDirectory[2].Size += iEOFAlingned;
                                                                      fseek(lpFile, IDH.e_lfanew, SEEK_SET),
                                                                      iWrite = fwrite(&INH, 1, sizeof(INH), lpFile);
                                                                      fseek(lpFile, IDH.e_lfanew + sizeof(INH) + (sizeof(ISH) * (INH.FileHeader.NumberOfSections-1)), SEEK_SET);
                                                                      iWrite = fwrite(&ISH, 1, sizeof(ISH), lpFile);
                                                                      if (iEOFAlingned - iEOF > 0)
                                                                      {
                                                                                       fseek(lpFile, ActualSize, SEEK_SET);
                                                                                       fwrite(BytesAling(iEOFAlingned - iEOF), iEOFAlingned - iEOF, 1, lpFile);
                                                                      }                 
                                                                      fclose(lpFile);
                                                                      return 0;
                                               }
                                               else
                                               {
                                                                      ISH.SizeOfRawData += iEOFAlingned;
                                                                      ISH.Misc.VirtualSize += iEOFAlingned;
                                                                      INH.OptionalHeader.SizeOfImage += iEOFAlingned;
                                                                      fseek(lpFile, IDH.e_lfanew, SEEK_SET),
                                                                      iWrite = fwrite(&INH, 1, sizeof(INH), lpFile);
                                                                      fseek(lpFile, IDH.e_lfanew + sizeof(INH) + (sizeof(ISH) * (INH.FileHeader.NumberOfSections-1)), SEEK_SET);
                                                                      fwrite(&ISH, sizeof(ISH), 1, lpFile);
                                                                      if (iEOFAlingned - iEOF > 0)
                                                                      {
                                                                                       fseek(lpFile, ActualSize, SEEK_SET);
                                                                                       fwrite(BytesAling(iEOFAlingned - iEOF), iEOFAlingned - iEOF, 1, lpFile);
                                                                      }                                                                                       
                                                                      fclose(lpFile);
                                                                      return 0;
                                               }

                                }
                                else
                                {
                                    return 1;
                                }
                     }
                     else
                     {
                         return -1;
                     }
    }
    else
    {
        return -1;
    }
}


int PEFileSize(char * fPath)
{
    IMAGE_DOS_HEADER IDH;
    IMAGE_NT_HEADERS INH;
    IMAGE_SECTION_HEADER ISH;
    FILE * lpFile;
    int sTemp = 0, i;
   
    lpFile = fopen(fPath,ReadBinary);
    if (lpFile != NULL)
    {
               fseek(lpFile, 0, SEEK_SET); // Seek to begin of file
               fread(&IDH, sizeof(IDH), 1, lpFile); // Read 64 bytes to IDH struct
               if (IDH.e_magic == IMAGE_DOS_SIGNATURE) // If IDH.e_magic = (MZ)
               {
                               fseek(lpFile, IDH.e_lfanew, SEEK_SET); // Seek in file in begin of NT Headers (PE)
                               fread(&INH, sizeof(INH), 1, lpFile); // Read in structure 248 bytes
                               if (INH.Signature == IMAGE_NT_SIGNATURE) // If INH.Signature = (PE)
                               {
                                                 for (i = 0; i < INH.FileHeader.NumberOfSections; i++) // go for all sections
                                                 {
                                                     fseek(lpFile, IDH.e_lfanew + sizeof(INH) + sizeof(ISH)*i, SEEK_SET); // Seek in actual section
                                                     fread(&ISH, sizeof(ISH), 1, lpFile); // Read section
                                                     sTemp += ISH.SizeOfRawData; // Save sizeofrawdata of section
                                                 }
                                                 sTemp += INH.OptionalHeader.SizeOfHeaders;
                                                 fclose(lpFile);
                                                 return sTemp;
                               }
                               else
                               {
                                   return -1;
                               }
               }
               else
               {
                   return -1;
               }
    }
    else
    {
        return -1;
    }
}

int AlingNum(int num, int aling)
{
    if( (num % aling == 0) || (num < aling) )
    {
           return aling;
    }
    else
    {
        return (num / aling) * aling + aling;
    }
}

char * BytesAling(int number)
{
     char * sTemp = (char *) malloc(number + 1);
     int i;
     for (i=0; i<number; i++)
     {
         sTemp[i] = '\0';
     }
     return sTemp;
}



Temibles Lunas!¡.
Título: Re: Insertar codigo dentro de una sección del crypter
Publicado por: lucasluks1004 en 25 Agosto 2011, 03:43 AM
gracias de vuelta ,,estoy medio oxidado en C ,pero buen veremos si le puedo sacar provecho!