From a88537553434c3d4e54a056c661d586c452d8264 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Wed, 11 Nov 2015 05:52:46 +0900 Subject: [PATCH] * WorkBackup: 2015/11/11(Wed) AM 05:50 (Programming LibGoblin_SymInfo_CreateWorkTable()) --- libgoblin/drd64_libgoblin.h | 1 + libgoblin/drd64_libgoblin_checkbin.c | 1 - libgoblin/drd64_libgoblin_elf.c | 22 ++++++++++++++++-- libgoblin/drd64_libgoblin_elf.h | 8 ++++++- libgoblin/drd64_libgoblin_syminfo.c | 44 ++++++++++++++++++++++++++++-------- libgoblin/drd64_libgoblin_syminfo.h | 4 ++-- 6 files changed, 64 insertions(+), 16 deletions(-) diff --git a/libgoblin/drd64_libgoblin.h b/libgoblin/drd64_libgoblin.h index db8241c..4e5a923 100644 --- a/libgoblin/drd64_libgoblin.h +++ b/libgoblin/drd64_libgoblin.h @@ -39,6 +39,7 @@ Comment: #include #include +#include #include #include #include diff --git a/libgoblin/drd64_libgoblin_checkbin.c b/libgoblin/drd64_libgoblin_checkbin.c index 7b06778..2fa8288 100644 --- a/libgoblin/drd64_libgoblin_checkbin.c +++ b/libgoblin/drd64_libgoblin_checkbin.c @@ -45,7 +45,6 @@ int int i_analyzefid ) { Byte *pb_data; - LibGoblin_BinaryFile *p_bfile; assert( NULL != p_binfo ); pb_data = p_binfo->t_binfile[i_analyzefid].pb_binary; diff --git a/libgoblin/drd64_libgoblin_elf.c b/libgoblin/drd64_libgoblin_elf.c index dfa1f3f..96084fe 100644 --- a/libgoblin/drd64_libgoblin_elf.c +++ b/libgoblin/drd64_libgoblin_elf.c @@ -96,9 +96,27 @@ LIBGOBLIN_ELF_EXTERN LibGoblin_SectionInfo * LibGoblin_Elf_GetSectionInfo( LibGoblin_BinaryInfo *p_binfo, - int i_analyzefid, Byte b_secid ) { + LibGoblin_SectionInfo *p_secinfo; + + if( LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX <= b_secid ) { return NULL; } + + p_secinfo = &(p_binfo->t_section[b_secid]); + + return p_secinfo; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBGOBLIN_ELF_EXTERN +LibGoblin_SectionInfo * + LibGoblin_Elf_GetSectionInfo_fid( + LibGoblin_BinaryInfo *p_binfo, + Byte b_secid, + int i_analyzefid ) +{ LibGoblin_BinaryFile *p_bfile; LibGoblin_SectionInfo *p_secinfo; @@ -107,7 +125,7 @@ LibGoblin_SectionInfo * if( LIBGOBLIN_ELF_SEC_ID_DEFAULT_MAX <= b_secid ) { return NULL; } - p_secinfo = &(p_binfo->t_section[b_secid]); + p_secinfo = &(p_bfile->t_section[b_secid]); return p_secinfo; } diff --git a/libgoblin/drd64_libgoblin_elf.h b/libgoblin/drd64_libgoblin_elf.h index 8007cbe..947b0ca 100644 --- a/libgoblin/drd64_libgoblin_elf.h +++ b/libgoblin/drd64_libgoblin_elf.h @@ -95,8 +95,14 @@ LIBGOBLIN_ELF_EXTERN Byte *LibGoblin_Elf_GetSection( QWord *qw_secsize, LibGoblin_BinaryInfo *p_bin, int i_analyzefid, Byte b_secid ); LIBGOBLIN_ELF_EXTERN + LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo_fid( + LibGoblin_BinaryInfo *p_binfo, Byte b_secid, int i_analyzefid ); +LIBGOBLIN_ELF_EXTERN LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo( - LibGoblin_BinaryInfo *p_binfo, int i_analyzefid, Byte b_secid ); + LibGoblin_BinaryInfo *p_binfo, Byte b_secid ); +LIBGOBLIN_ELF_EXTERN + LibGoblin_SectionInfo *LibGoblin_Elf_GetSectionInfo_fid( + LibGoblin_BinaryInfo *p_binfo, Byte b_secid, int i_analyzefid ); LIBGOBLIN_ELF_EXTERN int LibGoblin_AnalyzeElf( LibGoblin_BinaryInfo *p_binfo, int i_analyzefid ); diff --git a/libgoblin/drd64_libgoblin_syminfo.c b/libgoblin/drd64_libgoblin_syminfo.c index 264173f..eda8a79 100644 --- a/libgoblin/drd64_libgoblin_syminfo.c +++ b/libgoblin/drd64_libgoblin_syminfo.c @@ -56,17 +56,22 @@ DWord int i_analyzefid ) { Byte *pb_symtab; - QWord qw_size; DWord dw_symbols; + DWord dw_sworksz; + DWord dw_cnt; Elf32_Shdr *p_shdr32; Elf64_Shdr *p_shdr64; + Elf32_Sym *p_sym32; + Elf64_Sym *p_sym64; LibGoblin_SectionInfo *p_secinfo; + LibGoblin_SymbolWork *p_symwork; + LibGoblin_SymbolWork *p_swnow; assert( NULL != p_binfo ); // Check BinaryInfo & Get SymbolEntires - // XXX - p_secinfo = LibGoblin_Elf_GetSectionInfo( p_binfo, 0, LIBGOBLIN_ELF_SEC_ID_SYMTAB ); + p_secinfo = LibGoblin_Elf_GetSectionInfo_fid( + p_binfo, LIBGOBLIN_ELF_SEC_ID_SYMTAB, i_analyzefid ); if( NULL == p_secinfo ) { return 0x01; } @@ -79,19 +84,38 @@ DWord dw_symbols = (DWord)p_shdr64->sh_size / (DWord)p_shdr64->sh_entsize; pb_symtab = p_secinfo->pb_data; } - else if( IsBinfoType_Elf32( p_binfo ) ) { - + else { + p_shdr32 = (Elf32_Shdr *)(p_secinfo->pb_sechdr); + if( 0 == p_shdr32->sh_entsize ) { + return -0x02; + } + dw_symbols = (DWord)p_shdr32->sh_size / (DWord)p_shdr32->sh_entsize; + pb_symtab = p_secinfo->pb_data; } - // Create WorkTable + // Create & Alloc SymbolWorkTable + dw_sworksz = dw_symbols * sizeof( LibGoblin_SymbolWork ); + p_symwork = (LibGoblin_SymbolWork *)malloc( dw_sworksz ); + if( NULL == p_symwork ) { + return -0x03; + } + memset( p_symwork, 0x00, dw_sworksz ); - // Sort WorkTable + // Read SymbolSection to SymbolWorkTable + p_swnow = p_symwork; + if( IsBinfoType_Elf64( p_binfo ) ) { + p_sym64 = (Elf64_Sym *)pb_symtab; - // Create SymbolTable + for( dw_cnt = 0; dw_cnt < dw_symbols; dw_cnt++ ) { + p_swnow->pb_symbol = (Byte *)p_sym64; + p_swnow->ptr_address = p_sym64->st_value; - // Update Symbol Table + p_sym64++; + p_swnow++; + } + } - // Create SymbolTable Index + // Sort WorkTable return 0x00; } diff --git a/libgoblin/drd64_libgoblin_syminfo.h b/libgoblin/drd64_libgoblin_syminfo.h index 085eb7c..bee78ea 100644 --- a/libgoblin/drd64_libgoblin_syminfo.h +++ b/libgoblin/drd64_libgoblin_syminfo.h @@ -48,8 +48,8 @@ Comment: typedef struct { - Ptr *p_address; - Ptr *p_symbol; + Ptr ptr_address; + Byte *pb_symbol; } LibGoblin_SymbolWork; -- 2.11.0