此文为静态分析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格式

最新文章

  1. windows脚本调用批处理
  2. 小计C/C++问题(1)
  3. 6、android 网络编程
  4. lintcode:整数排序||
  5. C# 对JS编码/解码进行转换
  6. 使用wrapper将java程序注册程windows服务后不生效
  7. RMAN数据库恢复之恢复表空间和数据文件
  8. CodeFroces--Good Bye 2016-A-New Year and Hurry(水题-模拟)
  9. 结合提供者模式解析Jenkins源码国际化的实现
  10. YARN 的深入简出
  11. kubernetes lable 操作
  12. jQuery把所有被选中的checkbox的某个属性值连接成字符串
  13. 关于 Local feature 和 Global feature 的组合
  14. 转载:移动端+微信小程序实现,手机端滑动分页代码思路(ajax)
  15. 设计模式之&mdash;&mdash;visitor模式
  16. DotNetCore跨平台~autofac属性的自动注入
  17. thinkphp表单验证
  18. Linux的防火墙–Iptables
  19. 20145324 《Java程序设计》第3周学习总结
  20. 【BZOJ1043】下落的圆盘 [计算几何]

热门文章

  1. java 添加到数据库的数据没有时分秒
  2. C# WPF Application 下的文件操作
  3. C#设计模式系列:代理模式(Proxy Pattren)
  4. HttpWebRequest(System.Net)模拟HTTP发送POST
  5. WPF MaterialDesignInXamlToolkit锁屏恢复后页面冻结的问题
  6. django LookUp
  7. python设计模式-适配器
  8. Blocks to Cubes
  9. 在macbookpro上开启ssh服务
  10. “全栈2019”Java第七十四章:内部类与静态内部类相互嵌套