From 86faa1b3cb8c8783ebddcd5344c0ba7d81aee0be Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Wed, 23 Jan 2019 19:27:55 +0300 Subject: [PATCH] Add injection support for dynamic-loading libraries Change-Id: I095ffe7ea03cb93bba7ff3f8a9580cfe25d1dba5 Signed-off-by: Vyacheslav Cherkashin --- src/core/common.h | 4 ++++ src/core/injector.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++- src/lsan/lsan_adapter.cpp | 3 --- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/core/common.h b/src/core/common.h index bcf7136..5138b8c 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -29,6 +29,10 @@ AutoRelease make_auto_release(T t, R r) } +template +constexpr int ARRAY_SIZE(T(&)[N]) { return N; } + + void die(); } // namespace __swap diff --git a/src/core/injector.cpp b/src/core/injector.cpp index 12edc13..62231ef 100644 --- a/src/core/injector.cpp +++ b/src/core/injector.cpp @@ -2,6 +2,9 @@ #include #include "injector.h" #include "internal_libc.h" +#include "internal_libdl.h" +#include "common.h" +#include "log.h" #if __WORDSIZE == 64 @@ -154,7 +157,7 @@ static int phdr_callback(dl_phdr_info *info, size_t /*size*/, void *data) noexce 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, @@ -164,5 +167,50 @@ void inject(injection_info info[], unsigned long size) noexcept dl_iterate_phdr(phdr_callback, const_cast(&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 diff --git a/src/lsan/lsan_adapter.cpp b/src/lsan/lsan_adapter.cpp index 517ff8b..90c5310 100644 --- a/src/lsan/lsan_adapter.cpp +++ b/src/lsan/lsan_adapter.cpp @@ -116,9 +116,6 @@ static struct injector::injection_info info[] = { */ }; -template -constexpr int ARRAY_SIZE(T(&)[N]) { return N; } - #define DLSYM_INIT_OR_RETURN(ret_value, handle, sym_name) \ do { \ -- 2.7.4