HOOK_DEF(void*, dlopen, const char *filename, int flag) { const char *redirect_path = match_redirected_path(filename); void *ret = orig_dlopen(redirect_path, flag); onSoLoaded(filename, ret); LOGD("dlopen : %s, return : %p.", redirect_path, ret); FREE(redirect_path, filename); return ret; }
/*----------------------------------------------------------------------------- dlopen - interposer func -----------------------------------------------------------------------------*/ void * dlopen(const char *pathname, int mode) { if (!orig_dlopen) orig_dlopen = (void* (*)(const char*, int))dlsym(RTLD_NEXT, "dlopen"); // printf("dlopen: %s\n", pathname); void* result = orig_dlopen(pathname, mode); if (!no_recurse) mvee_refresh_hook_lists(); return result; }
void * dlopen(const char *filename, int flags) { void *(*orig_dlopen)(const char *, int); void *handle = NULL; orig_dlopen = _env_dump_resolve_symbol_by_name("dlopen"); handle = orig_dlopen(filename, flags); if (!_env_ignored) _dlopen_check_result(handle, filename, flags); return handle; }
static int libcrypto_resolve_symbols() { void *(*orig_dlopen)(const char *, int); if (handle_libcrypto == NULL) { orig_dlopen = _env_dump_resolve_symbol_by_name("dlopen"); /* Open a local version of the libcrypto */ handle_libcrypto = orig_dlopen("libcrypto.so", RTLD_LOCAL | RTLD_LAZY); if (handle_libcrypto) SHA1_local = dlsym(handle_libcrypto, "SHA1"); } return !handle_libcrypto && !SHA1_local; }
void * _env_dump_resolve_local_symbol_by_name(const char *symbol) { static void *(*orig_dlsym)(void *, const char *); static void *handle_env_dump; if (orig_dlsym == NULL) orig_dlsym = _dl_sym(RTLD_NEXT, "dlsym", dlsym); if (handle_env_dump == NULL ) { void *(*orig_dlopen)(const char *, int); char *fullpath = find_Linked_library("env_dump.so"); orig_dlopen = _dl_sym(RTLD_NEXT, "dlopen", dlsym); handle_env_dump = orig_dlopen(fullpath, RTLD_LAZY); free(fullpath); } return orig_dlsym(handle_env_dump, symbol); }