Guest User

Untitled

a guest
Jan 19th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.79 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. DWORD align(DWORD number, DWORD alignment)
  6. {
  7.     if(number % alignment == 0)
  8.        return number;
  9.     else
  10.        return (number / alignment) * alignment + alignment;
  11. }
  12.  
  13. int main()
  14. {
  15.    IMAGE_DOS_HEADER dh;
  16.    IMAGE_NT_HEADERS nth;
  17.  
  18.    IMAGE_SECTION_HEADER * sección;
  19.    IMAGE_SECTION_HEADER nSeccion;
  20.     // char * stub_dos -> Datos del STUB_DOS
  21.     // char * dSecciones -> Datos de las secciones
  22.    long TamanoSecciones = 0;
  23.    int i;
  24.  
  25.    FILE * archivo = fopen("c:\\Mad.exe","r+b");
  26.    if (archivo == NULL)
  27.    {
  28.        printf("Error al leer el archivo\n");
  29.        getchar();
  30.  
  31.        return 1;
  32.    }
  33.  
  34.    fread(&dh,sizeof(dh),1,archivo); // Rellenamos IMAGE_DOS_HEADER
  35.  
  36.    char * stub_dos = (char*)malloc(dh.e_lfanew-0x40);
  37.  
  38.    fread(stub_dos,1,dh.e_lfanew-0x40,archivo); // Leemos el Stub DOS
  39.    fread(&nth,sizeof(nth),1,archivo); // leemos nt headers
  40.  
  41.    sección = (IMAGE_SECTION_HEADER*)malloc(sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections);
  42.  
  43.    fread(sección,sizeof(IMAGE_SECTION_HEADER),nth.FileHeader.NumberOfSections,archivo);
  44.  
  45.    /*for (i=0;i<=nth.FileHeader.NumberOfSections-1;i++)
  46.    {
  47.        printf("%i\n",sección[i].SizeOfRawData);
  48.        TamanoSecciones += sección[i].SizeOfRawData;
  49.    }*/
  50.    TamanoSecciones =  (sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + sección[nth.FileHeader.NumberOfSections-1].SizeOfRawData) - sección[0].PointerToRawData;
  51.  
  52.    fseek(archivo, dh.e_lfanew + 248 + (nth.FileHeader.NumberOfSections * 0x28)+0x28, SEEK_SET);
  53.  
  54.    char * dSecciones = (char*)malloc(TamanoSecciones + (nth.OptionalHeader.SizeOfHeaders - ftell(archivo)));
  55.    int HeaderSize = nth.OptionalHeader.SizeOfHeaders - ftell(archivo);
  56.    char * Header = (char*) malloc(HeaderSize);
  57.    memset(Header,0, HeaderSize);
  58.    memset(dSecciones, 0, TamanoSecciones);
  59.    fread(Header, HeaderSize,1, archivo);
  60.    fread(dSecciones,TamanoSecciones,1,archivo); //leo todos los datos de las secciones.
  61.  
  62.    fclose(archivo); // terminamos de leer
  63.  
  64.    memset(&nSeccion,0, 0x28);
  65.    strncpy((char*)nSeccion.Name,".fary",5); // nombre de la nueva sección: .fary
  66.    nSeccion.VirtualAddress = align(sección[nth.FileHeader.NumberOfSections-1].VirtualAddress + sección[nth.FileHeader.NumberOfSections-1].Misc.VirtualSize, nth.OptionalHeader.SectionAlignment);
  67.    nSeccion.SizeOfRawData = align(0x50, nth.OptionalHeader.FileAlignment);
  68.    nSeccion.PointerToRawData = sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + sección[nth.FileHeader.NumberOfSections-1].SizeOfRawData;//align(0x50,nth.OptionalHeader.FileAlignment);
  69.    nSeccion.Characteristics = 0x60000020;
  70.    nSeccion.Misc.VirtualSize = 0x50;
  71.  
  72.    nth.FileHeader.NumberOfSections += 1; // sumamos la nueva sección
  73.    nth.OptionalHeader.SizeOfImage = align(0x50+nSeccion.VirtualAddress,nth.OptionalHeader.SectionAlignment);
  74.    //nth.OptionalHeader.SizeOfHeaders += 0x28;
  75.  
  76.  
  77.    FILE * nuevo = fopen("Nuevo.exe","wb+");
  78.  
  79.    fwrite(&dh,sizeof(dh),1,nuevo);
  80.    fwrite(stub_dos,dh.e_lfanew-0x40,1,nuevo);
  81.    fwrite(&nth,sizeof(nth),1,nuevo);
  82.    nth.FileHeader.NumberOfSections -= 1;
  83.    fwrite(sección,sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections,1,nuevo);
  84.    fwrite(&nSeccion,sizeof(IMAGE_SECTION_HEADER),1,nuevo);
  85.    fwrite(Header, HeaderSize,1, nuevo);
  86.    fwrite(dSecciones,TamanoSecciones,1,nuevo);
  87.    if (fseek(nuevo,0,SEEK_END) != 0)
  88.    {
  89.        printf("error\n");
  90.    }
  91.    int Size = nSeccion.SizeOfRawData;
  92.    char DatosSeccion[0x1000] = "Hola yo soy la sección de prueba, y ocupo exactamente la cantidad de 0x50 bytes.\0"; //Debe tener la cantidad de bytes del SizeOfRawData
  93.    fwrite(DatosSeccion,nSeccion.SizeOfRawData,1,nuevo);
  94.  
  95.  
  96.    fclose(nuevo);
  97.    system("PAUSE");
  98.    return 0;
  99. }
Add Comment
Please, Sign In to add comment