2016-03-27 37 views
0

Bu kılavuza uymaya çalışıyorum: , elf files.Elf dosyalarını okumak için doğru yol C

: dosya yükleme

bool elf_check_file(Elf32_Ehdr *hdr) { 
    if(!hdr) return false; 
    if(hdr->e_ident[EI_MAG0] != ELFMAG0) { 
     ERROR("ELF Header EI_MAG0 incorrect.\n"); 
     return false; 
    } 
    if(hdr->e_ident[EI_MAG1] != ELFMAG1) { 
     ERROR("ELF Header EI_MAG1 incorrect.\n"); 
     return false; 
    } 
    if(hdr->e_ident[EI_MAG2] != ELFMAG2) { 
     ERROR("ELF Header EI_MAG2 incorrect.\n"); 
     return false; 
    } 
    if(hdr->e_ident[EI_MAG3] != ELFMAG3) { 
     ERROR("ELF Header EI_MAG3 incorrect.\n"); 
     return false; 
    } 
    return true; 
} 

: Ancak

, fonksiyon bool elf_check_fil devletler göz önüne alındığında dosya (o olduğunu gösteren readelf rağmen) doğru bir elf

Kod değil

FILE* elf = fopen(argv[1], "r"); Elf32_Ehdr *hdr = (Elf32_Ehdr *) elf; elf_check_file(hdr); 

gdb Kullanarak hdr->e_ident[EI_MAG0] ... hdr->e_ident[EI_MAG3] aslında doğru sihirli numaraları içermediğini umuyor. Niye ya?

+5

'elf_check_file' FILEHANDLE değil, elf dosyasının içeriğini bekler:

Doğru yolu böyle bir şey olması gerekir. Elf32_Ehdr * 'e' '' '' '' '' '' '' '' '' '' '' '' '' '' '' a çeviremezsiniz, içeriğini okumak zorundasınız. – aragaer

+5

Ayrıca, dosyayı bir * metin * dosyası olarak açmanızın da bir sorunu vardır. –

+3

'rb'ye ihtiyacınız var. Elfler ikilidir. Troller ve vampirler, metin olarak açabilirsiniz, elf değil. –

cevap

1

Birden çok yorum tarafından belirtildiği üzere elf_check_file'u doğru kullanmıyorsunuz.

FILE *fp = fopen(argv[1], "rb"); 
if (fp == NULL) { 
    fprintf(stderr, "Unable to open '%s': %s\n", argv[1], strerror(errno)); 
    return; 
} 

Elf32_Ehdr ehdr; 
if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) { 
    fprintf(stderr, "fread: %s\n", strerror(errno)); 
    fclose(fp); 
    return; 
} 

if (!elf_check_file(&ehdr)) { 
    fprintf(stderr, "'%s' is not an ELF file\n", argv[1]); 
    fclose(fp); 
    return; 
} 
/* Parse the rest of the ELF file here. */ 

/* Don't forget to close the file. */ 
fclose(fp); 
return; 
İlgili konular