Comenté el código todo lo que pude,espero les sirva de ayuda.


Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc, char *argv[])
{
///////////////////////////////////////////////////////////////////////////////////////////
// pEOF 1.0 //
// Agradecimientos a: //
// *linkgl - Por explicarme como leer las secciones y echarme una mano con errores. //
// *ps1c0s1s - Por mostrarme el error. //
// *osnaraus - Por tomar el tiempo leyendo el codigo y ayudarme //
///////////////////////////////////////////////////////////////////////////////////////////
//Estructuras de la PE
IMAGE_DOS_HEADER BloqueA;
IMAGE_NT_HEADERS BloqueB;
IMAGE_SECTION_HEADER BloqueC;
//End
char Entrada[MAX_PATH];
char Salida[MAX_PATH];
printf("Introduca el Nombre del Archivo con EOF \n");
scanf("%s",&Entrada);
printf("Introduca el Nombre del Archivo a Parchear \n");
scanf("%s",&Salida);
FILE * pFile = fopen(Entrada,"rb");
if(pFile != NULL){
fseek(pFile,0,SEEK_END); //Nos posicionarmos al final
DWORD pSize = ftell(pFile); //Obtenemos el peso
rewind(pFile); //Posicionamos el Indicador en 0
//Leemos el BloqueA correspondiente a la cabecera PE
fread(&BloqueA,sizeof(IMAGE_DOS_HEADER),1,pFile);
//Nos posicionamos en esta
fseek(pFile,BloqueA.e_lfanew,SEEK_SET);
//Leemos el BloqueB correspondiente a la TABLA de secciones
fread(&BloqueB,sizeof(IMAGE_NT_HEADERS),1,pFile);
fseek(pFile,BloqueA.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (BloqueB.FileHeader.NumberOfSections - 1),SEEK_SET);
//Leemos el BloqueC correspondiente a los Datos Finales
fread(&BloqueC,sizeof(IMAGE_SECTION_HEADER),1,pFile);
//Obtenemos el Final de la Ultima Seccion de la PE
DWORD pEOF = BloqueC.PointerToRawData + BloqueC.SizeOfRawData;
//Si el peso dela Ultima seccion es menor que el Peso Total,existe EOF
if(pEOF < pSize){
MessageBox(NULL,"EOF ENCONTRADO","INFO",MB_OK);
//Nos posicionamos en el final de la ultima secion
fseek(pFile,pEOF,SEEK_SET);
//Creamos un Buffer para almacenar el EOF que vamos a leer
char * pBuffer = (char*)malloc(pSize - pEOF+20);
//Leemos y almacenamos los datos comprendidos entre el
//Peso Total y el final de la seccion(EOF)
fread(pBuffer,pSize - pEOF,sizeof(char),pFile);
FILE * pSaved = fopen(Salida,"ab");
//Escribimos en el final del nuevo archivo el EOF
// Tamaño EOF ,
fwrite(pBuffer,pSize - pEOF,sizeof(char),pSaved);
fclose(pSaved);
//Liberamos el espacio reservado en memoria
free(pBuffer);
}
}
fclose(pFile);
getchar();
return 0;
}