summaryrefslogtreecommitdiff
path: root/src/vm/dllimport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/dllimport.cpp')
-rw-r--r--src/vm/dllimport.cpp86
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)
{