Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- DWORD align(DWORD number, DWORD alignment)
- {
- if(number % alignment == 0)
- return number;
- else
- return (number / alignment) * alignment + alignment;
- }
- int main()
- {
- IMAGE_DOS_HEADER dh;
- IMAGE_NT_HEADERS nth;
- IMAGE_SECTION_HEADER * sección;
- IMAGE_SECTION_HEADER nSeccion;
- // char * stub_dos -> Datos del STUB_DOS
- // char * dSecciones -> Datos de las secciones
- long TamanoSecciones = 0;
- int i;
- FILE * archivo = fopen("c:\\Mad.exe","r+b");
- if (archivo == NULL)
- {
- printf("Error al leer el archivo\n");
- getchar();
- return 1;
- }
- fread(&dh,sizeof(dh),1,archivo); // Rellenamos IMAGE_DOS_HEADER
- char * stub_dos = (char*)malloc(dh.e_lfanew-0x40);
- fread(stub_dos,1,dh.e_lfanew-0x40,archivo); // Leemos el Stub DOS
- fread(&nth,sizeof(nth),1,archivo); // leemos nt headers
- sección = (IMAGE_SECTION_HEADER*)malloc(sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections);
- fread(sección,sizeof(IMAGE_SECTION_HEADER),nth.FileHeader.NumberOfSections,archivo);
- /*for (i=0;i<=nth.FileHeader.NumberOfSections-1;i++)
- {
- printf("%i\n",sección[i].SizeOfRawData);
- TamanoSecciones += sección[i].SizeOfRawData;
- }*/
- TamanoSecciones = (sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + sección[nth.FileHeader.NumberOfSections-1].SizeOfRawData) - sección[0].PointerToRawData;
- fseek(archivo, dh.e_lfanew + 248 + (nth.FileHeader.NumberOfSections * 0x28)+0x28, SEEK_SET);
- char * dSecciones = (char*)malloc(TamanoSecciones + (nth.OptionalHeader.SizeOfHeaders - ftell(archivo)));
- int HeaderSize = nth.OptionalHeader.SizeOfHeaders - ftell(archivo);
- char * Header = (char*) malloc(HeaderSize);
- memset(Header,0, HeaderSize);
- memset(dSecciones, 0, TamanoSecciones);
- fread(Header, HeaderSize,1, archivo);
- fread(dSecciones,TamanoSecciones,1,archivo); //leo todos los datos de las secciones.
- fclose(archivo); // terminamos de leer
- memset(&nSeccion,0, 0x28);
- strncpy((char*)nSeccion.Name,".fary",5); // nombre de la nueva sección: .fary
- nSeccion.VirtualAddress = align(sección[nth.FileHeader.NumberOfSections-1].VirtualAddress + sección[nth.FileHeader.NumberOfSections-1].Misc.VirtualSize, nth.OptionalHeader.SectionAlignment);
- nSeccion.SizeOfRawData = align(0x50, nth.OptionalHeader.FileAlignment);
- nSeccion.PointerToRawData = sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + sección[nth.FileHeader.NumberOfSections-1].SizeOfRawData;//align(0x50,nth.OptionalHeader.FileAlignment);
- nSeccion.Characteristics = 0x60000020;
- nSeccion.Misc.VirtualSize = 0x50;
- nth.FileHeader.NumberOfSections += 1; // sumamos la nueva sección
- nth.OptionalHeader.SizeOfImage = align(0x50+nSeccion.VirtualAddress,nth.OptionalHeader.SectionAlignment);
- //nth.OptionalHeader.SizeOfHeaders += 0x28;
- FILE * nuevo = fopen("Nuevo.exe","wb+");
- fwrite(&dh,sizeof(dh),1,nuevo);
- fwrite(stub_dos,dh.e_lfanew-0x40,1,nuevo);
- fwrite(&nth,sizeof(nth),1,nuevo);
- nth.FileHeader.NumberOfSections -= 1;
- fwrite(sección,sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections,1,nuevo);
- fwrite(&nSeccion,sizeof(IMAGE_SECTION_HEADER),1,nuevo);
- fwrite(Header, HeaderSize,1, nuevo);
- fwrite(dSecciones,TamanoSecciones,1,nuevo);
- if (fseek(nuevo,0,SEEK_END) != 0)
- {
- printf("error\n");
- }
- int Size = nSeccion.SizeOfRawData;
- 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
- fwrite(DatosSeccion,nSeccion.SizeOfRawData,1,nuevo);
- fclose(nuevo);
- system("PAUSE");
- return 0;
- }
Add Comment
Please, Sign In to add comment