Insertar codigo dentro de una sección del crypter

Iniciado por lucasluks1004, 25 Agosto 2011, 02:44 AM

0 Miembros y 1 Visitante están viendo este tema.

lucasluks1004

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

BlackZeroX

.
Debes realinear las secciones del formato PE, de tal manera que dicha estructura incluya los datos finales...

Dulces Lunas!¡.
The Dark Shadow is my passion.

lucasluks1004

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 ..

BlackZeroX

.
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!¡.
The Dark Shadow is my passion.

lucasluks1004

gracias de vuelta ,,estoy medio oxidado en C ,pero buen veremos si le puedo sacar provecho!