修改Android源码使property中ro属性可重复修改

Android 11.0 动态修改SystemProperties中ro开头系统属性的值 在11.0的产品开发中,对于定制功能的需求很多,有些机型要求可以修改系统属性值,对于系统本身在10.0以后为了系统安全性,不允许修改ro开头的SystemProperties的值,所以如果要求修改ro的相关系统属性,就得看在设置SystemProperties的相关值的要求,修改这部分要求就可以了。在HandlePropertySet()中根据参数name的值分别调用相关的方法来设置值ro 开头的值 最终是由。2.动态修改SystemProperties中ro开头系统属性的值的功能分析和实现功能。 阅读详情

property ro.xxx属性介绍
ro的英文缩写是Read Only,故在Android系统中,带有ro.的属性都是只读而不可被重复修改的。ro.xxx属性的property通常在系统启动的时候就通过property_set()函数被写在了系统中,而ro属性每次系统启动只能写一次,顾一但设定便不可修改。

setprop
在system/core/toobox下有许多常用的命令的源码,setprop由setprop.c生成


#include <stdio.h>
#include <cutils/properties.h>

int setprop_main(int argc, char *argv[])
{
    if(argc != 3) {
        fprintf(stderr,"usage: setprop <key> <value>\n");
        return 1;
    }

    if(property_set(argv[1], argv[2])){
        fprintf(stderr,"could not set property\n");
        return 1;
    }
    return 0;
}

setprop调用了property_set(const char key, const char value)函数,该函数位于system/core/libcutils下,在这里,最后跳转到了__system_property_set函数。


#ifdef HAVE_LIBC_SYSTEM_PROPERTIES

#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
#include <sys/_system_properties.h>

int property_set(const char *key, const char *value)
{
    return __system_property_set(key, value);
}

int __system_property_set(const char *key, const char *value)
{
    if (key == 0) return -1;
    if (value == 0) value = "";
    if (strlen(key) >= PROP_NAME_MAX) return -1;
    if (strlen(value) >= PROP_VALUE_MAX) return -1;

    prop_msg msg;
    memset(&msg, 0, sizeof msg);
    msg.cmd = PROP_MSG_SETPROP;
    strlcpy(msg.name, key, sizeof msg.name);
    strlcpy(msg.value, value, sizeof msg.value);

    const int err = send_prop_msg(&msg);
    if (err < 0) {
        return err;
    }
    return 0;
}

由于property_set与prop系统服务进程的通信方式主要是通过socket来设置对应的property,而__system_property_set主要作用便是与prop系统服务进程进行通信的。如上代码中,该函数通过send_prop_msg函数发送PROP_MSG_SETPROP命令告知prop系统服务进程写入property。send_prop_msg()函数通过存放在/dev/socket/下的socket本地套接字与服务进程通信。

  1. static const char property_service_socket[] = “/dev/socket/” PROP_SERVICE_NAME;
    prop服务进程在system/core/init下的property_service.c内定义。它通过socket接收来自客户端的消息,通过解析客户端发来的消息内容进行相关操作。

switch(msg.cmd) {
   case PROP_MSG_SETPROP:
       msg.name[PROP_NAME_MAX-1] = 0;
       msg.value[PROP_VALUE_MAX-1] = 0;

       if (!is_legal_property_name(msg.name, strlen(msg.name))) {
           ERROR("sys_prop: illegal property name. Got: \"%s\"\n", msg.name);
           close(s);
           return;
       }

使ro属性可重复被修改
在服务进程接收到客户端发来的PROP_MSG_SETPROP命令时,服务进程会判断将要修改的property是否是ro属性,如果是ro属性且已经存在程序直接返回,对property不做任何修改。
通过修改system/core/init/property_service.c 下的void handle_property_set_fd()函数


 switch(msg.cmd) {
 case PROP_MSG_SETPROP:
     msg.name[PROP_NAME_MAX-1] = 0;
     msg.value[PROP_VALUE_MAX-1] = 0;

     if (!is_legal_property_name(msg.name, strlen(msg.name))) {
         ERROR("sys_prop: illegal property name. Got: \"%s\"\n", msg.name);
         close(s);
         return;
     }

     getpeercon(s, &source_ctx);

     if(memcmp(msg.name,"ctl.",4) == 0) {
         // Keep the old close-socket-early behavior when handling
         // ctl.* properties.
         close(s);
         if (check_control_mac_perms(msg.value, source_ctx)) {
             handle_control_message((char*) msg.name + 4, (char*) msg.value);
         } else {
             ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%d\n",
                     msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid);
         }
     } else {
         if (check_perms(msg.name, source_ctx) 
	|| (0 == strcmp(msg.name, "ro.serialno")) 
	|| (0 == strcmp(msg.name, "ro.deviceid"))) //mod to let 'ro.xxx' can be modifiy
{
             property_set((char*) msg.name, (char*) msg.value);
         } else {
             ERROR("sys_prop: permission denied uid:%d  name:%s\n",
                   cr.uid, msg.name);
         }

         // Note: bionic's property client code assumes that the
         // property server will not close the socket until *AFTER*
         // the property is written to memory.
         close(s);

以及int property_set(const char name, const char value)函数

int property_set(const char *name, const char *value)
{
    prop_info *pi;
    int ret;

    size_t namelen = strlen(name);
    size_t valuelen = strlen(value);

    if (!is_legal_property_name(name, namelen)) return -1;
    if (valuelen >= PROP_VALUE_MAX) return -1;

    pi = (prop_info*) __system_property_find(name);

    if(pi != 0) {
        /* ro.* properties may NEVER be modified once set */
		if((0 == strcmp(name, "ro.serialno")) 
       	|| (0 == strcmp(name, "ro.deviceid")))//mod to let 'ro.xxx' can be modifiy
		{;;}
		else if (!strncmp(name, "ro.", 3) ) return -1;
        //if(!strncmp(name, "ro.", 3) ) return -1;

        __system_property_update(pi, value, valuelen);
    } else {
        ret = __system_property_add(name, namelen, value, valuelen);
        if (ret < 0) {
            ERROR("Failed to set '%s'='%s'\n", name, value);
            return ret;
        }
    }

这样就可以实现对特定ro属性的property进行多次修改!

修改Android源码使property中ro属性可重复修改

正确解决vue:Cannot set property ‘xxx’ of undefined异常的有效解决方法 阅读详情

相关推荐

开发者的避坑指南:在Apple Silicon Mac上构建RocketMQ Python客户端的完整心路历程

本文详细记录了在Apple Silicon Mac上构建RocketMQ Python客户端的完整过程,重点解决了架构兼容性问题。通过源码编译rocketmq-client-cpp库,修复构建脚本和CMake配置,最终成功在M2芯片MacBook Pro上部署RocketMQ Python客户端,为开发者提供了实用的避坑指南。

Pepper的专栏 696

Android 添加系统属性

在 Android 系统中有一个 Property Service 服务, 这个服务对外提供了两个接口: SystemProperties.get(String key, String def) 读取系统属性 SystemProperties.set(String key, String val) 设置系统属性 有两个命令行对这两个接口进行了封装,我们可以直接在adb shell 中输入: getprop key 读取系统属性 setprop key val 设置系统属性 系统属性可以简单的理解为系

a546036242的博客 7181

DDSP(Differentiable Digital Signal Processing) 开篇

文章目录DDSP可以用来做什么?下一步工作 工作中接触到了DDSP声码器,但非科班出声的我对这块知识非常陌生,甚至带有一些畏惧的心理,但是为了工作为了进步,必须硬下头皮去啃,相信只要耐心地坚持,没什么能难到我。于是从今天开始,就用这个博客专栏来记录我的学习历程,希望也能帮助到你~ DDSP对应的论文是:DDSP: Differentiable Digital Signal Processing 先翻译一篇来自DDSP论文作者的对DDSP的介绍的文章。 今天,我们很高兴地介绍可微数字信号处理(DDSP)库。

YeeKo的博客 9246

Android逆向(二)-系统调试开关

android中有一些常用的配置信息都存放在一个文件中,如:设备系统/版本号/Cpu等信息.而这个文件就是/system/build.prople_x2:/ #android 中通过两个命令可以操作这些信息: getprop和setprop.但是ro开头的这些属性是不允许后期修改的,需要重新编译系统镜像文件boot.img。而我们说的系统调试开关是哪个呢?

赵航的博客 7962

在 Kubernetes 上部署 Label Studio

Label Studio 是一款开源的数据标注工具,支持多种标注任务,如文本标注、图像标注、音频标注等。

啥都会一点 668

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 730

Android SDK 安装及上网问题解决

通过Android Studio安装 前置:已安装JDK 通过Android Studio安装 Android SDK。 第一步:下载Android Studio:https://developer.android.google.cn/studio/ 第二步:安装Android Studio,一直下一步就行。 安装完后启动Android Studio,在file->settings->Android SDK,勾选要安装的版本即可: (第一次启动时右下角会出现一个config按钮,也可以通过

weixin_42258032的博客 4215

iTunes登录协议逆向与自动化实现

本文详细解析了iTunes登录协议的逆向工程与自动化实现方法,涵盖请求体构造、签名生成和会话管理等关键技术。通过XML结构解析、X-Apple-ActionSignature生成原理及完整登录流程实现,帮助开发者高效完成iTunes自动化登录,提升工作效率。

weixin_26938645的博客 939

android ro 属性 动态,修改Android源码使property中ro属性可重复修改

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?property ro.xxx属性介绍ro的英文缩写是Read Only,故在Android系统中,带有ro.的属性都是只读而不可被重复修改的。ro.xxx属性的property通常在系统启动的时候就通过property_set()函数被写在了系统中,而ro属性每次系统启动只能写一次,顾一但设定便不可修改。setprop...

weixin_39630999的博客 1554

DGX Spark上PyTorch GPU环境配置实战:CUDA 13.0与ARM架构全流程

在深度学习中,CUDA作为GPU加速计算的底层基础,其版本与深度学习框架(如PyTorch)的匹配直接影响模型训练的效率与稳定性。GPU环境配置不仅涉及驱动、CUDA工具链与框架运行时的协同,还依赖于硬件架构与预构建包的兼容性。在AI开发机Ubuntu系统上,正确对齐CUDA版本、计算能力架构及安装源,是避免环境故障、发挥硬件算力的关键。无论是面向个人AI超算还是通用GPU服务器,掌握版本对齐、路径隔离与验证方法,都能大幅提升开发效率。本文以DGX Spark为例,详解从环境摸底到PyTorch GPU版本

weixin_29483277的博客 219

华为OD机试真题-国际移动用户识别码(IMSI)匹配

华为OD机试双机位C卷 国际移动用户识别码(IMSI)匹配 , 提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 国际移动用户识别码(IMSI)匹配

qq_45776114的博客 4927

3 个技巧改造你的 Mac 键盘:Karabiner-Elements 键位重映射实战

右手够不到 Esc,想按却总摸到 Caps Lock 误触发大写——这个困扰用过外接键盘的人,macOS 自带的"修改键盘快捷键"只能改功能键行为,根本碰不到这种底层键位。Karabiner-Elements 是一款 macOS 上的键盘重映射工具,它能在系统底层拦截你的每一次按键,重新定义成任何你想按的键,甚至让鼠标移动变成方向键。装好之后,上面那个问题一行配置就能解决。 ## 它能解决什么问

gitblog_00152的博客 218

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南

通过不断实践,熟悉软件的各项功能和操作技巧,工程师可更好地应对工业自动化控制中的各种挑战,开发出高效、稳定的控制程序。项目的基本组件是构成程序的核心元素,包括:程序块(主程序 OB1、子程序和中断程序)、数据块(给 V 存储器赋初值)、系统块(硬件组态和参数设置)、符号表(用符号代替存储器地址,使程序更易理解)以及状态图表(监视、修改和强制变量状态)。下载程序时,单击工具栏上的 “下载” 按钮,在弹出的下载对话框中选择要下载的块(程序块、数据块、系统块),单击 “下载” 即可。

电工 5573

解决:Android Emulator 无法联网

我的电脑主要是公司的 DNS 的问题,所以我只做了以下三步 1:adb shell getprop 确定DNS 确实和电脑上的DNS 不同 2:adb shell setprop net.dns1 10.66.83.265 将Emulator 和 电脑的 dns 设置成相同的 3:adb shell getprop 查看 dns 确实修改生效 此时就可以联网了 参考资料 ...

弘一大法师 2974

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android开发问题处理

以前开发遇到问题就地解决,没有总结,今后有问题尽量记录下来,不断更新。。。 1. 从模拟器中pull一个文件到本地,提示Failed to pull selection     解决: 打开device窗口,点击下使用的模拟器,然后再pull 2. 调试时logcat没输出(这个问题常常遇到)    解决:关掉logcat窗口,重新打开logcat,注意在device中选择

Aliway89的专栏 814

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TCL电视打开adb 方式,并安装外部apk。(解决adb 能连接,但不能安装外部apk问题)

https://jingyan.baidu.com/article/9c69d48f80022013c9024e16.html

piaomiaozaitianya的博客 2万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【adb命令】Android实用技巧之adb命令:getprop,setprop命令使用

测试工作过程中,一些常用adb命令总结; Android实用技巧之adb命令:getprop,setprop命令使用。

weixin_45589713的博客 9995

TCL非 root 安装当贝市场

TCL 电视开启 adb 远程调试(开启-关机-再次开启) 获取 TCL ip 地址 adb connect 192.168.0.102:5555 adb shell 执行 setprop persist.tcl.debug.installapk 1 setprop persist.tcl.installapk.enable 1 adb install

晚晴小筑 2374

note_2019_8

:-)编译过程如果提示缺少ssl头文件 ubuntu14.04,在原有msm8953的编译环境下增加安装工具sudo apt-get install libssl-dev 即可编译通过 ================================================================================== 修改系统DPI msm8953:/ # wm density 400(V6 默认DPI 480) 代码修改: root@msm8953_64:/ # get

RTFSC_ALAN的博客 3104

android 修改 dpi_修改Android序列号(Serial Number)

文档说明本文档以SC806-CN-00-71(msm8909平台 Android7系统)为例,描述如何修改Android Serial Number。Serial Number说明菜单 About phone -> Status -> Serial Number,如下图所示(图是中文系统,看"序列号"):SC806-CN-00-71默认的序列号是:12345678通过Adb devic...

weixin_39691055的博客 766

android的ro.serialno或者ro.boot.serialno是如何获取到的

通过命令行获取序列号: getprop ro.serialno 从哪来的呢: android系统层: /system/core/init/init.c: static void import_kernel_nv(char *name, int for_emulator) { if (!strcmp(name,"qemu")) { strlcpy(qemu, v...

比特人生的专栏 1万+

安卓获取不到进程 Failed to set property ‘ro.debuggable‘ to ‘1‘

Failed to set property 'ro.debuggable如果两条都没有成功都报错了,如果是说No such file or directory那可能是指令错了,如果修改成功的话执行命令。./mprop ro.debuggable 1 可能会出现异常所以最好一条一条执行,我其他很多用的是。那么可能你用的是magisk刷的root 所以执行命令应该如下。下载好后拷贝到/sdcard目录下,也就是根目录下。获取到的值是1才是正确的,如果错误信息如下,我反正使用这个没有成功。首先mprop,地址。

qq_42403906的博客 3129

android property set方法,android的property_set失败

property的设置是需要权限的,你在哪个进程里面做的?runtime开头的prop需要system权限,下面是部分权限的要求。/* White list of permissions for setting property services. */struct {const char *prefix;unsigned int uid;unsigned int gid;} property_p...

weixin_36418862的博客 641

rild 部分系统属性property_set失败的原因分析

很奇怪,我已经禁用了我的内核SElinux,但是发现rild 调用的几个ril 库文件里面部分系统属性能够设置成功,部分设置失败,都是property_set,这是为何呢?难道还是要增加SElinux 引起的设置?       参考这篇文章http://blog.youkuaiyun.com/wince_lover/article/details/50164969,看看能否能够解决

lqxandroid2012的专栏 2408

失败的产品PropertySet

不错的想法,失败的产品——PropertySet PropertySet确实是个好东西,至于有多好我就不说了,自己去看吧。 不过,PropertySet确实让我很恼火。我做了一个晚上的实验都没有成功,结果问题却出在它的源代码里!且听我慢慢说来。 我做了一个最简单的例子,有多简单呢?看看配置文件就知道: &lt;propertysets&gt;       &lt;propertyset ...

weixin_34232363的博客 122

关于property_get和property_set失败的问题

关于property_get和property_set失败的问题 在使用property_get时,编译能通过,但是在运行时property_get失败,百思不得其解,最终发现是Android.mk中没有引入libcutils库.所以借此机会做了一次总结: 1.引入了头文件#include <cutils/properties.h> 2.char value[PROPERTY_VA...

luncy_lyf的博客 3365
上一篇: android内核漏洞利用过程学习
下一篇: Android linux部分
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值