diff options
Diffstat (limited to 'src/object/mdso_objgen_symentry.c')
-rw-r--r-- | src/object/mdso_objgen_symentry.c | 94 |
1 files changed, 82 insertions, 12 deletions
diff --git a/src/object/mdso_objgen_symentry.c b/src/object/mdso_objgen_symentry.c index b3a8e90..9303a1e 100644 --- a/src/object/mdso_objgen_symentry.c +++ b/src/object/mdso_objgen_symentry.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2021 Z. Gilboa */ +/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ @@ -18,6 +18,11 @@ #include "perk_consts.h" #include "perk_structs.h" +struct pe_raw_coff_strtbl_impl { + unsigned char cst_size [0x04]; + unsigned char cst_data [0x10]; +}; + struct mdso_symfn_refs { unsigned char refs[16]; }; @@ -28,9 +33,68 @@ struct mdso_symentry_object { struct mdso_symfn_refs ref[1]; struct pe_raw_coff_reloc rel[2]; struct pe_raw_coff_symbol sym[9]; - struct pe_raw_coff_strtbl cst; + struct pe_raw_coff_strtbl_impl cst; }; +static void mdso_obj_write_secoff(unsigned char * ch, uint64_t secoff) +{ + *ch++ = '/'; + mdso_obj_write_dec(ch,secoff); +} + +static void mdso_obj_write_sym_symentry(char * ch, const char * sym) +{ + *ch++ = '.'; + + for (; *sym; ) + *ch++ = *sym++; + + memcpy(ch,"_symentry.s",11); +} + +static void mdso_obj_write_sym_symstr(char * ch, const char * sym) +{ + memcpy(ch,".symstr_",8); + ch = &ch[8]; + + for (; *sym; ) + *ch++ = *sym++; +} + +static void mdso_obj_write_sym_impstr(char * ch, uint32_t uscore, const char * sym) +{ + memcpy(ch,"__imp_",6); + ch = &ch[6]; + + if (uscore) + *ch++ = '_'; + + for (; *sym; ) + *ch++ = *sym++; +} + +static void mdso_obj_write_sym_secstr(char * ch, const char * secname, const char * sym) +{ + for (; *secname; ) + *ch++ = *secname++; + + *ch++ = '$'; + + for (; *sym; ) + *ch++ = *sym++; +} + +static void mdso_obj_write_libname(char * ch, const char * secname, const char * sym) +{ + for (; *secname; ) + *ch++ = *secname++; + + *ch++ = '_'; + + for (; *sym; ) + *ch++ = *sym++; +} + int mdso_objgen_symentry( const struct mdso_driver_ctx * dctx, const char * sym, @@ -42,6 +106,7 @@ int mdso_objgen_symentry( void * mark; char * ch; char * strtbl; + const char * src; struct pe_raw_aux_rec_section * aux; size_t liblen; uint32_t symlen; @@ -147,13 +212,13 @@ int mdso_objgen_symentry( mdso_obj_write_short(syment->hdr.cfh_characteristics,oattr); /* .dsostrs section header */ - sprintf((char *)syment->sec[0].sh_name,"/%d",stroff_dsostrs); + mdso_obj_write_secoff(syment->sec[0].sh_name,stroff_dsostrs); mdso_obj_write_long(syment->sec[0].sh_size_of_raw_data,symlen+1); mdso_obj_write_long(syment->sec[0].sh_ptr_to_raw_data,stroff); mdso_obj_write_long(syment->sec[0].sh_characteristics,sattr); /* .dsosyms section header */ - sprintf((char *)syment->sec[1].sh_name,"/%d",stroff_dsosyms); + mdso_obj_write_secoff(syment->sec[1].sh_name,stroff_dsosyms); mdso_obj_write_long(syment->sec[1].sh_size_of_raw_data,2*relrva); mdso_obj_write_long(syment->sec[1].sh_ptr_to_raw_data,refoff); mdso_obj_write_long(syment->sec[1].sh_ptr_to_relocs,reloff); @@ -186,7 +251,7 @@ int mdso_objgen_symentry( mdso_obj_write_long(&symrec[1].cs_name[4],stroff_file); memcpy(symrec[0].cs_name,".file",5); - sprintf(&strtbl[stroff_file],".%s_symentry.s",sym); + mdso_obj_write_sym_symentry(&strtbl[stroff_file],sym); symrec += 2; @@ -196,7 +261,7 @@ int mdso_objgen_symentry( mdso_obj_write_short(symrec[0].cs_section_number,1); mdso_obj_write_long(&symrec[0].cs_name[4],stroff_dsostrs); - sprintf(&strtbl[stroff_dsostrs],"%s$%s",MDSO_STRS_SECTION,sym); + mdso_obj_write_sym_secstr(&strtbl[stroff_dsostrs],MDSO_STRS_SECTION,sym); aux = (struct pe_raw_aux_rec_section *)&symrec[1]; mdso_obj_write_long(aux->aux_size,symlen+1); @@ -210,7 +275,7 @@ int mdso_objgen_symentry( mdso_obj_write_short(symrec[0].cs_section_number,2); mdso_obj_write_long(&symrec[0].cs_name[4],stroff_dsosyms); - sprintf(&strtbl[stroff_dsosyms],"%s$%s",MDSO_SYMS_SECTION,sym); + mdso_obj_write_sym_secstr(&strtbl[stroff_dsosyms],MDSO_SYMS_SECTION,sym); aux = (struct pe_raw_aux_rec_section *)&symrec[1]; mdso_obj_write_long(aux->aux_size,2*relrva); @@ -224,7 +289,7 @@ int mdso_objgen_symentry( mdso_obj_write_short(symrec[0].cs_section_number,1); mdso_obj_write_long(&symrec[0].cs_name[4],stroff_symstr); - sprintf(&strtbl[stroff_symstr],".symstr_%s",sym); + mdso_obj_write_sym_symstr(&strtbl[stroff_symstr],sym); symrec += 1; @@ -234,13 +299,18 @@ int mdso_objgen_symentry( mdso_obj_write_short(symrec[0].cs_section_number,2); mdso_obj_write_long(&symrec[0].cs_name[4],stroff_impsym); - sprintf(&strtbl[stroff_impsym],"__imp_%s%s",uscore ? "_" : "", sym); + mdso_obj_write_sym_impstr(&strtbl[stroff_impsym],uscore,sym); symrec += 1; /* archive symbol map */ - if (vobj->mapstrs) - strcpy(vobj->mapstrs,&strtbl[stroff_impsym]); + if (vobj->mapstrs) { + ch = vobj->mapstrs; + src = &strtbl[stroff_impsym]; + + for (; *src; ) + *ch++ = *src++; + } /* coff symbol: .dsometa_libname */ symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_EXTERNAL; @@ -249,7 +319,7 @@ int mdso_objgen_symentry( mdso_obj_write_short(symrec[0].cs_section_number,0); mdso_obj_write_long(&symrec[0].cs_name[4],stroff_libname); - sprintf(&strtbl[stroff_libname],"%s_%s", + mdso_obj_write_libname(&strtbl[stroff_libname], MDSO_META_SECTION, dctx->cctx->libname); |