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

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

时间: 2024-10-06 10:46:11

Android7.0对dlopen的改变的相关文章

Android7.0 Doze模式分析(一)Doze介绍 &amp;amp; DeviceIdleController

 參考:http://blog.csdn.net/gaugamela/article/details/52981984 在Android M中,Google就引入了Doze模式.它定义了一种全新的.低能耗的状态. 在该状态,后台仅仅有部分任务被同意执行.其他任务都被强制停止. 在之前的博客中分析过Doze模式.就是device idle状态.可能有的地方分析的不是非常具体,如今在android7.0上又一次分析下. 一.基本原理 Doze模式能够简单概括为: 若推断用户在连续的一段时间内没有

Android7.0新特性,及Android N适配

新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了以下的新特性和优化: 一.新的Notification Android N 增加了许多新的notifications API,进行了重新的设计,引入了新的风格. 模板更新: 开发者将能够充分利用新模板,只需进行少量的代码调整. 消息样式自定义: 新增自定义样式.消息回复.消息分组等更加灵活. 捆绑通知: 系统可以将消息组合在一起(例如,按消息主题)并显示组.用户可以适当地进行 Dismiss 或

Android7.0 Doze模式分析(一)Doze介绍 &amp; DeviceIdleController

 参考:http://blog.csdn.net/gaugamela/article/details/52981984 在Android M中,Google就引入了Doze模式.它定义了一种全新的.低能耗的状态. 在该状态,后台只有部分任务被允许运行,其它任务都被强制停止. 在之前的博客中分析过Doze模式,就是device idle状态.可能有的地方分析的不是很详细,现在在android7.0上重新分析下. 一.基本原理 Doze模式可以简单概括为: 若判断用户在连续的一段时间内没有使用手

[Android Pro] Android7.0系统 关于Android获取流量计数TrafficStats.getUidRxBytes(uid)和TrafficStats.getUidTxBytes(uid)返回-1解决方案

reference : http://blog.csdn.net/zhangyong7112/article/details/54574214 最近一个关于流量的项目在Android7.0系统的手机上运行,一直获取不到流量的使用数据,查看源码然后发现TrafficStats.getUidRxBytes(uid)和TrafficStats.getUidTxBytes(uid)一直都是返回的-1, // 获取某个网络UID接收和发送字节的总和 long total = TrafficStats.ge

WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们今天就来看看到底我们该如何理解Android系统中的Window和窗口. 窗口这个概念,从不同的角度来看它的含义不一样,如果我们从WmS(WindowManagerService)的角度来看窗口,那么这个窗口并不是一个Window类,而是一个View.用户发来的消息被WmS接收之后并不能直接发给各个

拍照、本地图片工具类(兼容至Android7.0)

拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb.weex.util; import android.Manifest; import android.app.Activity; import android.app.Dialog; import android.content.ClipData; import android.content.Conten

Android7.0下载Apk自动安装

Android7.0下载Apk自动安装 1. 整体需求 下载APK文件 使用DownloadManager来下载 在应用界面中展示下载进度 安装下载后的APK文件 root模式: 可以自动安装,不需要用户主动点击 正常模式: 弹出安装应用页面,需要兼容7.0以上版本 2. DownloadManager DownloadManager是Android提供的用于下载的类,使用起来比较简单,它包含两个静态内部类DownloadManager.Query和DownloadManager.Request

鹅厂bugly应用升级不能安装(Android7.0的新变化)

app升级是每一个android应用的标配了,大部分应用都会有升级提醒和apk下载安装(如果系统允许静默安装估计就没有提醒这段了). 以前的升级是自己写http下载或者通过系统提供的DownloadManager进行下载.无意间发现bugly提供下载更新服务而且免费(后来又提供了热更新),就乐呵呵的接入了sdk,毕竟是大厂的东西,值得信赖.开始用的时候用的很稳定(估计是手机厂商还没用上牛轧糖),后来就有人反应更新失败,一直提示安装,开始有些不相信直接让用户卸载重装(还好用户是公司自己人,是外人的

Android7.0 FileUriExposedException 问题解决

一.FileUriExposedException的原因 Android7.0不识别uri以file://开头,要将其转换为content://才能识别uri 二.如何解决 1.xml的创建: file_paths.xml中编写该Provider对外提供文件的目录:文件放置在res/xml/下. 为了避免和其它app冲突,最好带上自己app的包名. 文件内容: <?xml version="1.0" encoding="utf-8"?><paths