C语言实现读取elf文件某section

这方面资料很少,所有结合相关信息写出代码

代码

#include <stdio.h>
#include <memory.h>
#include <stddef.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <elf.h>int main(int argc, char* argv[])
{// 参数错误if (argc < 2){printf("invalid arguments\n");exit(0);}// 打开文件FILE *fp;fp = fopen(argv[1], "r");if (NULL == fp){printf("fail to open the file");exit(0);}// 解析headElf64_Ehdr elf_head;int shnum, a;// 读取 head 到elf_heada = fread(&elf_head, sizeof(Elf64_Ehdr), 1, fp);   //fread参数1:读取内容存储地址,参数2:读取内容大小,参数3:读取次数,参数4:文件读取引擎if (0 == a){printf("fail to read head\n");exit(0);}// 判断elf文件类型if (elf_head.e_ident[0] != 0x7F ||elf_head.e_ident[1] != 'E' ||elf_head.e_ident[2] != 'L' ||elf_head.e_ident[3] != 'F'){printf("Not a ELF file\n");exit(0);}// 解析section 分配内存 section * 数量Elf64_Shdr *shdr = (Elf64_Shdr*)malloc(sizeof(Elf64_Shdr) * elf_head.e_shnum);if (NULL == shdr){printf("shdr malloc failed\n");exit(0);}// 设置fp偏移量 offset,e_shoff含义a = fseek(fp, elf_head.e_shoff, SEEK_SET); //fseek调整指针的位置,采用参考位置+偏移量if (0 != a){printf("\nfaile to fseek\n");exit(0);}// 读取section 到 shdr, 大小为shdr * 数量a = fread(shdr, sizeof(Elf64_Shdr) * elf_head.e_shnum, 1, fp);if (0 == a){printf("\nfail to read section\n");exit(0);}// 重置指针位置到文件流开头rewind(fp);// 将fp指针移到 字符串表偏移位置处fseek(fp, shdr[elf_head.e_shstrndx].sh_offset, SEEK_SET);// 第e_shstrndx项是字符串表 定义 字节 长度 char类型 数组char shstrtab[shdr[elf_head.e_shstrndx].sh_size];char *temp = shstrtab;// 读取内容a = fread(shstrtab, shdr[elf_head.e_shstrndx].sh_size, 1, fp);if (0 == a){printf("\nfaile to read\n");}// 遍历for (int i = 0; i < elf_head.e_shnum; i++){temp = shstrtab;temp = temp + shdr[i].sh_name;if (strcmp(temp, ".dynsym") != 0) continue;//该section名称printf("节的名称: %s\n", temp);printf("节首的偏移: %x\n", shdr[i].sh_offset);printf("节的大小: %x\n", shdr[i].sh_size);uint8_t *sign_data=(uint8_t*)malloc(sizeof(uint8_t)*shdr[i].sh_size);// 依据此段在文件中的偏移读取出fseek(fp, shdr[i].sh_offset, SEEK_SET);fread(sign_data, sizeof(uint8_t)*shdr[i].sh_size, 1, fp);// 显示读取的内容uint8_t *p = sign_data;int j = 0;for (j=0; j<shdr[i].sh_size; j++){printf("%x", *p);p++;}}return 0;
}

linux中演示

查看hello文件中section
readelf --wide  --header hello

读取section中".dynsym"信息

读取hello.c生成的hello文件

//hello.c
#include<stdio.h>
int main(){printf("hello");
}
gcc hello.c -o hello

读取hello中section的 “ .dynsym”

gcc read_section.c -o read_section
./read_section hello

C语言实现读取elf文件某section相关推荐

  1. java inireader_用Java读取INI文件(带section的)

    代码 #include #include int main(){ boost::property_tree::ptree m_pt, tag_setting; read_ini("confi ...

  2. R语言中读取xlsx文件的方法

    R语言中读取xlsx文件的方法 安装包 install.packages("openxlsx") library(openxlsx) 文件名+sheet的序号 data<- ...

  3. C语言如何读取txt文件(最新免费代码)

    C语言如何读取txt文件(最新免费代码) 运行效果展示 第一步添加头文件 写函数 完整的代码 运行效果展示 第一步添加头文件 #include <stdio.h> 写函数 使用的API是 ...

  4. R语言批量读取txt文件并合并

    气象数据处理-R语言批量读取txt数据并合并 处理地面气候资料日值数据集v3.0 数据集以月为单位存储,每个月是一个单独的文件,上图. 在处理数据过程中,我们往往会将单独的数据合并到一起做进一步分析, ...

  5. c语言如何读取avi文件,avilib库的使用

    avilib库介绍 avilib顾名思义,是对avi文件处理的工具.他是一个使用c语言编写的库,可以很方便的对avi文件提取帧和生成avi视频文件.如下列出avilib库的代码. 2. avilib的 ...

  6. c语言编程读取bmp文件数据,c语言读取BMP图片的RGB数据

    BMP图片是位图(bitmap),一般未压缩,要读取BMP文件只要知道它的文件结构就可以了,具体格式可以百度或者google,就不多说了,几个重要的点在代码里面有注释. /** c语言读取位图信息 * ...

  7. c语言实现读取csv文件,并对数据进行分析。

    总代码: ```c在这里插入代码片 #include <stdio.h> #include <stdlib.h> #include <string.h> struc ...

  8. R语言中读取xlxs文件

    最近在学R语言,在写作业的时候要求读取某一个xlsx格式的excel文件. 首先要安装xlsx程序包(低版本的R不支持),直接输入 install.packages("xlsx") ...

  9. c#语言中读取txt文件,简单的c#文本文件读写-.NET教程,C#语言

    system.io命名空间中的类为托管应用程序提供文件以及其他形式的输入输出.托管i/o的基本构件是流,而流是字节导向的数据的抽象表示.流通过system.io.stream类表示. system.i ...

  10. c语言怎么读取mhx文件内容,C语言重新学习――基础杂类

    1.编译运行 我们一般编译C语言程序,用的是GCC编译器, GCC编译:gcc 文件名.c GCC连接:gcc -o 可执行文件名 文件名1.c,文件名2.c..... 执行可执行文件:直接输入文件名 ...

最新文章

  1. Linux CNTOS7 修改网络配置
  2. Linux-软件包管理
  3. mysql 简单优化规则
  4. 信息系统项目管理知识--项目风险管理
  5. 【JSP】JSP的四种作用域
  6. Git笔记(17) 协议
  7. 新鲜出炉,Python 告诉你程序员最关注的技术竟然是……
  8. tomcat部署项目启动采坑之UnknownHostException
  9. 第一章 .NET的原理(2.0)
  10. 2017秋-软件工程第八次作业-第九周例行总结
  11. day68_淘淘商城项目_01
  12. python中对文件、文件夹,目录的基本操作
  13. 微运行库2015_vc2015运行库下载-Visual C++ 2015(vc2015)下载V14.0.24123 官方版【32位|64位|】-西西软件下载...
  14. 2 HTML常用标签标签嵌套和并列关系
  15. Electron-vueda打包EXE文件,打开后白屏
  16. 多平台如何发布文章?
  17. 熟悉又陌生的 k8s 字段:finalizers
  18. Ubuntu下mosquitto 的使用
  19. windows配置java环境
  20. Unity游戏教程初步(八):Animator的使用

热门文章

  1. 国家标准《文后参考文献著录规则》(GB7714-87)
  2. Excel 线性回归函数 LINEST
  3. 最新AxureUX WEB端交互原型通用组件模板库 组件仍然是这套作品的核心内容,这套作品的组件由通用组件、数据录入、数据展示、信息反馈
  4. 人工智能能为旅游业带来多大的想象空间?
  5. Skyline软件二次开发初级——11如何在WEB页面中的三维地图上加载和保存工程文件...
  6. 六款主流数据恢复软件(绿色版)下载
  7. 锐捷交换机配置保存到计算机,锐捷交换机常用配置命令汇总
  8. 猜姓氏c语言题目,猜姓氏的谜语及答案
  9. 税务计算机类考试题型,税务师考试题型分值分配、计算器要求及2020年考试时间安排...
  10. 笔记本锁定计算机功能键,如何锁上笔记本键盘_怎样锁定笔记本键盘