码迷,mamicode.com
首页 > 其他好文 > 详细

【有码】ELF文件解析器支持x86x64ELF文件

时间:2016-08-21 12:23:13      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

先贴两个图

32位文件

技术分享

 

64位文件

技术分享

 

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

遍历程序头

Elf64_Phdr* Phdr = (Elf64_Phdr*)(m_szFileData+Elf_Ehdr->e_phoff);
for(int i = 0;i<Elf_Ehdr->e_phnum;i++,Phdr++)
{
   CString item;
   item.Format(L"Program Header %d",i);

            
   m_Tree.InsertItem(item,0,2);

   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 = 0;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,0,2);
       if(item==L".shstrtab"||item==L".strtab"||item==L".dynstr")
       {
          m_Tree.InsertItem(L"String Table 字符串表",1,3,Handle);
       }
       else if(item==L".symtab")
       {
          m_Tree.InsertItem(L"Symtab 符号表",1,3,Handle);
       }
       else if(item==L".rel.dyn"||item==L".rel.plt")
       {
          m_Tree.InsertItem(L"REL Table 重定位表",1,3,Handle);
       }
       else if(item==L".dynsym")
       {
          m_Tree.InsertItem(L"Dynsym 符号表",1,3,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位没想到什么好的方法重定义结构体,只能写两个函数,有什么方法一定要告诉我!!

其他可以参考代码:代码下载

ELF格式参考:ELF格式

 

【有码】ELF文件解析器支持x86x64ELF文件

标签:

原文地址:http://www.cnblogs.com/aliflycoris/p/5792278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!