我们知道,/system/bin/linker
负责动态链接机制,但是libdl
具有实际在动态链接器(dlfcn.c
)中定义并在运行时被劫持的函数的存根,如下所示:
#include <dlfcn.h>
/* These are stubs for functions that are actually defined
* in the dynamic linker (dlfcn.c), and hijacked at runtime.
*/
void *dlopen(const char *filename, int flag) { return 0; }
const char *dlerror(void) { return 0; }
void *dlsym(void *handle, const char *symbol) { return 0; }
int dladdr(const void *addr, Dl_info *info) { return 0; }
int dlclose(void *handle) { return 0; }
void android_update_LD_LIBRARY_PATH(const char* ld_library_path) { }
#if defined(__arm__)
void *dl_unwind_find_exidx(void *pc, int *pcount) { return 0; }
#elif defined(__i386__) || defined(__mips__)
/* we munge the cb definition so we don't have to include any headers here.
* It won't affect anything since these are just symbols anyway */
int dl_iterate_phdr(int (*cb)(void *info, void *size, void *data), void *data) { return 0; }
#else
#error Unsupported architecture. Only mips, arm and x86 are supported.
#endif
那么劫持何时以及如何发生?如果您可以在android开源中向我展示代码,将不胜感激。
根据您的问题,尚不清楚您对哪个Android版本感兴趣,但似乎您正在使用的是较旧的Android版本(假设它使用dlfcn.c
而不是dlfcn.cpp
)。我将讨论基于Android 6的劫持过程。
对于较新的Android版本,过程基本相同,但是某些方法名称和文件名已更改。