笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述Android7.0对dlopen的改变相关的知识,希望能为你提供帮助。
两个内存段在同一个进程空间中dlopen一个.so文件,理论上在内存中是同一片区域,但实际调试中发现android7.0(read "/proc/self/maps")中,先后读同一个.so内存中居然出现两个段!
这在低版本Android(比如4.x)中不曾出现。
如下一些blog中分析,与Android7.0对dlopen的改写有关,可能是不同命名空间下读取结果不一样,可能是对安全性的提升。
Android 7.0 行为变更
NDK 应用链接至平台库
文章图片
Android 7.0 dlopen的不同
7.0对已加载.so的引用/Hook【Android7.0对dlopen的改变】由于以上分析,自己的代码中dlopen的.so文件与目标程序中加载的.so在不同内存段中,故不能直接Hook,要想方法拿到目标程序加载的.so的内存地址。
可以用base_addr + offset得到目标方法的地址,base_addr通过查找 “/proc/self/maps” 得到
//这个方法来自 android inject 用于获取地址 void* get_module_base(int pid, const char* module_name) { FILE *fp; long addr = 0; char *pch; char filename[32]; char line[1024]; if (pid < 0) { /* self process */ snprintf(filename, sizeof(filename), "/proc/self/maps", pid); } else { snprintf(filename, sizeof(filename), "/proc/%d/maps", pid); } fp = fopen(filename, "r"); if (fp != NULL) { while (fgets(line, sizeof(line), fp)) { if (strstr(line, module_name)) { pch = strtok(line, "-"); addr = strtoul(pch, NULL, 16); if (addr == 0x8000) addr = 0; break; } } fclose(fp); } return (void *)addr; }
参考blog:
如何hook dlopen和dlsym底层函数
推荐阅读
- Android 自定义控件之圆形扩散View(DiffuseView)
- Android Studio (Error message)
- 解决小米手机不能运行Android Studio程序的问题
- cordova requirements error:Android target: not installed
- Android 内存泄漏
- appium===报错Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.settings without
- Android学习笔记六(六大布局)
- 教育视频直播APP开发软件
- C# 读写App.config配置文件的方法