#include <sys/mman.h>
#include "injector.h"
#include "internal_libc.h"
+#include "internal_libdl.h"
+#include "common.h"
+#include "log.h"
#if __WORDSIZE == 64
return 0;
}
-void inject(injection_info info[], unsigned long size) noexcept
+static void do_inject(injection_info info[], unsigned long size) noexcept
{
const injection_data inject_data = {
.info = info,
dl_iterate_phdr(phdr_callback, const_cast<injection_data *>(&inject_data));
}
+
+// TODO: Add dlopen/dlsym()'s hooks support
+static void *dl_inject_dlopen(const char *filename, int flag) noexcept;
+static void *dl_inject_dlsym(void *handle, const char *symbol) noexcept;
+
+static struct injection_info dl_hooks_info[] = {
+ INJECTION_INFO_INIT("dlopen", dl_inject_dlopen),
+ INJECTION_INFO_INIT("dlsym", dl_inject_dlsym),
+};
+
+static struct injection_info *g_info;
+static unsigned long g_info_size;
+
+static void update_modules() noexcept
+{
+ do_inject(g_info, g_info_size);
+ do_inject(dl_hooks_info, ARRAY_SIZE(dl_hooks_info));
+}
+
+static void *dl_inject_dlopen(const char *filename, int flag) noexcept
+{
+ void *handle = internal::dlopen(filename, flag);
+
+ update_modules();
+ return handle;
+}
+
+static void *dl_inject_dlsym(void *handle, const char *symbol) noexcept
+{
+ for (unsigned long i = 0; i < g_info_size; ++i) {
+ if (internal::strcmp(symbol, g_info[i].name) == 0)
+ return (void *)g_info[i].addr;
+ }
+
+ return internal::dlsym(handle, symbol);
+}
+
+void inject(injection_info info[], unsigned long size) noexcept
+{
+ g_info = info;
+ g_info_size = size;
+
+ update_modules();
+}
+
} // namespace injector
} // namespace __swap