此文为静态分析ELF文件结构,遍历其中Elf_Ehdr文件头信息,遍历Elf_Shdr节表头信息,并将所有节放置在左侧树控件上,遍历Elf_Phdr程序头也放置在左侧树控件上,并着重分析字符串表,重定位表,符号表。遍历表头的使用使用map将节表信息对应字符串存入,当点击树控件的时候取出显示在右侧。

遍历程序头

Elf64_Phdr* Phdr = (Elf64_Phdr*)(m_szFileData+Elf_Ehdr->e_phoff);
for(int i = ;i<Elf_Ehdr->e_phnum;i++,Phdr++)
{
CString item;
item.Format(L"Program Header %d",i); m_Tree.InsertItem(item,,); Map_Phdr64.insert(map<CString,Elf64_Phdr>::value_type(item,*(Elf64_Phdr*)Phdr));
}

遍历节表头

    Elf64_Shdr* Shdr = (Elf64_Shdr*)(m_szFileData+Elf_Ehdr->e_shoff);
for(int i = ;i< Elf_Ehdr->e_shnum; i++,Shdr++)
{
WCHAR* Temp = CharToWchar(pStrTable + Shdr->sh_name);
CString item;
item.Format(L"%s",Temp);
HTREEITEM Handle = m_Tree.InsertItem(item,,);
if(item==L".shstrtab"||item==L".strtab"||item==L".dynstr")
{
m_Tree.InsertItem(L"String Table 字符串表",,,Handle);
}
else if(item==L".symtab")
{
m_Tree.InsertItem(L"Symtab 符号表",,,Handle);
}
else if(item==L".rel.dyn"||item==L".rel.plt")
{
m_Tree.InsertItem(L"REL Table 重定位表",,,Handle);
}
else if(item==L".dynsym")
{
m_Tree.InsertItem(L"Dynsym 符号表",,,Handle);
}
Map_Shdr64.insert(map<CString,Elf64_Shdr>::value_type(item,*(Elf64_Shdr*)Shdr));
  }

其中Shdr结构中st_name存放的是字符串表(最后一个节表头对应的节.shstrtab)中的索引,我们需要取得节表对应的名称,需要在.shstrtab中取出

char * pStrTable;    // 用以取得每个 section 的名字
Elf64_Shdr * ShdrStringTable = (Elf64_Shdr *)(m_szFileData + Elf_Ehdr->e_shoff) + Elf_Ehdr->e_shstrndx;
pStrTable = (char *)(m_szFileData + ShdrStringTable->sh_offset);

取出字符串的时候只需要调用

pStrTable + Shdr->sh_name

ELF格式验证为前4个字节为: ".ELF"

if (!(
(((char*)m_szFileData)[EI_MAG0] == 0x7F) &&
(((char*)m_szFileData)[EI_MAG1] == 'E') &&
(((char*)m_szFileData)[EI_MAG2] == 'L') &&
(((char*)m_szFileData)[EI_MAG3] == 'F'))) {
MessageBox(L"非ELF 格式文件或者文件已被损坏!",L"Error");
goto END;
}

程序运行结果如下:

还有没完善的大家可以自行学习完善,对于64和32位没想到什么好的方法重定义结构体,只能写两个函数,有什么方法一定要告诉我!!

其他可以参考代码:https://github.com/LycorisGuard/android/tree/master/ElfAnalyse

ELF格式参考:ELF格式

ELF文件解析器支持x86x64ELF文件的更多相关文章

  1. 自定义Yaml解析器替换Properties文件

    自定义Yaml解析器替换Properties文件 项目结构 案例代码 配置类SpringConfiguration @Configuration @Import(JdbcCofnig.class) @ ...

  2. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  3. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  4. Dicom格式文件解析器[转]

    Dicom格式文件解析器   Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理.只不 ...

  5. javap -- Java 类文件解析器

    参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/techn ...

  6. Atitit。Tree文件解析器的原理流程与设计实现  java  c# php js

    Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─&quo ...

  7. 使用Pull解析器生成XML文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  8. skymvc文件上传支持多文件上传

    skymvc文件上传支持多文件上传 支持单文件.多文件上传 可以设定 文件大小.存储目录.文件类型 //上传的文件目录 $this->upload->uploaddir="att ...

  9. DEX文件解析--6、dex文件字段和方法定义解析

    一.前言    前几篇文章链接:       DEX文件解析---1.dex文件头解析       DEX文件解析---2.Dex文件checksum(校验和)解析       DEX文件解析--3. ...

随机推荐

  1. 修复DBGrideh使用TMemTableEh在Footers求平均值为0的Bug

    在一个项目中,使用DBGrideh,当使用自带的内存数据集时,对于Footers添加的求平均值,一直显示为0,其他汇总数据都是可以的,而切换使用TClientDataSet或者TADODataSet, ...

  2. [Postgres]合并多行到一列(转)

    转自http://csk83.sinaapp.com/?p=104 在实际应用中常常遇见这样的情况,见下表,我们现在需要统计出来每年每个人的工资总和以及发放月份. user_name year mon ...

  3. 神器与经典--sp_helpIndex

    ======================================================= 每每和那些NB的人学习技术的时候,往往都佩服他们对各个知识点都熟捻于心,更佩服的是可以在 ...

  4. RobotFramework与Jenkins集成后构建成功率高于设置阈值但总是显示失败

    摘要:robot执行后总是失败 1.在配置jenkins的job时,添加构建步骤Execute Windows batch command,输入执行robotframework测试用例命令 2.然后j ...

  5. Redis 七月小说网的爬虫缓存设计

    一.爬虫策略 1.主服务器先根据spider.all set排重,再 lpush request_url 到spider.wait List中,并且 sadd request_url 到 set中: ...

  6. Webserver asp配置及伪静态设置

    Webserver  IIS asp配置及伪静态设置 一.概述: 在Windows Server 2003系统中,用户可以借助IIS 6.0配置基于ASP.PHP.asp.NET等语言的动态Web网站 ...

  7. [AGC006E] Rotate 3x3 树状数组+贪心

    Description ​ XFZ在北京一环内有一套房. ​ XFZ房子的地砖呈网格状分布,是一个3∗N3∗N的网格.XFZ在买下这套房时,每个地砖上有一个数字,位置为(i,j)(i,j)的地砖上的数 ...

  8. 一分钟了解 TCP/IP 模型

    原文讲的不是特别细,为了便于理解,我颠倒了顺序. 写在开始 我们需要知道协议到底是什么. 在网络上,一个协议对应于管理系统之间如何相互通信的规则. 然后我们需要知道什么是协议族. 一个协议族是一系列协 ...

  9. Vim查找与替换

    \c 忽略大小写 \C 强制区分大小写 \v 除了_.字母.数字以为的所有字符都当做具有特殊含义的字符 \V 只有反斜杠有特殊含义 %s///gn 统计某个词出现的次数 替换的flag g 全局范围执 ...

  10. UITableViewCell笔记

    默认的四种cell的类型 原网站 还有这个带图的 据我自己试验,只有value2不自带imageview 不同的accessoryType 可以看到,一个tabelviewcell的contentvi ...