zoukankan      html  css  js  c++  java
  • Android7.0对dlopen的改变——读取私有.so结果变化

    两个内存段

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

  • 相关阅读:
    Super Jumping! Jumping! Jumping!
    glsl学习之cube
    取得某个进程CPU的占用率
    在游戏中使用“CEGUI”
    vbo 简单演示
    平行光镜面反射模型
    使用fbo来实现render to texture演示
    平行光漫反射模型
    glsl teapot 简单演示
    点光源模型
  • 原文地址:https://www.cnblogs.com/eniac1946/p/7515557.html
Copyright © 2011-2022 走看看