LIBGOBLIN_FUNC
int
- LibGoblin_AnalyzeBinary(
+ LibGoblin_AnalyzeBinaryMemory(
Byte *p_data,
DWord dw_size );
+LIBGOBLIN_FUNC
+int
+ LibGoblin_AnalyzeBinaryFile(
+ char *pstr_filepath );
+
#endif /* DRD64_HEADER_LIBGOBLIN */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
+#include<fcntl.h>
+#include<unistd.h>
#include<assert.h>
#include<elf.h>
+#include<sys/stat.h>
+#include<sys/mman.h>
#include"../include/drd64_types.h"
#include"../include/drd64_defines.h"
#include"../include/drd64_error.h"
#include"drd64_libgoblin.h"
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
LIBGOBLIN_FUNC
int
- LibGoblin_AnalyzeBinary(
+ LibGoblin_AnalyzeBinaryFile(
+ char *pstr_filepath )
+{
+ int i_bid;
+ int i_bintype;
+ int i_err;
+ int i_fd;
+ struct stat t_sb;
+ Byte *p_head;
+ LibGoblin_BinaryInfo *p_bin;
+
+ /* Alloc BinaryInfo Struct */
+ p_bin = LibDrd64_BinInfo_AllocBinInfo();
+ if( NULL == p_bin ) {
+ i_bid = -1;
+ goto goto_LibGoblin_AnalyzeBinaryFile_err;
+ }
+ i_bid = p_bin->i_id;
+
+ /* Open Test LM */
+ i_fd = open( pstr_filepath, O_RDONLY );
+ if( -1 == i_fd ) {
+ i_bid = -2;
+ LibGoblin_FreeBinaryInfo( p_bin );
+ goto goto_LibGoblin_AnalyzeBinaryFile_err;
+ }
+ p_bin->i_fd = i_fd;
+ strncpy( p_bin->str_filepath, pstr_filepath, DRD64_MAX_PATH );
+
+ /* Get FileSize */
+ i_err = fstat( i_fd, &t_sb );
+ if( -1 == i_err ) {
+ i_bid = -2;
+ close( i_fd );
+ LibGoblin_FreeBinaryInfo( p_bin );
+ goto goto_LibGoblin_AnalyzeBinaryFile_err;
+ }
+
+ p_head = mmap( NULL, t_sb.st_size, PROT_READ, MAP_SHARED, i_fd, 0 );
+ if( MAP_FAILED == p_head ) {
+ i_bid = -3;
+ close( i_fd );
+ LibGoblin_FreeBinaryInfo( p_bin );
+ goto goto_LibGoblin_AnalyzeBinaryFile_err;
+ }
+
+ p_bin->p_binary = p_head;
+ p_bin->dw_size = (DWord)t_sb.st_size;
+
+ LibGoblin_AnalyzeBinary( p_bin );
+
+
+goto_LibGoblin_AnalyzeBinaryFile_err:
+
+ return i_bid;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_FUNC
+int
+ LibGoblin_AnalyzeBinaryMemory(
Byte *p_data,
DWord dw_size )
{
int i_bid;
int i_bintype;
- int i_err;
+ int i_result;
LibGoblin_BinaryInfo *p_bin;
/* Alloc BinaryInfo Struct */
p_bin->p_binary = p_data;
p_bin->dw_size = dw_size;
+ i_result = LibGoblin_AnalyzeBinary( p_bin );
+
+ return i_bid;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_ANALYZE_EXTERN
+int
+ LibGoblin_AnalyzeBinary(
+ LibGoblin_BinaryInfo *p_bin )
+{
+ int i_result;
+ int i_bintype;
+
/* Check Binary Format */
i_bintype = LibGoblin_CheckBinary( p_bin );
if( LIBGOBLIN_BINFO_TYPE_ELF == i_bintype ) {
/* Analyze ELF-Binary Format */
- LibGoblin_AnalyzeElf( p_bin );
+ i_result = LibGoblin_AnalyzeElf( p_bin );
/* Analyze DWARF-Debug Format */
} else {
}
- return i_bid;
+ return i_result;
}
+
/* EOF of drd64_.c ----------------------------------- */
#define LIBGOBLIN_ANALYZE_EXTERN extern
#endif
+LIBGOBLIN_ANALYZE_EXTERN
+int
+ LibGoblin_AnalyzeBinary(
+ LibGoblin_BinaryInfo *p_bin );
+
#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
memset( p_binfo_now, 0x00, sizeof( LibGoblin_BinaryInfo ) );
p_binfo_now->i_id = i_id_now;
+ p_binfo_now->i_fd = -1;
return p_binfo_now;
}
p_binfo->p_format = NULL;
}
+ if( -1 != p_binfo->i_fd ) {
+ munmap( p_binfo->p_binary, p_binfo->dw_size );
+ p_binfo->i_fd = 0;
+ }
+
memset( p_binfo, 0x00, sizeof( LibGoblin_BinaryInfo ) );
p_binfo->i_id = -1;
LibGoblin_TermBinaryInfo(
void )
{
+ LibGoblin_BinaryInfo *p_bin;
+
+ if( gi_now_binary_info > 0 ) {
+ for( ; gi_now_binary_info >= 0; gi_now_binary_info-- ) {
+ p_bin = LibGoblin_BInfo_GetBinaryInfo( gi_now_binary_info );
+ LibGoblin_FreeBinaryInfo( p_bin );
+ }
+ }
+
+
free( gp_binary_info );
gp_binary_info = NULL;
#define LIBGOBLIN_BINFO_ENDIAN_LITTLE 0x01
#define LIBGOBLIN_BINFO_ENDIAN_BIG 0x02
+#define LIBGOBLIN_BINFO_SECTION_TEXT 0x00
+#define LIBGOBLIN_BINFO_SECTION_DATA 0x01
+#define LIBGOBLIN_BINFO_SECTION_BSS 0x02
+
+
typedef struct {
int i_id;
+ int i_fd;
+ char str_filepath[DRD64_MAX_PATH];
+
DWord dw_size;
Byte *p_binary;
void *p_format;
-} LibGoblin_BinaryInfo;
+} LibGoblin_BinaryInfo;
int i_err;
Byte *p_data;
LibGoblin_BinaryInfo_Elf64 *p_elf;
+ Elf64_Ehdr *p_elfhdr;
assert( NULL != p_bin );
assert( NULL != p_bin->p_format );
p_elf = (LibGoblin_BinaryInfo_Elf64 *)p_bin->p_format;
-
- p_elf->p_elfhdr = (Elf64_Ehdr *)p_data;
+ /* Set ELF64 Header */
+ p_elfhdr = (Elf64_Ehdr *)p_data;
+ memcpy( &(p_elf->elf_elfhdr), p_elfhdr, p_elfhdr->e_ehsize );
+
+ /* Read & Analyze Section Header */
+
puts("OK");
#define LIBGOBLIN_ELF64_EXTERN extern
#endif
+
+
typedef struct {
- Elf64_Ehdr *p_elfhdr;
+ Elf64_Ehdr elf_elfhdr;
+ //Elf64_Ehdr *p_elfhdr;
Elf64_Shdr *p_sechdr;
+ Byte *p_seciton[10];
+
} LibGoblin_BinaryInfo_Elf64;
unsigned char *p_head;
/* Open Test LM */
- i_fd = open( "test", O_RDONLY );
+ /*i_fd = open( "test", O_RDONLY );
if( -1 == i_fd ) { return 0x01; }
i_err = fstat( i_fd, &t_sb );
p_head = mmap( NULL, t_sb.st_size, PROT_READ, MAP_SHARED, i_fd, 0 );
if( MAP_FAILED == p_head ) { goto goto_main_err; }
-
+*/
LibGoblin_Init();
- LibGoblin_AnalyzeBinary( p_head, t_sb.st_size );
+ LibGoblin_AnalyzeBinaryFile( "test" );
LibGoblin_Term();
- i_err = munmap( p_head, t_sb.st_size );
goto_main_err:
close( i_fd );