码迷,mamicode.com
首页 > 移动开发 > 详细

Android7.0对dlopen的改变

时间:2017-09-13 17:15:15      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:自己的   参考   读取   tle   details   bre   href   查找   net   

两个内存段

在同一个进程空间中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

由于以上分析,自己的代码中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底层函数  

Android7.0对dlopen的改变

标签:自己的   参考   读取   tle   details   bre   href   查找   net   

原文地址:http://www.cnblogs.com/eniac1946/p/7515557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!