elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
07 Octubre 2008, 23:02  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General (Moderadores: Hendrix, E0N)
| | |-+  Obtener el tamaño en disco de un fichero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Obtener el tamaño en disco de un fichero  (Leído 271 veces)
sch3m4
Colaborador

Desconectado Desconectado

Mensajes: 1.529

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil
Obtener el tamaño en disco de un fichero
« en: 02 Febrero 2008, 16:15 »

¿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

Proyecto Open Source (GNU) - PExtractor v0.19b

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(...)"
®®
Colaborador

Desconectado Desconectado

Mensajes: 5.259


Ver Perfil
Re: Obtener el tamaño en disco de un fichero
« Respuesta #1 en: 02 Febrero 2008, 16:38 »

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.

Código:
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
Lab &
Moderador
*****
Desconectado Desconectado

Mensajes: 2.671



Ver Perfil WWW
Re: Obtener el tamaño en disco de un fichero
« Respuesta #2 en: 02 Febrero 2008, 17:10 »

O sumas el raw offset y el raw size de la ultima sección :P
En línea
®®
Colaborador

Desconectado Desconectado

Mensajes: 5.259


Ver Perfil
Re: Obtener el tamaño en disco de un fichero
« Respuesta #3 en: 02 Febrero 2008, 17:13 »

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 Desconectado

Mensajes: 1.529

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil
Re: Obtener el tamaño en disco de un fichero
« Respuesta #4 en: 02 Febrero 2008, 18:19 »

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:

Citar
114,688

Me faltan bytes

Este es el código de la función:

Código:
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

Proyecto Open Source (GNU) - PExtractor v0.19b

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(...)"
sch3m4
Colaborador

Desconectado Desconectado

Mensajes: 1.529

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil
Re: Obtener el tamaño en disco de un fichero
« Respuesta #5 en: 02 Febrero 2008, 18:37 »

Y aquí el completo:

Código:
#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

Proyecto Open Source (GNU) - PExtractor v0.19b

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(...)"
Ferсhu

Desconectado Desconectado

Mensajes: 1.221

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: Obtener el tamaño en disco de un fichero
« Respuesta #6 en: 02 Febrero 2008, 18:37 »

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 Desconectado

Mensajes: 1.529

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil
Re: Obtener el tamaño en disco de un fichero
« Respuesta #7 en: 02 Febrero 2008, 18:58 »

Offtopic: Lo que decía, el mundo de yupi https://foro.elhacker.net/index.php/topic,193361.msg926441.html#msg926441


Si pruebo con  otros ejecutables el tamaño en disco, me lo da correcto, pero con la calculadora no, por qué?
En línea

Proyecto Open Source (GNU) - PExtractor v0.19b

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(...)"
Ferсhu

Desconectado Desconectado

Mensajes: 1.221

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: Obtener el tamaño en disco de un fichero
« Respuesta #8 en: 02 Febrero 2008, 21:20 »

lo probe con varios archivos q trae windows y con esos si funciona pero archivos creados con dev-cpp nop.

Código:
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] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC