Busca la funcion que necesitas!

sábado, 2 de abril de 2011

C - Escribir y leer datos en EOF

Con estas funciones puedes leer y escribir en otro archivo como un .txt u otro binario los datos que contiene el EOF (End Of File) de un archivo binario, esto nos sirve para los encriptadores, juntadores (binders o joiners) que pasan datos por el final del archivo esto nos ayuda a encontrar los datos que se le agregaron al exe original y la funcion WriteEOFData nos permite escribir esos datos en un .txt por ejemplo para facilitar su lectura, dejo ambas funciones:



Código:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

/* ReadEOFData
       &               
WriteEOFData C
    Coded By linkgl
Funcion-linkgl.blogspot.com
Indetectables.net/foro
Indetectables Coders :D
*/
    
int VariableGlobal;
char *ReadEOFData(char *ruta)
{
  //-> Estructuras necesarias del PE
  IMAGE_DOS_HEADER idh; 
  IMAGE_NT_HEADERS inh;
  IMAGE_SECTION_HEADER ish;
  //-> Variables necesarias
  FILE *fp;
  DWORD iTam;
  DWORD hTam;
  char *szEof;
  //Abrimos el archivo para leer en binario
  fp=fopen(ruta,"rb");
  if(fp!=NULL)
  {
    //Nos posicionamos hasta el final
    //Y obtenemos el tamaño del archivo
    fseek(fp,0,SEEK_END);
    iTam=ftell(fp);
    rewind(fp);
    //Leemos el PE
    //(IMAGE_DOS_HEADER,NT_HEADERS Y SECTION_HEADER)
    //Y las guardamos en su correspondiente estructura
    fread(&idh,sizeof(IMAGE_DOS_HEADER),1,fp); 
    fseek(fp,idh.e_lfanew,SEEK_SET); 
    fread(&inh,sizeof(IMAGE_NT_HEADERS),1,fp); 
    fseek(fp,idh.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (inh.FileHeader.NumberOfSections - 1),SEEK_SET);
    fread(&ish,sizeof(IMAGE_SECTION_HEADER),1,fp);
    //Obtenemos el tamaño que debe tener el archivo
    //Usando la IMAGE_SECTION_HEADER
    //sumamos el PointerToRawData y SizeOfRawData
    //que es la direccion donde apunta la seccion
    //mas el tamaño de la seccion del PE
    hTam=ish.PointerToRawData + ish.SizeOfRawData;
    //Si es mayor el tamaño total del exe que el del PE
    //entonces existe EOF y procedemos a leerlo
    if(hTam < iTam)
    {
      //Reservamos memoria del tamaño del eof
      //Nos posicionamos para leerlo
      //Y lo leemos y retornamos
      //Tambien almacenamos el tamaño del EOF
      //como variable global
      szEof=(char *)malloc(iTam-hTam);
      fseek(fp,hTam,SEEK_SET);
      fread(szEof,iTam-hTam,1,fp);
      fclose(fp);
      VariableGlobal=iTam-hTam;
      return szEof;
    }
    else
    {
      fclose(fp);
      return NULL;
    }
  }
}

BOOL WriteEOFData(char *ruta,char *szEof)
{
  //Aqui es sencillo
  //Abrimos, nos posicionamos al final
  //Y escribimos el EOF :P
  //->Saludines Linkgl

  FILE *fp;
  fp=fopen(ruta,"ab");
  char buffer[1024];
  if(fp!=NULL)
  {
    fseek(fp,0,SEEK_END);
    fwrite(szEof,VariableGlobal,sizeof(char),fp);
    fclose(fp);
    return TRUE;
  }
  else
    return FALSE;
}

//->USO
int main()
{
    WriteEOFData("c:\\es_eof.exe",ReadEOFData("c:\\EEOF.EXE"));
    return 0;
}

No hay comentarios:

Publicar un comentario