如何读取C中的ELF头?

时间:2016-01-23 06:29:48

标签: c elf

如何打开文件并将信息复制到另一个文件中。我只需要复制幻数和版本。 void read_header(FILE * file,File * file2);

4 个答案:

答案 0 :(得分:2)

根据平台的不同,可能会提供已定义此结构的头文件。例如,如果您正在运行linux,则可以尝试包含elf.h

#include <elf.h>
#include <stdio.h>

void read_elf_header(const char* elfFile) {
  // switch to Elf32_Ehdr for x86 architecture.
  Elf64_Ehdr header;

  FILE* file = fopen(elfFile, "rb");
  if(file) {
    // read the header
    fread(&header, 1, sizeof(header), file);

    // check so its really an elf file
    if (memcmp(header.e_ident, ELFMAG, SELFMAG) == 0) {
       // this is a valid elf file
    }

    // finally close the file
    fclose(file);
  }
}

如果您的系统尚未包含elf.h,则可以检查elf标头的结构here. 然后你可以创建一个结构来保存你的数据,并简单地读取它:

typedef struct {
  uint8     e_ident[16];         /* Magic number and other info */
  uint16    e_type;              /* Object file type */
  uint16    e_machine;           /* Architecture */
  uint32    e_version;           /* Object file version */
  uint64    e_entry;             /* Entry point virtual address */
  uint64    e_phoff;             /* Program header table file offset */
  uint64    e_shoff;             /* Section header table file offset */
  uint32    e_flags;             /* Processor-specific flags */
  uint16    e_ehsize;            /* ELF header size in bytes */
  uint16    e_phentsize;         /* Program header table entry size */
  uint16    e_phnum;             /* Program header table entry count */
  uint16    e_shentsize;         /* Section header table entry size */
  uint16    e_shnum;             /* Section header table entry count */
  uint16    e_shstrndx;          /* Section header string table index */
} Elf64Hdr;

void read_elf_header(const char* elfFile, const char* outputFile) {
  struct Elf64Hdr header;

  FILE* file = fopen(elfFile, "rb");
  if(file) {
    // read the header
    fread(&header, 1, sizeof(header), file);

    // check so its really an elf file
    if(header.e_type == 0x7f &&
       header.e_ident[1] == 'E' &&
       header.e_ident[2] == 'L' &&
       header.e_ident[3] == 'F') {

       // write the header to the output file
       FILE* fout = fopen(outputFile, "wb");
       if(fout) {
         fwrite(&header, 1, sizeof(header), fout);
         fclose(fout);
       }
     }

    // finally close the file
    fclose(file);
  }
}

答案 1 :(得分:2)

  1. 包括elf.h
  2. Open和Stat elf文件
  3. 地图文件
  4. Typecast地图地址到Elf64_Ehdr并阅读

答案 2 :(得分:0)

使用fopen()

打开您的精灵档案
FILE *fp  = fopen("youe_elf.bin","rb");

现在使用fread()从文件中读取数据块。并使用format of ELF file进行映射并获取标头字节,然后使用fopen()

再次将其写入新文件

答案 3 :(得分:0)

如果您想要裸机解析,请遵循Cyclone的命题,或者,例如看看其他人这样做,比如http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/plugin/qelfparser_p.cpp中的Qt。

然而,有一些库具有更高级别的API。以https://wiki.freebsd.org/LibElf为出发点。