.
Viendo el codigo de The Swash re-arme el codigo de una forma mas limpia y evitando errores a toda costa, inclusive ante los archivos incompletos mas que nada, o que los imiten de alguna manera, pero no al 100%.

Código: Seleccionar todo


unsigned long long GetPeSize(const char *fPath)
/** Retorna el Byte donde termina TODOS los bytes de un Ejecutable en formato PE **/
{ /* By BlackZerox ( http://Infrangelux.sytes.net/ ) */
    IMAGE_DOS_HEADER        v_idh;
    IMAGE_NT_HEADERS        v_inh;
    IMAGE_SECTION_HEADER    v_ish;
    FILE                    *v_pFile;
    unsigned long long      v_ullTemp = 0;

    if ( (v_pFile = fopen(fPath,"r")) != NULL)
    {
        fseek(v_pFile, 0, SEEK_SET);
        if ( fread(&v_idh, 1, sizeof(IMAGE_DOS_HEADER) , v_pFile) == sizeof(IMAGE_DOS_HEADER ))/* ¿leimos lo desedo? [se evitan errores estupidos]*/
            if (v_idh.e_magic == IMAGE_DOS_SIGNATURE)/* ¿Es PEFormat? */
                if ( fseek(v_pFile, v_idh.e_lfanew, SEEK_SET) == 0 )/*  [se evitan errores estupidos] */
                    if ( fread(&v_inh, 1 , sizeof(IMAGE_NT_HEADERS), v_pFile) == sizeof(IMAGE_NT_HEADERS) )/* ¿leimos lo desedo?  [se evitan errores estupidos] */
                        if (v_inh.Signature == IMAGE_NT_SIGNATURE)/* ¿Es PEFormat? */
                            if ( v_inh.FileHeader.NumberOfSections > 0 )/*  [se evitan errores estupidos] */
                                v_ullTemp = v_idh.e_lfanew + sizeof(IMAGE_NT_HEADERS) + ((v_inh.FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER));
                                if ( fseek(v_pFile, v_ullTemp , SEEK_SET) == 0 )/*  [se evitan errores estupidos] */
                                    if ( sizeof(IMAGE_SECTION_HEADER) == fread(&v_ish, 1 , sizeof(IMAGE_SECTION_HEADER) , v_pFile))/* ¿leimos lo desedo?  [se evitan errores estupidos] */
                                        v_ullTemp = v_ish.SizeOfRawData + v_ish.PointerToRawData;
        fclose(v_pFile);
    }
    return v_ullTemp;
}

O para quien no entienda aqui esta otro ( Es como a mi me gusta mas, aun que el de arriba esta mas limpio )

Código: Seleccionar todo


unsigned long long GetPeSize(const char *fPath)
/** Retorna el Byte donde termina TODOS los bytes de un Ejecutable en formato PE **/
{ /* By BlackZerox ( http://Infrangelux.sytes.net/ ) */
    IMAGE_DOS_HEADER        v_idh;
    IMAGE_NT_HEADERS        v_inh;
    IMAGE_SECTION_HEADER    v_ish;
    FILE                    *v_pFile;
    unsigned long long      v_ullTemp = 0;

    if ( (v_pFile = fopen(fPath,"r")) != NULL)
    {
        fseek(v_pFile, 0, SEEK_SET);
        if ( fread(&v_idh, 1, sizeof(IMAGE_DOS_HEADER) , v_pFile) == sizeof(IMAGE_DOS_HEADER ))
        {/* ¿leimos lo desedo? [se evitan errores estupidos]*/
            if (v_idh.e_magic == IMAGE_DOS_SIGNATURE)
            {/* ¿Es PEFormat? */
                if ( fseek(v_pFile, v_idh.e_lfanew, SEEK_SET) == 0 )
                {/*  [se evitan errores estupidos] */
                    if ( fread(&v_inh, 1 , sizeof(IMAGE_NT_HEADERS), v_pFile) == sizeof(IMAGE_NT_HEADERS) )
                    {/* ¿leimos lo desedo?  [se evitan errores estupidos] */
                        if (v_inh.Signature == IMAGE_NT_SIGNATURE)
                        {/* ¿Es PEFormat? */
                            if ( v_inh.FileHeader.NumberOfSections > 0 )
                            {/*  [se evitan errores estupidos] */
                                v_ullTemp = v_idh.e_lfanew + sizeof(IMAGE_NT_HEADERS) + ((v_inh.FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER));
                                if ( fseek(v_pFile, v_ullTemp , SEEK_SET) == 0 )
                                {/*  [se evitan errores estupidos] */
                                    if ( sizeof(IMAGE_SECTION_HEADER) == fread(&v_ish, 1 , sizeof(IMAGE_SECTION_HEADER) , v_pFile))
                                    {/* ¿leimos lo desedo?  [se evitan errores estupidos] */
                                        v_ullTemp = v_ish.SizeOfRawData + v_ish.PointerToRawData;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        fclose(v_pFile);
    }
    return v_ullTemp;
}

Temibles lunas!¡.
.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Responder

Volver a “Fuentes”