检查打开的文件是不是ELF格式的文件,如果是就输出节头表的文件偏移

来源:互联网 发布:微商代理授权系统源码 编辑:程序博客网 时间:2024/05/18 01:17
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include "elf.h"
#define FALSE 0
#define TURE 1
#define MAX_SIZE 52
#define Elf_Ehdr  Elf64_Ehdr
int OpenElf(char *filename)
{
    int fd;
    fd = open(filename, O_RDONLY);
    if(fd == -1){
          printf("Open %s Error!\n", filename);
          return FALSE;
    }
    return fd;
}
//读取Elf头部表函数 :int ReadElf(int fd);

int ReadElf(int fd)
{
    char str[MAX_SIZE];
    int num;
    Elf_Ehdr ehdr64;
    memset(str, 0, MAX_SIZE);
    if((num = read(fd, str, 52)) != 52){
            perror("File NO ELF!\n");
            return FALSE;
    }
    if((str[0] == 0x7f) && (str[1] == 'E') && (str[2] == 'L') && (str[3] == 'F')){
          printf("This is ELF file.\n");
          printf("文件类别: ");
          switch(str[4]){
                        case 0:
                            printf("非法目标文件\n");
                            break;
                        case 1:
                            printf("32位目标文件\n");
                            break;
                        case 2:
                            printf("64位目标文件\n");
                            break;
                        default:
                             break;            
          }    
         printf("节头表偏移:%p\n",ehdr64.e_shoff);
          
    }else{
          perror("File NO ELF!\n");
          return FALSE;
    }
}

int main(int argc, char *argv[])
{
    int boolen;
    if(argc == 2){
            boolen = OpenElf(argv[1]);
            if(boolen == FALSE){
                      printf("open %s fail!",argv[1]);
                      return -1;
            }
            else
            {
                ReadElf(boolen);
            }
                
    }
    else
    {
            printf("参数格式不正确!请正确输入:./main testfile\n");
    }

    return 0;
}
0 0