diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-08-17 12:24:26 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-08-17 12:24:26 +0200 |
| commit | fa87b0fcef3dff593a507b3200ef83d846101d64 (patch) | |
| tree | 66894b342323cf40892b43d6f92bc8793c792489 /src/mallochook.c | |
| parent | 0f1bce0f32a8429fc414f92cb6b85ff0d30b5d8f (diff) | |
| download | box64-fa87b0fcef3dff593a507b3200ef83d846101d64.tar.gz box64-fa87b0fcef3dff593a507b3200ef83d846101d64.zip | |
[BOX32] prepare elfheader_t structure for 32bits elfs
Diffstat (limited to 'src/mallochook.c')
| -rw-r--r-- | src/mallochook.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/src/mallochook.c b/src/mallochook.c index f63a85bd..abdadc8d 100644 --- a/src/mallochook.c +++ b/src/mallochook.c @@ -776,11 +776,15 @@ void checkHookedSymbols(elfheader_t* h) int hooked_symtab = 0; if(box64_malloc_hack==1) return; + if(box64_is32bits) { + /* TODO? */ + return; + } for (size_t i=0; i<h->numSymTab; ++i) { - int type = ELF64_ST_TYPE(h->SymTab[i].st_info); - int sz = ELF64_ST_TYPE(h->SymTab[i].st_size); - if((type==STT_FUNC) && sz && (h->SymTab[i].st_shndx!=0 && h->SymTab[i].st_shndx<=65521)) { - const char * symname = h->StrTab+h->SymTab[i].st_name; + int type = ELF64_ST_TYPE(h->SymTab._64[i].st_info); + int sz = ELF64_ST_TYPE(h->SymTab._64[i].st_size); + if((type==STT_FUNC) && sz && (h->SymTab._64[i].st_shndx!=0 && h->SymTab._64[i].st_shndx<=65521)) { + const char * symname = h->StrTab+h->SymTab._64[i].st_name; #define GO(A, B) if(!strcmp(symname, #A)) ++hooked; else if(!strcmp(symname, "__libc_" #A)) ++hooked; #define GO2(A, B) SUPER() @@ -790,14 +794,14 @@ void checkHookedSymbols(elfheader_t* h) } if(hooked<2) { for (size_t i=0; i<h->numDynSym && hooked<2; ++i) { - const char * symname = h->DynStr+h->DynSym[i].st_name; - int bind = ELF64_ST_BIND(h->DynSym[i].st_info); - int type = ELF64_ST_TYPE(h->DynSym[i].st_info); - int vis = h->DynSym[i].st_other&0x3; + const char * symname = h->DynStr+h->DynSym._64[i].st_name; + int bind = ELF64_ST_BIND(h->DynSym._64[i].st_info); + int type = ELF64_ST_TYPE(h->DynSym._64[i].st_info); + int vis = h->DynSym._64[i].st_other&0x3; if((type==STT_FUNC) - && (vis==STV_DEFAULT || vis==STV_PROTECTED) && (h->DynSym[i].st_shndx!=0 && h->DynSym[i].st_shndx<=65521)) { - uintptr_t offs = h->DynSym[i].st_value + h->delta; - size_t sz = h->DynSym[i].st_size; + && (vis==STV_DEFAULT || vis==STV_PROTECTED) && (h->DynSym._64[i].st_shndx!=0 && h->DynSym._64[i].st_shndx<=65521)) { + uintptr_t offs = h->DynSym._64[i].st_value + h->delta; + size_t sz = h->DynSym._64[i].st_size; if(bind!=STB_LOCAL && bind!=STB_WEAK && sz>=sizeof(reloc_jmp_t)) { #define GO(A, B) if(!strcmp(symname, #A)) ++hooked; else if(!strcmp(symname, "__libc_" #A)) ++hooked; #define GO2(A, B) @@ -814,11 +818,11 @@ void checkHookedSymbols(elfheader_t* h) printf_log(LOG_INFO, "Redirecting overridden malloc%s from %s function for %s\n", malloc_hack_2?" with hack":"", hooked_symtab?"symtab":"dynsym", ElfName(h)); if(hooked_symtab) { for (size_t i=0; i<h->numSymTab; ++i) { - int type = ELF64_ST_TYPE(h->SymTab[i].st_info); + int type = ELF64_ST_TYPE(h->SymTab._64[i].st_info); if(type==STT_FUNC) { - const char * symname = h->StrTab+h->SymTab[i].st_name; - uintptr_t offs = h->SymTab[i].st_value + h->delta; - size_t sz = h->SymTab[i].st_size; + const char * symname = h->StrTab+h->SymTab._64[i].st_name; + uintptr_t offs = h->SymTab._64[i].st_value + h->delta; + size_t sz = h->SymTab._64[i].st_size; #define GO(A, B) if(!strcmp(symname, "__libc_" #A)) {uintptr_t alt = AddCheckBridge(my_context->system, B, A, 0, #A); printf_log(LOG_DEBUG, "Redirecting %s function from %p (%s)\n", symname, (void*)offs, ElfName(h)); addRelocJmp((void*)offs, (void*)alt, sz, "__libc_" #A, h, NULL);} #define GO2(A, B) SUPER() @@ -833,14 +837,14 @@ void checkHookedSymbols(elfheader_t* h) } } else { for (size_t i=0; i<h->numDynSym; ++i) { - const char * symname = h->DynStr+h->DynSym[i].st_name; - int bind = ELF64_ST_BIND(h->DynSym[i].st_info); - int type = ELF64_ST_TYPE(h->DynSym[i].st_info); - int vis = h->DynSym[i].st_other&0x3; + const char * symname = h->DynStr+h->DynSym._64[i].st_name; + int bind = ELF64_ST_BIND(h->DynSym._64[i].st_info); + int type = ELF64_ST_TYPE(h->DynSym._64[i].st_info); + int vis = h->DynSym._64[i].st_other&0x3; if((type==STT_FUNC) - && (vis==STV_DEFAULT || vis==STV_PROTECTED) && (h->DynSym[i].st_shndx!=0 && h->DynSym[i].st_shndx<=65521)) { - uintptr_t offs = h->DynSym[i].st_value + h->delta; - size_t sz = h->DynSym[i].st_size; + && (vis==STV_DEFAULT || vis==STV_PROTECTED) && (h->DynSym._64[i].st_shndx!=0 && h->DynSym._64[i].st_shndx<=65521)) { + uintptr_t offs = h->DynSym._64[i].st_value + h->delta; + size_t sz = h->DynSym._64[i].st_size; if(bind!=STB_LOCAL && bind!=STB_WEAK) { #define GO(A, B) if(!strcmp(symname, "__libc_" #A)) {uintptr_t alt = AddCheckBridge(my_context->system, B, A, 0, #A); printf_log(LOG_DEBUG, "Redirecting %s function from %p (%s)\n", symname, (void*)offs, ElfName(h)); addRelocJmp((void*)offs, (void*)alt, sz, "__libc_" #A, h, NULL);} #define GO2(A, B) |