pEOF Reader/Writer
Publicado: 07 Ene 2011, 15:30
Me vi con ganas de programar esto,aunque sin los usuarios mencionados en el agradecimiento nunca habría finalizado el proyecto.
Comenté el código todo lo que pude,espero les sirva de ayuda.


Quizás les sea util para programar un Encriptador por EOF sin delimitador....
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;
}