检查打开的文件是不是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;

}

时间: 09-10

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

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

#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_S

ELF格式的重定位原理分析

前面有篇文章分析了ELF格式,也只是让我们对目标文件有了一个大概的了解,并没有说明一个十分重要的问题:重定位,今天重新看了下重定位的资料,终于弄懂了重定位的过程,下面来做一个分析. 我们将使用下面两个源代码中的文件a.c和b.c展开分析: //a.c extern int shared; int main() { int a=100; swap(&a,&shared); } //b.c int shared=1; void swap(int *a,int *b) { *a^=*b^=*a^

C#使用xsd文件验证XML 格式是否正确

方法一: 我使用XmlReader来处理,因为觉得XmlReader简单点. 我自己做了个例子来说明,例子里的XML不是很复杂,没有子节点的. XML 文件(a.xml): <?xml version="1.0" encoding="utf-8" ?> <PROFILE> <PROFILEID>0001</PROFILEID> <DESCIPTION>我的内容</DESCIPTION> <

html5表单上传控件Files筛选指定格式的文件:accept属性过滤excel文件

摘自:http://blog.csdn.net/jyy_12/article/details/9851349 (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:<input type="file" multiple> 只允许上传一个文件:<input  type="file" single> 2.上传指定的文件格式 <input type="file" acce

ELF格式解析库之抽象数据类型

抽象?抽谁的象? ELF是一种链接执行格式,它规定了对于一个ELF文件的基本数据类型是什么样的.可是,要解析一个ELF文件,而这个ELF文件或者是32Bits 或者是 64Bits,反正字长是未定的,怎么办?难道我们要定义两套解析的接口,以对应不同的字长的ELF文件吗?如果要这样做,不是不可以,只是那样做为接口的设计增加了太大的负担.这里我们采用"抽象"的方式,将已有的两套基础数据结构封装成一个兼容的数据结构.这样,我们设计解析接口时,可以做到尽量的简化,大大的减轻了工作量. 因此,这

od 查看特殊格式的文件内容

用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件. 语法: od [选项] 文件- 命令中各选项的含义: - A 指定地址基数,包括: d 十进制 o 八进制(系统默认值) x 十六进制 n 不打印位移值 - t 指定数据的显示格式,主要的参数有: c ASCII字符或反斜杠序列 d 有符号十进制数 f 浮点数 o 八进制(系统默认值为02) u 无符号十进制数 x 十六进制数 除了选项c以外的其他选项后面都可以跟一个十进

Linux学习日志之Linux之命令基本格式及文件处理命令

Linux常用命令: 练习3遍以上 一.命令基本格式 1.命令格式: [root(管理员)@localhost(主机名)~]#(超级用户提示符,普通用户提示符是$) adminis /root一级目录用pwd print working directory(打印工作目录)查看 /home/user1/二级目录 [[email protected] ~]# cd /usr/local/src/ 切换当前目录 [[email protected] src]# 命令[选项] [参数]  中括号表示可选

C#对.CSV格式的文件--逗号分隔值 的读写及上传ftp服务器操作方法总结

前言 公司最近开发需要将数据保存到.csv文件(逗号分隔值 )中然后上传到ftp服务器上,供我们系统还有客户系统调用,之前完全没有接触过这个,所以先来看看百度的解释:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据.CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字

PHP文件操作 之读取一个文件(以二进制只读的方式打开)

最近应用了文件的读取,顺便复习一下! //读取一个文件 $f = fopen($filename,'rb'); $f: 表示返回的一个资源句柄 $filename:要打开的文件路径 rb:参数,表示只读且以二进制的形式打开该文件 读取后循环该文件数据,因为读取文件是一行一行的 //如果没有读取到文件结束则循环 while(!feof($f)) { $str = fgets($f);//获取的是每一行的数据 /*对该数据进行的操作代码...*/ } //关闭该资源 fclose($f);