android ro 属性 动态,[原创]root环境下直接修改ro属性
root环境下直接修改ro属性属性是由init进程读取到内存中,然后通过mmap只读方式共享到其他进程中。读的时候每个进程都可以直接读取,而修改或者添加只能由init进程来进行,这样方便selinux权限管理。有root权限后,我们可以将属性内存通过mmap读写的方式共享到我们的内存中,这样可以任意修改,绕过init的限制。属性内存结构* +-----+children+----+ ...
root环境下直接修改ro属性
属性是由init进程读取到内存中,然后通过mmap只读方式共享到其他进程中。读的时候每个进程都可以直接读取,而修改或者添加只能由init进程来进行,这样方便selinux权限管理。
有root权限后,我们可以将属性内存通过mmap读写的方式共享到我们的内存中,这样可以任意修改,绕过init的限制。
属性内存结构* +-----+ children +----+ children +--------+
* | |-------------->| ro |-------------->| secure |
* +-----+ +----+ +--------+
* / \ / |
* left / \ right left / | prop +===========+
* v v v +-------->| ro.secure |
* +-----+ +-----+ +-----+ +-----------+
* | n | | sys | | com | | 1 |
* +-----+ +-----+ +-----+ +===========+
*
上图其实很形象,是字典树和二叉树的混合。结点信息数据结构如下:
typedef struct prop_bt {
uint8_t namelen; // 该结点名字长度
uint8_t reserved[3]; // 对齐的作用
uint32_t prop; // 指向prop_info,里面保存key和value信息
uint32_t left; // 左兄弟,长度小于或者长度相同而名字小于当前结点
uint32_t right; // 右兄弟,长度大于或者长度相同而名字大于当前结点
uint32_t children; // 子结点
char name[0];
} prop_bt;
typedef struct prop_info {
uint32_t serial;
char value[PROP_VALUE_MAX]; // PROP_VALUE_MAX = 92,所以说属性值最大长度为91,'\0'结尾
char name[0]; // 属性名字
} prop_info;
思路:
1. Android N上,首先读取读取/property_contexts文件,获取属性前缀和security context(selinux定义的)的关系,由于每个security context对应一个文件,所以需要通过前缀来找到对应的文件,6.0及以下所以属性都保存在/dev/__properties__文件中,可以不读取/property_contexts文件
2. 打开对应的文件,将属性以'.'分隔,将第一部分和头结点对比,若相同则第二部分和children对比,不同,若小于则继续使用第一部分比较left结点,若大于则比较right结点。依次类推,若最后部分和结点N相等,则N的prop就是所要找到prop_info.
更多推荐
所有评论(0)