Páginas: [1]
|
 |
|
Autor
|
Tema: Obtener el tamaño en disco de un fichero (Leído 271 veces)
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.529
Nihil est in intelectu quod prius not fuerit insen
|
¿Alguno sabe cómo obtener el tamaño en disco de un PE a partir de sus cabeceras?
En la sección IMAGE_OPTIONAL_HEADER hay un campo "SizeOfImage", pero devuelve el tamaño del fichero en la memoria, y necesito saber el tamaño en disco.
|
|
|
|
|
En línea
|
|
|
|
®®
Colaborador
Desconectado
Mensajes: 5.259
|
sumale el campo rawsize de cada sección y este resultado lo redondeas por el sectionalignment y ahi tienes el tamaño del fichero en disco. te pongo un ejemplo en vb para que lo entiendas mejor. a = &H6D600 b = &H1000 c = a / b c = c + 1 c = c * b Me.Caption = "tamaño: " & c
"a" es la suma de el campo raw size de cada sección y "b" es el la alineacion de las secciones.
|
|
|
|
« Última modificación: 02 Febrero 2008, 16:58 por ®® »
|
En línea
|
|
|
|
|
E0N
|
O sumas el raw offset y el raw size de la ultima sección 
|
|
|
|
|
En línea
|
|
|
|
®®
Colaborador
Desconectado
Mensajes: 5.259
|
si, pero pruebalo y veras como no da el mismo resultado que donde pone "tamaño en disco" por el tema de redondeos.
|
|
|
|
|
En línea
|
|
|
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.529
Nihil est in intelectu quod prius not fuerit insen
|
Estoy haciendo pruebas con la calculadora, que pesa (115,200 B), tengo que calcular el tamaño (en las propiedades del archivo, está tamaño y tamaño en disco, necesito hallar tamaño, perdón por el error), y hago lo que dices ®®, y lo que obtengo es: 114,688 Me faltan bytes Este es el código de la función: typedef struct CABECERAS { IMAGE_DOS_HEADER cDOS; IMAGE_NT_HEADERS cNT; IMAGE_SECTION_HEADER *cSection; unsigned int Secciones; }CABECERAS;
//....
unsigned long SizePE(CABECERAS Headers) { unsigned long nSize,a,b,c; unsigned int i;
nSize=0;
a=0; for(i=0;i<Headers.Secciones;i++) a+=Headers.cSection[i].SizeOfRawData;
b=Headers.cNT.OptionalHeader.SectionAlignment; c=a/b; c++; c*=b;
nSize+=c;
return nSize; } A unas malas me vale, porque se queda por debajo del tamaño del fichero, pero claro....
|
|
|
|
|
En línea
|
|
|
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.529
Nihil est in intelectu quod prius not fuerit insen
|
Y aquí el completo: #include <stdio.h> #include <stdlib.h> #include <windows.h>
#define ARCHIVO "calc.exe"
typedef struct CABECERAS { IMAGE_DOS_HEADER cDOS; IMAGE_NT_HEADERS cNT; IMAGE_SECTION_HEADER *cSection; unsigned int Secciones; }CABECERAS;
BOOL EsCabeceraMSDOS(IMAGE_DOS_HEADER Cabecera) { BOOL ret=FALSE;
if(Cabecera.e_magic==IMAGE_DOS_SIGNATURE) ret=TRUE;
return ret; }
BOOL EsCabeceraNT(IMAGE_NT_HEADERS Cabecera) { BOOL ret=FALSE;
if(Cabecera.Signature==IMAGE_NT_SIGNATURE) ret=TRUE;
return ret; }
//detecta si un fichero es ejecutable o no BOOL EsPE(char const *Ruta) { BOOL ret; IMAGE_DOS_HEADER Cabecera1; IMAGE_NT_HEADERS Cabecera2; FILE *f;
ret=FALSE; f=fopen(Ruta,"rb"); if(f!=NULL) { fread(&Cabecera1,sizeof(IMAGE_DOS_HEADER),1,f); if(EsCabeceraMSDOS(Cabecera1)) { fseek(f,Cabecera1.e_lfanew,SEEK_SET); fread(&Cabecera2,sizeof(IMAGE_NT_HEADERS),1,f); if(EsCabeceraNT(Cabecera2)) ret=TRUE; } fclose(f); } return ret; }
unsigned long SizePE(CABECERAS Headers) { unsigned long nSize,a,b,c; unsigned int i;
nSize=0;
a=0; for(i=0;i<Headers.Secciones;i++) a+=Headers.cSection[i].SizeOfRawData;
b=Headers.cNT.OptionalHeader.SectionAlignment; c=a/b; c++; c*=b;
nSize+=c;
return nSize; }
BOOL ExtraerCabeceras(const char*Ruta,CABECERAS *Headers) { FILE *f; BOOL ret; unsigned int i;
ret=FALSE; f=fopen(Ruta,"rb"); if(f!=NULL) { fread(&Headers->cDOS,sizeof(IMAGE_DOS_HEADER),1,f); if(EsCabeceraMSDOS(Headers->cDOS)==TRUE) { fseek(f,Headers->cDOS.e_lfanew,SEEK_SET); fread(&Headers->cNT,sizeof(IMAGE_NT_HEADERS),1,f); if(EsCabeceraNT(Headers->cNT)==TRUE) { //cojemos las secciones Headers->Secciones=Headers->cNT.FileHeader.NumberOfSections; Headers->cSection=(IMAGE_SECTION_HEADER*)malloc(Headers->Secciones*sizeof(IMAGE_SECTION_HEADER)); memset(Headers->cSection,0,Headers->Secciones*sizeof(IMAGE_SECTION_HEADER));
for(i=0;i<Headers->Secciones;i++) fread(&Headers->cSection[i],sizeof(IMAGE_SECTION_HEADER),1,f);
ret=TRUE; } } fclose(f); }
return ret; }
int main(int argc, char *argv[]) { CABECERAS Headers;
memset(&Headers,0,sizeof(Headers)); if(EsPE(ARCHIVO)==TRUE) if(ExtraerCabeceras(ARCHIVO,&Headers)==TRUE) { printf("%d",SizePE(Headers)); }else{ puts("ERROR AL LEER"); } else puts("NO ES PE");
return 0; }
|
|
|
|
|
En línea
|
|
|
|
Ferсhu
Desconectado
Mensajes: 1.221
Menos palabras y Mas codigos.
|
q raro faltan exactamente 512 bytes, no faltara un +1 x ahi jaja
y nose por q "nSize" - "a" tmb da 512 casualidad??
obviamente q no tengo idea de lo q digo eh jaja solo doy ideas.
|
|
|
|
« Última modificación: 02 Febrero 2008, 18:44 por <~>FeRcHu<~> »
|
En línea
|
|
|
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.529
Nihil est in intelectu quod prius not fuerit insen
|
|
|
|
|
|
En línea
|
|
|
|
Ferсhu
Desconectado
Mensajes: 1.221
Menos palabras y Mas codigos.
|
lo probe con varios archivos q trae windows y con esos si funciona pero archivos creados con dev-cpp nop. unsigned long SizePE(CABECERAS Headers) { unsigned long nSize,a,b,c; unsigned int i;
nSize=0;
a=0; for(i=0;i<Headers.Secciones;i++) a+=Headers.cSection[i].SizeOfRawData;
nSize=a+Headers.cNT.OptionalHeader.SizeOfHeaders;
return nSize; } jaja "yupi" :p.
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1]
|
|
|
|