• ELF格式解析库之初始化


    寻宝要先设计路线图

    对一个ELF文件来说,它里边装个一个程序的所有信息。我们想要拿的程序信息就在这个ELF文件的某个地址处。可是我们根本就不知道这个具体的地址是哪个,怎么办?举个较形象的例子来描述我们将要的做的事情。峨眉山的山道上放着一大箱金子,我们想搞到这箱黄金。所以在动手之前,我们应该先搞清楚这箱黄金具体位置在哪条山路上,然后设计出几条可行的路线图,接着才是沿着先前设计好的路线去找宝藏。只不过,在这里我们要找的黄金变成了程序某个部分的信息,而那座峨眉山则变成了一个ELF文件。

    所以,寻宝要先设计路线图,初始化库要先初始化数据管理句柄。

    按照上两篇文章介绍的,ELF的一级数据管理句柄是 :SEF_ELFHEADER

                                         二级数据管理句柄是:SEF_PROHEADER SEF_SECHEADER

    因此,我们按照顺序依次初始化SEF_ELFHEADER, SEF_PROHEADER, SEF_SECHEADER 三个数据管理句柄(管家婆,哈哈哈)。

    初始化ELF header

       1:  long init_elf(char *PBuffer, int nsize, void** phandle)
       2:  {
       3:      int ret = 0;
       4:      if((PBuffer == NULL) || (nsize < 16) || (phandle == NULL))
       5:      {
       6:            ret = -1;
       7:            goto only_out;
       8:      }
       9:      if(is_elf(PBuffer))
      10:      {
      11:          ret = -3;
      12:          goto only_out;
      13:      }
      14:      /*create new memory for SEF_HEADSET     structure and set value
      15:       *create new memory for SEF_ELFHEADER    structure and set value
      16:       */
      17:      SEF_HEADSET *PTemp = (SEF_HEADSET *)malloc(sizeof(SEF_HEADSET));
      18:      SEF_ELFHEADER *handle = (SEF_ELFHEADER *)malloc(sizeof(SEF_ELFHEADER));
      19:      if(handle == NULL || PTemp == NULL)
      20:      {
      21:          ret = -2;
      22:          goto only_out;
      23:      }
      24:      memset(PTemp, 0, sizeof(SEF_HEADSET));
      25:      memset(handle, 0, sizeof(SEF_ELFHEADER));
      26:      
      27:      /* copy elf header from PBuffer */
      28:      uint8_t nBit = PBuffer[4];
      29:      if(nBit == ELFCLASS32)
      30:      {
      31:          handle->nFlag_Bits = ELFCLASS32;
      32:          memcpy(&handle->S_ElfHeader_32, PBuffer, sizeof(SEF_ELFHEADER_32));
      33:      }
      34:      if(nBit == ELFCLASS64)
      35:      {
      36:          handle->nFlag_Bits= ELFCLASS64;
      37:          memcpy(&handle->S_ElfHeader_64, PBuffer, sizeof(SEF_ELFHEADER_64));
      38:      }
      39:      
      40:      handle->nFlag_Data = PBuffer[5];
      41:      if((get_local_endding() != PBuffer[5]))
      42:      {
      43:          handle->S_ElfHeader_32.e_type = converu16(handle->S_ElfHeader_32.e_type);
      44:              handle->S_ElfHeader_32.e_machine = converu16(handle->S_ElfHeader_32.e_machine);
      45:              handle->S_ElfHeader_32.e_version = converu32(handle->S_ElfHeader_32.e_version);
      46:              handle->S_ElfHeader_32.e_entry =   converu32(handle->S_ElfHeader_32.e_entry  );
      47:              handle->S_ElfHeader_32.e_phoff   = converu32(handle->S_ElfHeader_32.e_phoff  );
      48:              handle->S_ElfHeader_32.e_shoff   = converu32(handle->S_ElfHeader_32.e_shoff  );
      49:              handle->S_ElfHeader_32.e_flags   = converu32(handle->S_ElfHeader_32.e_flags  );
      50:              handle->S_ElfHeader_32.e_ehsize  = converu16(handle->S_ElfHeader_32.e_ehsize );
      51:              handle->S_ElfHeader_32.e_phentsize = converu16(handle->S_ElfHeader_32.e_phentsize);
      52:              handle->S_ElfHeader_32.e_phnum   = converu16(handle->S_ElfHeader_32.e_phnum  );
      53:              handle->S_ElfHeader_64.e_type = converu32(handle->S_ElfHeader_64.e_type);
      54:              handle->S_ElfHeader_64.e_machine = converu32(handle->S_ElfHeader_64.e_machine);
      55:              handle->S_ElfHeader_64.e_version = converu64(handle->S_ElfHeader_64.e_version);
      56:              handle->S_ElfHeader_64.e_entry =   converu64(handle->S_ElfHeader_64.e_entry  );
      57:              handle->S_ElfHeader_64.e_phoff   = converu64(handle->S_ElfHeader_64.e_phoff  );
      58:              handle->S_ElfHeader_64.e_shoff   = converu64(handle->S_ElfHeader_64.e_shoff  );
      59:              handle->S_ElfHeader_64.e_flags   = converu64(handle->S_ElfHeader_64.e_flags  );
      60:              handle->S_ElfHeader_64.e_ehsize  = converu32(handle->S_ElfHeader_64.e_ehsize );
      61:              handle->S_ElfHeader_64.e_phentsize = converu32(handle->S_ElfHeader_64.e_phentsize);
      62:              handle->S_ElfHeader_64.e_phnum   = converu32(handle->S_ElfHeader_64.e_phnum  );
      63:      }
      64:      PTemp->pS_ElfHeader= handle;
      65:      *phandle = PTemp;
      66:  only_out:
      67:          return ret;
      68:  }

    初始化segment header

       1:  long ByteAdjust_SegTab32(SEF_PROHEADER *handle, int PhNum,int nFlag_Data)
       2:  {
       3:      int ret = 0;
       4:      int i;
       5:      if((handle == NULL) || (PhNum < 1) || 
       6:          ((nFlag_Data != ELFDATA2MSB) &&
       7:          (nFlag_Data != ELFDATA2LSB) &&
       8:          (nFlag_Data != ELFDATANONE)))
       9:      {
      10:          ret = -1;
      11:          goto GetOut;
      12:      }
      13:      if(get_local_endding() != nFlag_Data)
      14:          {
      15:           for(i=0; i<PhNum; i++)
      16:           {                
      17:          handle->pS_ProHeader_32[i].p_type   = converu32(handle->pS_ProHeader_32[i].p_type);
      18:          handle->pS_ProHeader_32[i].p_flags  = converu32(handle->pS_ProHeader_32[i].p_flags);
      19:          handle->pS_ProHeader_32[i].p_offset = converu32(handle->pS_ProHeader_32[i].p_offset);
      20:          handle->pS_ProHeader_32[i].p_vaddr  = converu32(handle->pS_ProHeader_32[i].p_vaddr);
      21:          handle->pS_ProHeader_32[i].p_paddr  = converu32(handle->pS_ProHeader_32[i].p_paddr);
      22:          handle->pS_ProHeader_32[i].p_filesz = converu32(handle->pS_ProHeader_32[i].p_filesz);
      23:          handle->pS_ProHeader_32[i].p_memsz = converu32(handle->pS_ProHeader_32[i].p_memsz);
      24:          handle->pS_ProHeader_32[i].p_align  = converu32(handle->pS_ProHeader_32[i].p_align);
      25:           }
      26:          }
      27:  GetOut:
      28:      return ret;
      29:  }
      30:   
      31:  long ByteAdjust_SegTab64(SEF_PROHEADER *handle, int PhNum,int nFlag_Data)
      32:  {
      33:      int ret = 0;
      34:      int i;
      35:      if((handle == NULL) || (PhNum < 1) || 
      36:          ((nFlag_Data != ELFDATA2MSB) &&
      37:          (nFlag_Data != ELFDATA2LSB) &&
      38:          (nFlag_Data != ELFDATANONE)))
      39:      {
      40:          ret = -1;
      41:          goto GetOut;
      42:      }
      43:      if(get_local_endding() != nFlag_Data)
      44:          {
      45:           for(i=0; i<PhNum; i++)
      46:           {                
      47:          handle->pS_ProHeader_64[i].p_type   = converu32(handle->pS_ProHeader_64[i].p_type);
      48:          handle->pS_ProHeader_64[i].p_flags  = converu32(handle->pS_ProHeader_64[i].p_flags);
      49:          handle->pS_ProHeader_64[i].p_offset = converu32(handle->pS_ProHeader_64[i].p_offset);
      50:          handle->pS_ProHeader_64[i].p_vaddr  = converu32(handle->pS_ProHeader_64[i].p_vaddr);
      51:          handle->pS_ProHeader_64[i].p_paddr  = converu32(handle->pS_ProHeader_64[i].p_paddr);
      52:          handle->pS_ProHeader_64[i].p_filesz = converu32(handle->pS_ProHeader_64[i].p_filesz);
      53:          handle->pS_ProHeader_64[i].p_memsz = converu32(handle->pS_ProHeader_64[i].p_memsz);
      54:          handle->pS_ProHeader_64[i].p_align  = converu32(handle->pS_ProHeader_64[i].p_align);
      55:           }
      56:          }
      57:  GetOut:
      58:      return ret;
      59:  }
      60:   
      61:  long init_segtab(unsigned char *PBuffer,void *Handle)
      62:  {
      63:      int ret = 0;
      64:      SEF_HEADSET *PHandle = (SEF_HEADSET *)Handle;
      65:      if((Handle == NULL ) && (PHandle->pS_ElfHeader == NULL))
      66:      {
      67:          ret = -1;
      68:          goto GetOut;
      69:      }
      70:   
      71:     int PhNum = 0;
      72:      int i = 0;
      73:      SEF_ELFHEADER * p_ElfHeader = PHandle->pS_ElfHeader;
      74:      
      75:      if((PhNum = p_ElfHeader->S_ElfHeader_32.e_phnum) < 1)
      76:      {
      77:          PHandle->pS_ProHeader = NULL;
      78:          goto GetOut;
      79:      }
      80:      
      81:      SEF_PROHEADER *p_ProHeader = (SEF_PROHEADER *)malloc(sizeof(SEF_PROHEADER));
      82:      
      83:      if(p_ProHeader == NULL)
      84:      {
      85:          ret = -3;
      86:          goto GetOut;
      87:      }
      88:      
      89:    /*start deal 32bits elf file*/
      90:      if(p_ElfHeader->nFlag_Bits == ELFCLASS32)
      91:      {
      92:      SEF_PROHEADER_32 *SArrP_Seg = (SEF_PROHEADER_32 *)malloc(PhNum*sizeof(SEF_PROHEADER_32));
      93:      if(SArrP_Seg == NULL)
      94:      {
      95:          ret = -4;
      96:          goto GetOut;
      97:      }
      98:          
      99:      memcpy(SArrP_Seg,
     100:          (PBuffer+p_ElfHeader->S_ElfHeader_32.e_phoff),
     101:          (PhNum*(p_ElfHeader->S_ElfHeader_32.e_phentsize)));
     102:      if( ByteAdjust_SegTab32(p_ProHeader, PhNum, p_ElfHeader->nFlag_Data) != 0)
     103:          {
     104:              ret = -8;
     105:              goto GetOut;
     106:          }
     107:          
     108:          p_ProHeader->pS_ProHeader_32 = SArrP_Seg;
     109:          p_ProHeader->pS_ProHeader_64 = NULL;
     110:      }
     111:    /*start deal 64bits elf file*/
     112:      else if(p_ElfHeader->nFlag_Bits == ELFCLASS64)
     113:      {
     114:          
     115:      SEF_PROHEADER_64 *SArrP_Seg = (SEF_PROHEADER_64 *)malloc(PhNum*sizeof(SEF_PROHEADER_64));
     116:      if(SArrP_Seg == NULL)
     117:      {
     118:          PHandle->pS_ProHeader = NULL;
     119:          ret = -4;
     120:          goto GetOut;
     121:      }
     122:      /*copy program header table from buffer + offset*/
     123:      memcpy(SArrP_Seg,
     124:              PBuffer+p_ElfHeader->S_ElfHeader_64.e_phoff,
     125:              (PhNum*(p_ElfHeader->S_ElfHeader_64.e_phentsize)));
     126:              
     127:      /*adjust byte order for every segment*/
     128:      if((ret = ByteAdjust_SegTab64(p_ProHeader, PhNum, p_ElfHeader->nFlag_Data)) != 0)
     129:          {
     130:              ret = -8;
     131:              goto GetOut;
     132:          }
     133:          
     134:          p_ProHeader->pS_ProHeader_32 = NULL;
     135:          p_ProHeader->pS_ProHeader_64 = SArrP_Seg;
     136:      }
     137:      else
     138:      {
     139:          ret = -10;
     140:          goto GetOut;
     141:      }
     142:      
     143:      PHandle->pS_ProHeader = p_ProHeader;
     144:   
     145:   
     146:  GetOut:
     147:      return ret;
     148:  }

    初始化section header

       1:  long ByteAdjust_SecTab32(SEF_SECHEADER *handle, int ShNum,int nFlag_Data)
       2:  {
       3:      int ret = 0;
       4:      int i;
       5:      if((handle == NULL) || (ShNum < 1) || 
       6:          ((nFlag_Data != ELFDATA2MSB) &&(nFlag_Data != ELFDATA2LSB) &&(nFlag_Data != ELFDATANONE)))
       7:      {
       8:          ret = -1;
       9:          goto GetOut;
      10:      }
      11:      
      12:      if(get_local_endding() != nFlag_Data)
      13:      {
      14:       for(i=0; i<ShNum; i++)
      15:       {
      16:   
      17:          handle->pS_SecHeader_32[i].sh_name   = converu32(handle->pS_SecHeader_32[i].sh_name);
      18:          handle->pS_SecHeader_32[i].sh_type  = converu32(handle->pS_SecHeader_32[i].sh_type);
      19:          handle->pS_SecHeader_32[i].sh_flags = converu32(handle->pS_SecHeader_32[i].sh_flags);
      20:          handle->pS_SecHeader_32[i].sh_addr  = converu32(handle->pS_SecHeader_32[i].sh_addr);
      21:          handle->pS_SecHeader_32[i].sh_offset  = converu32(handle->pS_SecHeader_32[i].sh_offset);
      22:          handle->pS_SecHeader_32[i].sh_size = converu32(handle->pS_SecHeader_32[i].sh_size);
      23:          handle->pS_SecHeader_32[i].sh_link = converu32(handle->pS_SecHeader_32[i].sh_link);
      24:          handle->pS_SecHeader_32[i].sh_info  = converu32(handle->pS_SecHeader_32[i].sh_info);
      25:          handle->pS_SecHeader_32[i].sh_addralign  = converu32(handle->pS_SecHeader_32[i].sh_addralign);
      26:          handle->pS_SecHeader_32[i].sh_entsize  = converu32(handle->pS_SecHeader_32[i].sh_entsize);
      27:       }
      28:      }
      29:  GetOut:
      30:      return ret;
      31:  }
      32:   
      33:  long ByteAdjust_SecTab64(SEF_SECHEADER *handle, int ShNum,int nFlag_Data)
      34:  {
      35:      int ret = 0;
      36:      int i;
      37:      if((handle == NULL) || (ShNum < 1) || 
      38:          ((nFlag_Data != ELFDATA2MSB) &&(nFlag_Data != ELFDATA2LSB) &&(nFlag_Data != ELFDATANONE)))
      39:      {
      40:          ret = -1;
      41:          goto GetOut;
      42:      }
      43:      
      44:      if(get_local_endding() != nFlag_Data)
      45:      {
      46:       for(i=0; i<ShNum; i++)
      47:       {
      48:          handle->pS_SecHeader_64[i].sh_name   = converu32(handle->pS_SecHeader_64[i].sh_name);
      49:          handle->pS_SecHeader_64[i].sh_type  = converu32(handle->pS_SecHeader_64[i].sh_type);
      50:          handle->pS_SecHeader_64[i].sh_flags = converu32(handle->pS_SecHeader_64[i].sh_flags);
      51:          handle->pS_SecHeader_64[i].sh_addr  = converu32(handle->pS_SecHeader_64[i].sh_addr);
      52:          handle->pS_SecHeader_64[i].sh_offset  = converu32(handle->pS_SecHeader_64[i].sh_offset);
      53:          handle->pS_SecHeader_64[i].sh_size = converu32(handle->pS_SecHeader_64[i].sh_size);
      54:          handle->pS_SecHeader_64[i].sh_link = converu32(handle->pS_SecHeader_64[i].sh_link);
      55:          handle->pS_SecHeader_64[i].sh_info  = converu32(handle->pS_SecHeader_64[i].sh_info);
      56:          handle->pS_SecHeader_64[i].sh_addralign  = converu32(handle->pS_SecHeader_64[i].sh_addralign);
      57:          handle->pS_SecHeader_64[i].sh_entsize  = converu32(handle->pS_SecHeader_64[i].sh_entsize);
      58:       }
      59:      }
      60:  GetOut:
      61:      return ret;
      62:  }
      63:   
      64:  long init_section(unsigned char *pbuffer, void *Handle)
      65:  {
      66:      int ret = 0;
      67:      SEF_HEADSET *pS_HeadSet_Temp = NULL;
      68:      SEF_ELFHEADER *pS_ElfHeader_Temp = NULL;
      69:      SEF_SECHEADER *pS_SecHeader_Temp = NULL;
      70:      unsigned char *    StrSec_Buffer = NULL;
      71:      SEF_SECHEADER_32 *pS_SecHeader_32_Temp = NULL;
      72:      SEF_SECHEADER_64 *pS_SecHeader_64_Temp = NULL;
      73:      
      74:      if((pbuffer == NULL) || (Handle == NULL))
      75:      {
      76:          ret = -1;
      77:          goto GetOut;
      78:      }
      79:      pS_HeadSet_Temp = (SEF_HEADSET *) Handle;
      80:      pS_HeadSet_Temp->pBuffer = pbuffer;
      81:      if(pS_HeadSet_Temp->pS_ElfHeader == NULL)
      82:      {
      83:          ret = -2;
      84:          goto GetOut;
      85:      }
      86:      pS_ElfHeader_Temp = pS_HeadSet_Temp->pS_ElfHeader;
      87:      pS_SecHeader_Temp = (SEF_SECHEADER *)malloc(sizeof(SEF_SECHEADER));
      88:      if(pS_SecHeader_Temp == NULL)
      89:      {
      90:          ret = -4;
      91:          goto GetOut;
      92:      }
      93:      int nShNum;
      94:      /*start deal 32bits elf file*/
      95:      if(pS_ElfHeader_Temp->nFlag_Bits == ELFCLASS32)
      96:      {
      97:      
      98:      if((nShNum = pS_ElfHeader_Temp->S_ElfHeader_32.e_shnum) < 1)
      99:      {
     100:          pS_HeadSet_Temp->pS_SecHeader = NULL;
     101:          goto GetOut;
     102:      }
     103:      /*create new memory for the SEF_SECHEADER_32 structure*/
     104:      pS_SecHeader_32_Temp = (SEF_SECHEADER_32 *)malloc(nShNum * sizeof(SEF_SECHEADER_32));
     105:      if(pS_SecHeader_32_Temp == NULL)
     106:      {
     107:          ret = -3;
     108:          goto GetOut;
     109:      }
     110:      /*copy section header table from buffer + shoffset*/
     111:      memcpy(pS_SecHeader_32_Temp,
     112:          (pbuffer+pS_ElfHeader_Temp->S_ElfHeader_32.e_shoff),
     113:          (nShNum * (pS_ElfHeader_Temp->S_ElfHeader_32.e_shentsize)));
     114:      if(ByteAdjust_SecTab32(pS_SecHeader_Temp, nShNum, pS_ElfHeader_Temp->nFlag_Data) != 0)
     115:      {
     116:          ret = -8;
     117:          goto GetOut;
     118:      }
     119:   
     120:  }
     121:   
     122:      /*start deal 64bits elf file*/
     123:      else if(pS_ElfHeader_Temp->nFlag_Bits == ELFCLASS64)
     124:      {
     125:      if((nShNum = pS_ElfHeader_Temp->S_ElfHeader_64.e_shnum) < 1)
     126:      {
     127:          pS_HeadSet_Temp->pS_SecHeader = NULL;
     128:          goto GetOut;
     129:      }
     130:   
     131:      pS_SecHeader_64_Temp = (SEF_SECHEADER_64 *)malloc(nShNum * sizeof(SEF_SECHEADER_64));
     132:      if(pS_SecHeader_64_Temp == NULL)
     133:      {
     134:          ret = -3;
     135:          goto GetOut;
     136:      }
     137:      /*copy section header table from buffer + shoffset*/
     138:      memcpy(pS_SecHeader_64_Temp,
     139:          (pbuffer+pS_ElfHeader_Temp->S_ElfHeader_64.e_shoff),
     140:          (nShNum * (pS_ElfHeader_Temp->S_ElfHeader_64.e_shentsize)));
     141:      if(ByteAdjust_SecTab64(pS_SecHeader_Temp, nShNum, pS_ElfHeader_Temp->nFlag_Data) != 0)
     142:      {
     143:          ret = -8;
     144:          goto GetOut;
     145:      }
     146:      }
     147:      pS_SecHeader_Temp->pS_SecHeader_32 = pS_SecHeader_32_Temp;
     148:      pS_SecHeader_Temp->pS_SecHeader_64 = pS_SecHeader_64_Temp;
     149:      pS_HeadSet_Temp->pS_SecHeader = pS_SecHeader_Temp;
     150:  GetOut:
     151:      return ret;
     152:  }
     
    最后附上头文件:elf_analysis.h
       1:  #ifndef _ELF_ANALYSIS_H
       2:  #define _ELF_ANALYSIS_H
       3:  #include<stdio.h>
       4:  #include<stdlib.h>
       5:  #include<string.h>
       6:  #include "../../include/elf_type.h"
       7:  #include "../../include/adt.h"
       8:   
       9:  /*
      10:        function: initialize the handle structer
      11:        input:     the arguments1 pbuffer is a data buffer,and 
      12:                   the arguments2 nsize that is the total bytes of the buffer.
      13:        return:    the arguments3 phandle inclued these data that the user care about.
      14:                   and the return long number is the errorcode:
      15:                        -1           invalid argument
      16:                        -2           alloc memory failed
      17:                        -3           the data inside the buffer not is ELF file
      18:                        0            function operated success
      19:        readme:     no
      20:  */
      21:  long init_elf(char * pbuffer, int nsize,void** phandle);
      22:   
      23:  long ByteAdjust_SegTab32(SEF_PROHEADER *handle, int PhNum,int nFlag_Data);
      24:   
      25:  long ByteAdjust_SegTab64(SEF_PROHEADER *handle, int PhNum,int nFlag_Data);
      26:   
      27:  long init_segtab( unsigned char *pBuffer, void *Handle);
      28:   
      29:  long ByteAdjust_SecTab32(SEF_SECHEADER *handle, int ShNum,int nFlag_Data);
      30:   
      31:  long ByteAdjust_SecTab64(SEF_SECHEADER *handle, int ShNum,int nFlag_Data);
      32:   
      33:  long init_section(unsigned char *pbuffer, void *Handle);
      34:   
      35:  #endif
  • 相关阅读:
    oracle的安装与plsql的环境配置
    Working with MSDTC
    soapui-java.lang.Exception Failed to load url
    Oracle 一个owner访问另一个owner的table,不加owner
    Call API relation to TLS 1.2
    Call API HTTP header Authorization: Basic
    VS2008 .csproj cannot be opened.The project type is not supported by this installat
    The changes couldn't be completed.Please reboot your computer and try again.
    Create DB Table View Procedure
    DB Change
  • 原文地址:https://www.cnblogs.com/hellowolrd-dc/p/3902994.html
Copyright © 2020-2023  润新知