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.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐