Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: The Swash en 27 Enero 2011, 01:24 am



Título: [C/SRC] Realign PE (Actualizado)
Publicado por: The Swash en 27 Enero 2011, 01:24 am
Código
  1. /*
  2.   -----------------------------------------------------------
  3.   - Function: RealignPE v2                                  -
  4.   - Programmer: The Swash                                   -
  5.   - Web: http://www.h-sec.org                               -
  6.   - Dedicated: Thor, Psymera, Steve10120, [Zero], Karcrack  -
  7.   -----------------------------------------------------------
  8. */
  9.  
  10. #include <windows.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #define ReadWriteBinary "r+b"
  14.  
  15. int AlingNum(int num, int aling);
  16. char * BytesAling(int number);
  17.  
  18. int main(void)
  19. {
  20.    printf("%i ",RealignPE("C:\\hi.exe"));
  21.    getchar();
  22.  
  23. }
  24.  
  25. int RealignPE(char * lpFile)
  26. {
  27.    IMAGE_DOS_HEADER IDH;
  28.    IMAGE_FILE_HEADER IFH;
  29.    IMAGE_OPTIONAL_HEADER IOH;
  30.    IMAGE_SECTION_HEADER ISH;
  31.  
  32.    DWORD PESignature = 0;
  33.    FILE * lFile;
  34.    int OriSize = 0;
  35.    int ActSize = 0;
  36.    int Alingned = 0;
  37.  
  38.    lFile = fopen(lpFile,ReadWriteBinary);
  39.    if (lFile == NULL) {return -1;}
  40.    else
  41.    {
  42.        fread(&IDH, 64, 1, lFile);
  43.        fseek(lFile, IDH.e_lfanew , SEEK_SET);
  44.        fread(&PESignature, 4, 1, lFile);
  45.        if (IDH.e_magic != IMAGE_DOS_SIGNATURE) {fclose (lFile); return -2;}
  46.        else
  47.        {
  48.            if(PESignature != IMAGE_NT_SIGNATURE) {fclose (lFile); return -3;}
  49.            else
  50.            {
  51.  
  52.                fseek(lFile, IDH.e_lfanew + 4, SEEK_SET);
  53.                fread(&IFH, sizeof(IFH), 1, lFile);
  54.                fseek(lFile, IDH.e_lfanew + 4 + sizeof(IFH), SEEK_SET);
  55.                fread(&IOH, IFH.SizeOfOptionalHeader, 1, lFile);
  56.                fseek(lFile, IDH.e_lfanew + 4 + sizeof(IFH) + IFH.SizeOfOptionalHeader + (sizeof(ISH)*(IFH.NumberOfSections-1)),SEEK_SET);
  57.                fread(&ISH, sizeof(ISH), 1, lFile);
  58.                fseek(lFile, 0, SEEK_END);
  59.                ActSize = ftell(lFile);
  60.                OriSize = ISH.PointerToRawData + ISH.SizeOfRawData;
  61.                if (ActSize - OriSize > 0)
  62.                {
  63.                    Alingned = AlingNum(ActSize - OriSize, IOH.FileAlignment);
  64.                    ISH.SizeOfRawData += Alingned;
  65.                    ISH.Misc.VirtualSize += Alingned;
  66.                    IOH.SizeOfImage = ISH.Misc.VirtualSize + ISH.VirtualAddress;
  67.                    IOH.SizeOfInitializedData += Alingned;
  68.                    if (ISH.VirtualAddress == IOH.DataDirectory[2].VirtualAddress)
  69.                    {
  70.                        IOH.DataDirectory[2].Size += Alingned;
  71.                    }
  72.                    fseek(lFile, IDH.e_lfanew + 4 + sizeof(IFH), SEEK_SET);
  73.                    fwrite(&IOH, 1, IFH.SizeOfOptionalHeader, lFile);
  74.                    fseek(lFile, IDH.e_lfanew + 4 + sizeof(IFH) + IFH.SizeOfOptionalHeader + (sizeof(ISH)*(IFH.NumberOfSections-1)),SEEK_SET);
  75.                    fwrite(&ISH, 1, sizeof(ISH), lFile);
  76.                    if (Alingned - (ActSize - OriSize) > 0)
  77.                    {
  78.                       fseek(lFile, ActSize, SEEK_SET);
  79.                       fwrite(BytesAling(Alingned-(ActSize - OriSize)), 1, Alingned-(ActSize - OriSize), lFile);
  80.                    }
  81.                    return 0;
  82.                }
  83.                else {return 1;}
  84.            }
  85.        }
  86.    }
  87. }
  88.  
  89.  
  90. int AlingNum(int num, int aling)
  91. {
  92.    if(num % aling == 0)
  93.    { return num; }
  94.    else if(num < aling)
  95.    { return aling; }
  96.    else { return (num / aling) * aling + aling; }
  97. }
  98.  
  99. char * BytesAling(int number)
  100. {
  101.     char * sTemp = (char *) malloc(number + 1);
  102.     int i;
  103.     for (i=0; i<number; i++)
  104.     {
  105.         sTemp[i] = '\0';
  106.     }
  107.     return sTemp;
  108. }

Bueno amigos, ya había trabajado en la versión 1 de esta funcion, la mejore mucho en cuanto al código y lo mejor que corregí los fallos que tenía!
Saludos


Título: Re: [C] Realign PE function
Publicado por: BlackZeroX en 27 Enero 2011, 03:39 am
.
Ya que estas con este tema para que sirve?, jamas lo entendi realmente, se que Realinea los Header pero para que?.

Dulces Luans!¡.


Título: Re: [C] Realign PE function
Publicado por: The Swash en 27 Enero 2011, 04:26 am
Vale BlackZeroX te explico.
Te lo pongo de la siguiente forma, las secciones definen la estructura del archivo, entendiendo de tal forma que la suma de todas ellas, más los parámetros (Cabecera PE) dan como resultado el peso del archivo, cuando se agrega información extra al final del archivo, la suma de los valores de las secciones mas la cabecera no dará el peso final del archivo, por ende antivirus suelen poner firmas al detectar este desbalance como Avira o F-PROT, Así que lo que este código hace es detectar el tamaño de la información extra agregada y la balancea en base al FileAlignment, luego se actualizan los valores de la ultima sección (VirtualSize y SizeOfRawData) y el SizeOfImage, balanceando el archivo como si fuera información natural de la última sección, evitando así detecciones.

Espero que te aya quedado claro, cualquier duda con gusto tendrá su respuesta.


Título: Re: [C] Realign PE function
Publicado por: kasiko en 27 Enero 2011, 13:49 pm
con tu permiso, me guardo este code  :rolleyes:


Título: Re: [C] Realign PE function
Publicado por: titan6146 en 8 Febrero 2011, 03:10 am
¿¿¿¿¿¿¿¿¿¿¿¿WTF??????????????? :(