• 大小: 580KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-07-19
  • 语言: 其他
  • 标签: elf格式  elf分析  

资源简介

《ELF文件格式分析.pdf》文档,非常不错的elf格式参考文档,参考elf解析过程,能很快掌握elf文件格式

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include “elf.h“

#define INVALID                 (-1)

#define SECTION_NAME_SHSTRTAB   “.shstrtab“

#define SECTION_NAME_SYMTAB     “.symtab“
#define SECTION_NAME_STRTAB     “.strtab“

#define SECTION_NAME_DYNSYM     “.dynsym“
#define SECTION_NAME_DYNSTR     “.dynstr“

/**
* 字串和枚举转换结构体
*/
typedef struct
{
    int enum_value;
    char * enum_str;
} ENUM_S;

char * enum2str(ENUM_S * specs_enum int enum_value)
{
    int i = 0;

    if (NULL == specs_enum)
    {
        printf(“param error! enum:%#x\n“ (int)specs_enum);
        return NULL;
    }

    for (i = 0; specs_enum->enum_str != NULL; specs_enum++ i++)
    {
        if (specs_enum->enum_value == enum_value)
        {
            return specs_enum->enum_str;
        }
    }
    printf(“enum_value not match:%d \n“ enum_value);

    return NULL;
}

int str2enum(ENUM_S * specs_enum const char * enum_str)
{
    int i = 0;

    if ((NULL == specs_enum) || (NULL == enum_str))
    {
        printf(“param error! specs_enum:%#x enum_str:%#x\n“ (int)specs_enum (int)enum_str);
        return -1;
    }

    for (i = 0; specs_enum->enum_str != NULL; specs_enum++ i++)
    {
        if (0 == strcmp(specs_enum->enum_str enum_str))
        {
            return (int)specs_enum->enum_value;
        }
    }
    printf(“enum_str not match:%s \n“ enum_str);

    return -1;
}


char * readFile(char * file int * size)
{
    int fsize = 0;
    char * mem = NULL;
    FILE * fp = NULL;

    fp = fopen(file “rb“);
    if (fp == NULL)
    {
        perror(“fopen error!“);
        goto RELEASE;
    }

    fseek(fp 0 SEEK_END);
    fsize = ftell(fp);
    mem = malloc(fsize);
    if (mem == NULL)
    {
        perror(“malloc error!“);
        goto RELEASE;
    }
    printf(“readFile size:%d\n“ size);

    fseek(fp 0 SEEK_SET);
    fread(mem fsize 1 fp);
    *size = fsize;

RELEASE:
    fclose(fp);

    return mem;
}

int parseHeader(Elf32_Ehdr * header)
{
    int i = 0;

    /* magic num */
    ENUM_S e_class[] = { {ELFCLASS32 “ELF32“} {ELFCLASS64 “ELF64“} {INVALID NULL}};
    ENUM_S e_data[] = { {ELFDATA2LSB “little endian“} {ELFDATA2MSB “big endian“} {INVALID NULL}};
    ENUM_S e_osabi[] = { {ELFOSABI_NONE “UNIX - System V“} {ELFOSABI_ARM_AEABI “ARM EABI“} {ELFOSABI_ARM “ARM“} {INVALID NULL}};

    /* elf header */
    ENUM_S e_type[] =
    {
        {ET_REL “Relocatable file“}
        {ET_EXEC “Executable file“}
        {ET_DYN “Shared object file“}
        {ET_CORE “Core file“}
        {INVALID NULL}
    };
    ENUM_S e_machine[] = {{EM_386 “Intel 80386“} {EM_ARM “ARM“} {INVALID NULL}};
    unsigned char * e_ident = header->e_ident;

    if ((e_ident[EI_MAG0] != ELFMAG0) || (e_ident[EI_MAG1] != ELFMAG1) ||
            (e_ident[EI_MAG2] != ELFMAG2) || (e_ident[EI_MAG2] != ELFMAG2))
    {
 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     873434  2017-04-25 21:12  ELF文件格式分析.pdf

     文件      15705  2018-03-22 17:18  readelf.c

----------- ---------  ---------- -----  ----

               889139                    2


评论

共有 条评论

相关资源