From 0e47d1269cc660d2b1451e76375b2d3545ce66f4 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 29 Oct 2022 22:32:47 +0200 Subject: Malloc override (#437) * Add some malloc override mecanism, but missing c++ function overriding * Add c++ new/delete redirection too * Added support for libtbbmalloc_proxy --- src/elfs/elfloader.c | 44 +++++++++----------------------------------- 1 file changed, 9 insertions(+), 35 deletions(-) (limited to 'src/elfs') diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index f93ce1df..35a7d3a2 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -54,7 +54,7 @@ elfheader_t* LoadAndCheckElfHeader(FILE* f, const char* name, int exec) if(!h) return NULL; - if ((h->path = realpath(name, NULL)) == NULL) { + if ((h->path = box_realpath(name, NULL)) == NULL) { h->path = (char*)box_malloc(1); h->path[0] = '\0'; } @@ -821,6 +821,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, elfheader_t } return bindnow?ret_ok:0; } +void checkHookedSymbols(lib_t *maplib, elfheader_t* h); // in mallochook.c int RelocateElf(lib_t *maplib, lib_t *local_maplib, int bindnow, elfheader_t* head) { if(head->rel) { @@ -837,7 +838,7 @@ int RelocateElf(lib_t *maplib, lib_t *local_maplib, int bindnow, elfheader_t* he if(RelocateElfRELA(maplib, local_maplib, bindnow, head, cnt, (Elf64_Rela *)(head->rela + head->delta), NULL)) return -1; } - + checkHookedSymbols(maplib, head); return 0; } @@ -945,22 +946,6 @@ uintptr_t GetLastByte(elfheader_t* h) void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* weaksymbols, kh_mapsymbols_t* localsymbols, elfheader_t* h) { if(box64_dump && h->DynSym) DumpDynSym(h); - int libcef = (strstr(h->name, "libcef.so"))?1:0; - //libcef.so is linked with tcmalloc staticaly, but this cannot be easily supported in box64, so hacking some "unlink" here - const char* avoid_libcef[] = {"malloc", "realloc", "free", "calloc", "cfree", - "__libc_malloc", "__libc_calloc", "__libc_free", "__libc_memallign", "__libc_pvalloc", - "__libc_realloc", "__libc_valloc", "__posix_memalign", - "valloc", "pvalloc", "posix_memalign", "malloc_stats", "malloc_usable_size", - /*"mallopt",*/ "localtime_r", - //c++ symbol from libstdc++ too - //"_ZnwmRKSt9nothrow_t", "_ZdaPv", // operator new(unsigned long, std::nothrow_t const&), operator delete[](void*) - //"_Znwm", "_ZdlPv", "_Znam", // operator new(unsigned long), operator delete(void*), operator new[](unsigned long) - //"_ZnwmSt11align_val_t", "_ZnwmSt11align_val_tRKSt9nothrow_t", // operator new(unsigned long, std::align_val_t) - //"_ZnamSt11align_val_t", "_ZnamSt11align_val_tRKSt9nothrow_t", // operator new[](unsigned long, std::align_val_t) - //"_ZdlPvRKSt9nothrow_t", "_ZdaPvSt11align_val_tRKSt9nothrow_t", // more delete operators - //"_ZdlPvmSt11align_val_t", "_ZdaPvRKSt9nothrow_t", - //"_ZdaPvSt11align_val_t", "_ZdlPvSt11align_val_t", - }; printf_dump(LOG_NEVER, "Will look for Symbol to add in SymTable(%zu)\n", h->numSymTab); for (size_t i=0; inumSymTab; ++i) { const char * symname = h->StrTab+h->SymTab[i].st_name; @@ -994,13 +979,6 @@ void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* wea } } else { int to_add = 1; - if(libcef) { - if(strstr(symname, "_Zn")==symname || strstr(symname, "_Zd")==symname) - to_add = 0; - for(int j=0; jSymTab[i].st_value:(h->SymTab[i].st_value + h->delta); @@ -1036,13 +1014,6 @@ void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* wea printf_dump(LOG_NEVER, "Adding Default Version \"%s\" for Symbol\"%s\"\n", vername, symname); } int to_add = 1; - if(libcef) { - if(strstr(symname, "_Zn")==symname || strstr(symname, "_Zd")==symname) - to_add = 0; - for(int j=0; jinit_done = 1; +} void RunElfInit(elfheader_t* h, x64emu_t *emu) { if(!h || h->init_done) @@ -1209,6 +1183,7 @@ void RunElfInit(elfheader_t* h, x64emu_t *emu) return; } printf_log(LOG_DEBUG, "Calling Init for %s @%p\n", ElfName(h), (void*)p); + h->init_done = 1; if(h->initentry) RunFunctionWithEmu(emu, 0, p, 3, context->argc, context->argv, context->envv); printf_log(LOG_DEBUG, "Done Init for %s\n", ElfName(h)); @@ -1221,7 +1196,6 @@ void RunElfInit(elfheader_t* h, x64emu_t *emu) } } - h->init_done = 1; h->fini_done = 0; // can be fini'd now (in case it was re-inited) printf_log(LOG_DEBUG, "All Init Done for %s\n", ElfName(h)); return; -- cgit 1.4.1