检查打开的文件是不是ELF格式的文件,提取“特别”的节中的信息

来源:互联网 发布:布丁软件官网 编辑:程序博客网 时间:2024/05/09 09:51
//检查打开的文件是不是ELF格式的文件
//检验ELF头
//获得节头表的地址
//遍历节头表,依次查看一个节的属性,从节头字符串表中找到其名称,如果名称和“特别”的section名匹配,则找到此节的地址
//提取“特别”的节中的信息

//显示上面提取的信息

#include<stdio.h>
#include<elf.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
    FILE *fp;
    Elf64_Ehdr *ehdr;
        Elf64_Shdr *shdr;
        char buffer[1024]={0};
    int i=0,j=0;
        long length;
    fp=fopen(argv[1],"rb");
    if(fp==NULL)
    {
        printf("can not open %s\n",argv[1]);
        return -1;
    }
    ehdr = (Elf64_Ehdr *)malloc(sizeof(Elf64_Ehdr));
        shdr = (Elf64_Shdr *)malloc(sizeof(Elf64_Shdr));
        
    fread(ehdr,sizeof(Elf64_Ehdr),1,fp);
    if(ehdr->e_ident[EI_MAG0] == ELFMAG0 ||
               ehdr->e_ident[EI_MAG1] == ELFMAG1 ||
                   ehdr->e_ident[EI_MAG2] == ELFMAG2 ||
                  ehdr->e_ident[EI_MAG3] == ELFMAG3)
    {
        printf("此文件是ELF文件!\n");
                printf("节头表地址是 %p\n",ehdr+ehdr->e_shoff);
                //获取节头字符串表地址
                fseek(fp,ehdr->e_shoff,0);
                fread(shdr,sizeof(Elf64_Shdr),ehdr->e_shnum,fp);
                length = shdr[ehdr->e_shstrndx].sh_offset;
                printf("节头字符串表的地址 %p\n",length);
                //获取字符串表各节名称
                fseek(fp,length,0);
                fread(buffer,1,sizeof(buffer),fp);
                //匹配"infosection"
                for(i=0;i<=(int)ehdr->e_shnum;i++)
                {
                        char *name=&buffer[shdr[i].sh_name];
            if(!strcmp(name,".infosection"))
                        {
                            printf("匹配到的section name is %s\n", name);
                char temp[shdr[i].sh_size];    
                            fseek(fp, shdr[i].sh_offset, 0);
                fread(temp, 1, shdr[i].sh_size, fp);
                printf("匹配到的节的 message is : %s", temp);
                        }
                }
    }
        else
        {
                printf("此文件不是ELF文件\n");
        }
    
        fclose(fp);
    return 0;
}

0 0
原创粉丝点击