2016-03-27 14 views
0

Ich versuche, dieser Anleitung zu folgen: http://wiki.osdev.org/ELF_Tutorial zu verarbeiten elf files.Korrekter Weg zum Lesen von Elf-Dateien in C

jedoch Funktion bool elf_check_fil Staaten, dass bestimmte Datei ist keine korrekte Elf (trotz readelf zeigt, dass es ist)

Code:

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; 
} 

Laden der Datei:

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

Mit gdb I ch Die hdr->e_ident[EI_MAG0] ... hdr->e_ident[EI_MAG3] enthielten tatsächlich keine korrekten magischen Zahlen. Warum?

+5

'elf_check_file' erwartet Inhalt der Elf-Datei, nicht Dateikennung:

korrekte Art und Weise sollte in etwa so sein. Sie können nicht einfach 'FILE *' in 'Elf32_Ehdr *' umwandeln, Sie müssen den Inhalt lesen. – aragaer

+5

Es gibt auch ein Problem, dass Sie die Datei als * Text * -Datei öffnen. –

+3

Sie brauchen 'rb'. Elfen sind Doppelgänger. Trolle und Vampire können Sie als Text öffnen, aber nicht als Elfen. –

Antwort

1

Wie von mehreren Kommentaren angegeben, verwenden Sie elf_check_file nicht korrekt.

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; 
Verwandte Themen