只是解析字符串节,不是符号表
#include "ElfParser.h"
u1* get_elf_section_of_shstr_table(MemMapping* mem,Elf32_Ehdr* pHeader,Elf32_Shdr* pSheader){
u1* stringTableMem = NULL;
stringTableMem = calloc(1,pSheader[pHeader->e_shstrndx].sh_size);
if(NULL == stringTableMem){
perror("Error,calloc string table mem failed");
goto bail;
}
memcpy(stringTableMem,(mem->base + pSheader[pHeader->e_shstrndx].sh_offset),pSheader[pHeader->e_shstrndx].sh_size);
bail:
return stringTableMem;
}
void print_elf_string_table(MemMapping* mem,Elf32_Ehdr* pHeader,Elf32_Shdr* pSheader){
printf("String table:\n");
u1* stringTableMem = NULL;
u4 i = 0;
u4 size = 0;
u1* shStringTableMem = get_elf_section_of_shstr_table(mem,pHeader,pSheader);
if(NULL == shStringTableMem){
printf("Error,get elf section header string table failed !\n");
return;
}
for( ; i < pHeader->e_shnum ; i++){
if(pSheader[i].sh_type == SHT_STRTAB && strcmp((const char*)(shStringTableMem + pSheader[i].sh_name),".strtab") == 0){
size = pSheader[i].sh_size;
stringTableMem = (mem->base + pSheader[i].sh_offset);
break;
}
continue;
}
if(NULL != stringTableMem){
i = 0;
u4 j = 0;
for( ; i < size ; i++ ){
printf("[%-3u] ",j);
printf("%s\n",(stringTableMem + i));
i += strlen((char*)(stringTableMem + i));
j++;
}
}
if(shStringTableMem)
free(shStringTableMem);
}
void print_elf_interpreter(MemMapping* mem,Elf32_Ehdr* pHeader,Elf32_Shdr* pSheader){
printf("Interpreter:\n");
u1* pInterpMem = NULL;
u4 i = 0;
u4 size = 0;
u1* shStringTableMem = get_elf_section_of_shstr_table(mem,pHeader,pSheader);
if(NULL == shStringTableMem){
printf("Error,get elf section header string table failed !\n");
return;
}
for( ; i < pHeader->e_shnum ; i++){
if(pSheader[i].sh_type == SHT_PROGBITS && strcmp((const char*)(shStringTableMem + pSheader[i].sh_name),".interp") == 0){
size = pSheader[i].sh_size;
pInterpMem = (mem->base + pSheader[i].sh_offset);
break;
}
continue;
}
if(NULL != pInterpMem){
i = 0;
u4 j = 0;
for( ; i < size ; i++ ){
printf("[%-3u] ",j);
printf("%s\n",(pInterpMem + i));
i += strlen((char*)(pInterpMem + i));
j++;
}
}
if(shStringTableMem)
free(shStringTableMem);
}
void print_elf_dynamic_string_table(MemMapping* mem,Elf32_Ehdr* pHeader,Elf32_Shdr* pSheader){
printf("Dynamic string table:\n");
u1* pDynStrMem = NULL;
u4 i = 0;
u4 size = 0;
u1* shStringTableMem = get_elf_section_of_shstr_table(mem,pHeader,pSheader);
if(NULL == shStringTableMem){
printf("Error,get elf section header string table failed !\n");
return;
}
for( ; i < pHeader->e_shnum ; i++){
if(pSheader[i].sh_type == SHT_STRTAB && strcmp((const char*)(shStringTableMem + pSheader[i].sh_name),".dynstr") == 0){
size = pSheader[i].sh_size;
pDynStrMem = (mem->base + pSheader[i].sh_offset);
break;
}
continue;
}
if(NULL != pDynStrMem){
i = 0;
u4 j = 0;
for( ; i < size ; i++ ){
printf("[%-3u] ",j);
printf("%s\n",(pDynStrMem + i));
i += strlen((char*)(pDynStrMem + i));
j++;
}
}
if(shStringTableMem)
free(shStringTableMem);
}