From 7ca84ba3f79e13df30759717289789dcdf180788 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Mon, 9 Nov 2015 05:40:17 +0900 Subject: [PATCH] * WorkBackup: 2015/11/09 (Mon) AM 05:39 --- libgoblin/drd64_libgoblin_elf.c | 25 +++++++++++++- libgoblin/drd64_libgoblin_elf.h | 3 ++ libgoblin/drd64_libgoblin_elf64.c | 6 ++-- libgoblin/drd64_libgoblin_syminfo.c | 68 +++++++++++++++++++++++++++++++++++++ libgoblin/drd64_libgoblin_type.h | 4 +-- 5 files changed, 100 insertions(+), 6 deletions(-) diff --git a/libgoblin/drd64_libgoblin_elf.c b/libgoblin/drd64_libgoblin_elf.c index 82fd688..dfa1f3f 100644 --- a/libgoblin/drd64_libgoblin_elf.c +++ b/libgoblin/drd64_libgoblin_elf.c @@ -69,7 +69,7 @@ Byte * { Byte *pb_data; LibGoblin_BinaryFile *p_bfile; - LibGoblin_SectionTable *p_sectbl; + LibGoblin_SectionInfo *p_sectbl; assert( NULL != p_binfo ); p_bfile = &(p_binfo->t_binfile[ i_analyzefid ]); @@ -93,6 +93,29 @@ Byte * /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ LIBGOBLIN_ELF_EXTERN +LibGoblin_SectionInfo * + LibGoblin_Elf_GetSectionInfo( + LibGoblin_BinaryInfo *p_binfo, + int i_analyzefid, + Byte b_secid ) +{ + LibGoblin_BinaryFile *p_bfile; + LibGoblin_SectionInfo *p_secinfo; + + assert( NULL != p_binfo ); + p_bfile = &(p_binfo->t_binfile[ i_analyzefid ]); + + 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 int LibGoblin_AnalyzeElf( LibGoblin_BinaryInfo *p_binfo, diff --git a/libgoblin/drd64_libgoblin_elf.h b/libgoblin/drd64_libgoblin_elf.h index e26373b..8007cbe 100644 --- a/libgoblin/drd64_libgoblin_elf.h +++ b/libgoblin/drd64_libgoblin_elf.h @@ -95,6 +95,9 @@ 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( + LibGoblin_BinaryInfo *p_binfo, int i_analyzefid, Byte b_secid ); +LIBGOBLIN_ELF_EXTERN int LibGoblin_AnalyzeElf( LibGoblin_BinaryInfo *p_binfo, int i_analyzefid ); diff --git a/libgoblin/drd64_libgoblin_elf64.c b/libgoblin/drd64_libgoblin_elf64.c index fe45ee0..f7533c9 100644 --- a/libgoblin/drd64_libgoblin_elf64.c +++ b/libgoblin/drd64_libgoblin_elf64.c @@ -41,7 +41,7 @@ Comment: /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ int - LibGoblin_Elf64_SetSectionTable( + LibGoblin_Elf64_SetSectionInfo( LibGoblin_BinaryInfo *p_binfo, int i_analyzefid ) { @@ -54,7 +54,7 @@ int Elf64_Ehdr *p_elfhdr; Elf64_Shdr *p_sechdr; Elf64_Shdr *p_secstrhdr; - LibGoblin_SectionTable *p_sectbl; + LibGoblin_SectionInfo *p_sectbl; assert( NULL != p_binfo ); pb_data = p_binfo->t_binfile[i_analyzefid].pb_binary; @@ -125,7 +125,7 @@ int assert( NULL != pb_data ); /* Read & Analyze Section Header */ - LibGoblin_Elf64_SetSectionTable( p_binfo, i_analyzefid ); + LibGoblin_Elf64_SetSectionInfo( p_binfo, i_analyzefid ); return 0x00; } diff --git a/libgoblin/drd64_libgoblin_syminfo.c b/libgoblin/drd64_libgoblin_syminfo.c index bab7822..b9df5f8 100644 --- a/libgoblin/drd64_libgoblin_syminfo.c +++ b/libgoblin/drd64_libgoblin_syminfo.c @@ -37,6 +37,74 @@ Comment: #define DRD64_SRC_LIBGOBLIN_SYMINFO #include"drd64_libgoblin.h" +/*---------------------------------------------------------------------- + Create (Read SymbolSection) + CreateWorkTable + FindSymAddr + FindSymName + UpdateSymInfo + AddSymInfo + Free +----------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBGOBLIN_SYMINFO_EXTERN +int + LibGoblin_SymInfo_Create( + LibGoblin_BinaryInfo *p_binfo ) +{ + Byte *pb_symtab; + QWord qw_size; + DWord dw_symbols; + Elf32_Shdr *p_shdr32; + Elf64_Shdr *p_shdr64; + LibGoblin_SectionInfo *p_secinfo; + + assert( NULL != p_binfo ); + + // Check BinaryInfo & Get SymbolEntires + p_secinfo = LibGoblin_Elf_GetSectionInfo( p_binfo, 0, LIBGOBLIN_ELF_SEC_ID_SYMTAB ); + if( NULL == p_secinfo ) { + return 0x01; + } + + if( IsBinfoType_Elf64( p_binfo ) ) { + p_shdr64 = (Elf64_Shdr *)(p_secinfo->pb_sechdr); + if( 0 == p_shdr64->sh_entsize ) { + return -0x02; + } + dw_symbols = (DWord)p_shdr64->sh_size / (DWord)p_shdr64->sh_entsize; + pb_symtab = p_secinfo->pb_data; + } + else if( IsBinfoType_Elf32( p_binfo ) ) { + + } + + // Create WorkTable + + // Sort WorkTable + + // Create SymbolTable + + // Update Symbol Table + + // Create SymbolTable Index + + return 0x00; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBGOBLIN_SYMINFO_EXTERN +int + LibGoblin_SymInfo_Free( + LibGoblin_BinaryInfo *p_binfo ) +{ + return 0x00; +} + /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index 9f4c527..2afd8e3 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -171,7 +171,7 @@ typedef struct { char *pstr_secname; QWord qw_size; int i_fid; -} LibGoblin_SectionTable; +} LibGoblin_SectionInfo; /*=====================================================================*/ typedef struct { @@ -193,7 +193,7 @@ typedef struct { /* Binary-Format Depending Info. (ELF)*/ //void *p_format; - LibGoblin_SectionTable t_section[LIBGOBLIN_ELF_SEC_ID_MAX]; + LibGoblin_SectionInfo t_section[LIBGOBLIN_ELF_SEC_ID_MAX]; } LibGoblin_BinaryInfo; -- 2.11.0