网上流传比较多的,是重打包boot.img。读aosp的init进程源码,发现通过patch init进程也可以实现相同目的。
首先看一下init进程对ro只读属性的检查:
/* property_service.c */
int property_set(const char *name, const char *value)
{
...
pi = (prop_info*) __system_property_find(name);
if(pi != 0) {
/* ro.* properties may NEVER be modified once set */
if(!strncmp(name, "ro.", 3)) return -1; /* 如果是只读属性,不允许set,返回-1 */
__system_property_update(pi, value, valuelen);
}
...
从上面代码看出,如果将“ro.”改为“\0”即空字符串,即可绕过property_set对可读属性的检查。
同时为了防止误修改,我们查看init进程是否还有其它使用“ro.”字符串的地方,只找到一处,位于check_perms函数中:
/*
* Checks permissions for setting system properties.
* Returns 1 if uid allowed, 0 otherwise.
*/
static int check_perms(const char *name, unsigned int uid, uns