diff options
Diffstat (limited to 'src/vm/dllimport.cpp')
-rw-r--r-- | src/vm/dllimport.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/vm/dllimport.cpp b/src/vm/dllimport.cpp index 18e77d8490..76ca654622 100644 --- a/src/vm/dllimport.cpp +++ b/src/vm/dllimport.cpp @@ -6850,6 +6850,73 @@ HINSTANCE NDirect::LoadLibraryModule(NDirectMethodDesc * pMD, LoadLibErrorTracke return hmod.Extract(); } + +extern "C" void __sanitizer_enable_calls_forwarding(); +extern "C" void __sanitizer_disable_calls_forwarding(); + + +extern "C" long write(int fd, const void *buf, int count); + +void my_enable() +{ + char msg[] = "#### MY_ENABLE\n"; + write(1, msg, sizeof(msg) - 1); + __sanitizer_disable_calls_forwarding(); +} + +void my_disable() +{ + __sanitizer_enable_calls_forwarding(); + char msg[] = "#### MY_DISABLE\n"; + write(1, msg, sizeof(msg) - 1); +} + +#include <pshpack1.h> +struct my_struct { + void (*asan_enable)(); + void (*asan_disable)(); + UINT64 real_func; + UINT64 *(*get_addr_space)(); +}; + + +static __thread UINT64 g_addr_space; +UINT64 *get_return_addr_space() +{ + return &g_addr_space; +} + +extern UINT64 hex_wrapper; +extern UINT64 hex_wrapper_size; +extern UINT64 hex_wrapper_entry_offset; + + +LPVOID ASanCreateWraper(LPVOID target) +{ + void *wrapper_space = (void *)SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()->AllocMem(S_SIZE_T(0x200)); + + // copy asan_wrapper + memcpy(wrapper_space, &hex_wrapper, hex_wrapper_size); + + struct my_struct pp = { + .asan_enable = my_enable, + .asan_disable = my_disable, + .real_func = (UINT64)target, + .get_addr_space = get_return_addr_space, + }; + + // copy my_struct + memcpy(wrapper_space, &pp, sizeof(pp)); + + return (LPVOID)((UINT64)wrapper_space + hex_wrapper_entry_offset); +} + + +extern "C" int dprintf(int fd, const char *format, ...); +extern "C" void *dlopen(const char *filename, int flags); +extern "C" int dlclose(void *handle); +extern "C" void *dlsym(void *handle, const char *symbol); + //--------------------------------------------------------- // Loads the DLL and finds the procaddress for an N/Direct call. //--------------------------------------------------------- @@ -6901,6 +6968,25 @@ VOID NDirect::NDirectLink(NDirectMethodDesc *pMD) if ( hmod ) { LPVOID pvTarget = NDirectGetEntryPoint(pMD, hmod); + dprintf(1, "#### NDirect::NDirectLink: [POINTER TO FUNCTION] pMD=%p size=%d HasNonVtableSlot[%d %p] pvTarget=%p entry_name=%s lib_name='%s' IsComPlusCall=%d IsGenericComPlusCall=%d\n", + pMD, pMD->SizeOf(), + pMD->HasNonVtableSlot(), + NULL, //pMD->HasNonVtableSlot() ? ((RelativePointer<PCODE> *)pMD->GetAddrOfHasNonVtableSlot())->GetValueMaybeNull() : NULL, + pvTarget, pMD->GetEntrypointName(), pMD->GetLibName(), pMD->IsComPlusCall(), pMD->IsGenericComPlusCall()); + if (1) { + bool is_asan_lib = false; + void *h = dlopen(pMD->GetLibName(), 0x00001 /* RTLD_LAZY */); + if (h) { + is_asan_lib = !!dlsym(h, "__asan_init"); + dlclose(h); + } + dprintf(1, "#### h=%p IS_ASAN_LIB=%d pMD->GetLibName()=%s\n", h, is_asan_lib, pMD->GetLibName()); + is_asan_lib = !!h; + if (is_asan_lib) { + dprintf(1, "#### NDirect::NDirectLink: CHANGE pvTarget\n"); + pvTarget = ASanCreateWraper(pvTarget); + } + } if (pvTarget) { |