1. 程式人生 > >檢查開啟的檔案是不是ELF格式的檔案,提取“特別”的節中的資訊

檢查開啟的檔案是不是ELF格式的檔案,提取“特別”的節中的資訊

//檢查開啟的檔案是不是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;
}