添加自定义属性控制fridaserver启动和停止

1.属性添加说明
为了通过安卓系统的属性控制fridaserver启动和停止,将加入如下属性:
# 该属性控制启动和停止frida# 0:停止 1:启动 xro.start.myfrd=0# 该属性设置frida server启动的端口,默认端口为27042xro.start.myfrd.port=27042# 该属性控制adbd进程重启,这个属性是为了方便控制adbd进程重启# 1:停止adbd然后再启动# 0:停止adbd然后再重启xro.start.myadbd=  
2.系统中添加属性
2.1 系统中新增属性
在文件build oolsuildinfo.sh中添加以下属性,添加之后属性如下:
...  echo xro.start.myfrd=0  echo xro.start.myfrd.port=27042  echo xro.start.myadbd=  ...  
2.2 为新增的属性配置selinux标签
由于新增的属性需要在后续开发的具有system权限的app中设置和获取。如果不配置系统app的selinux访问策略,app将没有权限进行属性修改操作。由于adbd运行已经拥有了超级权限,adbd对新增的属性具有读取和设置的能力,所以可以不用为adbd配置访问新增属性的selinux策略。安卓系统中和selinux配置相关的目录路径如下:
systemsepolicy  
新增属性配置操作如下。
(1).定义属性标签类型mysystem_prop
在以下文件中添加自定义的属性标签类型定义,文件路径如下:
systemsepolicypublicproperty.tesystemsepolicyprebuiltsapi29.0publicproperty.te  
自定义的属性标签定义如下:
type mysystem_prop, property_type;  
由于以上两个文件内容必须保持一致,所以请确保以上两个文件中添加的内容保持一致,否则编译报错。
(2).为自定义的属性关联标签
在以下文件中添加自定义的属性关联的selinux标签,文件路径如下:
systemsepolicyprivateproperty_contextssystemsepolicyprebuiltsapi29.0privateproperty_contexts  
添加的标签内容如下:
# 表示xro.start.前缀的属性标签都为mysystem_propxro.start.              umysystem_prop:s0  
由于以上两个文件内容必须保持一致,所以请确保以上两个文件中添加的内容保持一致,否则编译报错。
(3).为system_app添加自定义属性访问权限
为了让system权限的app能够访问到自定义的属性,需要在以下文件中添加访问规则,文件路径如下:
systemsepolicyprivatesystem_app.tesystemsepolicyprebuiltsapi29.0privatesystem_app.te  
添加的访问规则如下:
# 表示允许系统权限的app读取mysystem_prop标签的属性get_prop(system_app, mysystem_prop)# 表示允许系统权限的app修改mysystem_prop标签的属性值set_prop(system_app, mysystem_prop)  
由于以上两个文件内容必须保持一致,所以请确保以上两个文件中添加的内容保持一致,否则编译报错。
3.使用属性控制fridaserver运行
在课程配置fridaserver为后台服务程序中已经实现了adbd启动之后启动fridaserver的功能。本篇中将使用新增的属性来控制fridaserver启动、停止。
在文件systemcoreadbdaemonmain.cpp中通过属性控制fridaserver的核心关键代码如下:
//该函数判断fridaserver是否已经在运行了static int  is_fridaserver_running() {    int ret=-1;    char buf[256]={0};    file * fp=null;    if((fp=popen(ps,r))==null)    {       mylogd(popen error in is_fridaserver_running);       return ret;    }    while(fgets (buf,255, fp)!=null) {        mylogd(readline====>%s,buf);        if(strstr(buf,myfridaserverarm64)!=null)        {           ret=0;           break;        }     }   pclose(fp);   return ret;}//通过广播发送当前的fridaserver运行状态,方便app中状态更新static void  broadcast_frida_server_status(int status,const char * portstr){    //am broadcast -a com.android.myaction.frida_server_status --es isrunning 0    char cmd_buf[128]={0};    sprintf(cmd_buf,am broadcast -a com.android.myaction.frida_server_status --es isrunning %d  --es port %s,status,portstr);    system(cmd_buf);    mylogd(broadcast_frida_server_status success);}//线程处理函数,根据属性值来判断fridaserver的启动、停止// 1 for start// 2 for stop// 3 for runningvoid *work_thread(void *m) {    mylogd(work_thread start);    while (1 > 0) {        std::string prop = android::getproperty(sys.boot_completed, );        std::string myfrd = android::getproperty(xro.start.myfrd, );        std::string port_str = android::getproperty(xro.start.myfrd.port, 27042);        bool boot_ok = (prop == 1);        //bool bool_myfrd= (myfrd == 1 );        mylogd(sys.boot_completed:%s, prop.c_str());        if (boot_ok) {            int frida_status = is_fridaserver_running();            broadcast_frida_server_status(frida_status, port_str.c_str());            mylogd(is_fridaserver_running==>%d, frida_status);            if (myfrd == 1) {                mylogd(start to launch myfridaserverarm64);                char cmd_buf[128] = {0};                sprintf(cmd_buf,                        killall myfridaserverarm64sleep 1myfridaserverarm64 -l 0.0.0.0:%s -d,                        port_str.c_str());                system(cmd_buf);                mylogd(start myfridaserverarm64 finish );                android::setproperty(xro.start.myfrd, 3);            } else if (myfrd == 0) {                mylogd(start to stop myfridaserverarm64);                char cmd_buf[128] = {0};                sprintf(cmd_buf, killall myfridaserverarm64);                if (frida_status >= 0) {                    system(cmd_buf);                }                mylogd(stop myfridaserverarm64 finish );            } else if (myfrd == 3) {                if (frida_status < 0) {                    //说明adbd 第一次启动,并且状态属性为3说明adbd被重启了,需要重新启动frida server                    mylogd(adbd restart,start to launch myfridaserverarm64);                    char cmd_buf[128] = {0};                    sprintf(cmd_buf,                            killall myfridaserverarm64sleep 1myfridaserverarm64 -l 0.0.0.0:%s -d,                            port_str.c_str());                    system(cmd_buf);                    mylogd(adbd restart,start myfridaserverarm64 finish );                    //android::setproperty(xro.start.myfrd,3);                }                mylogd(myfridaserverarm64 is running);            } else {            }        } else {            //log(debug) << sys.boot_completed:< 测试打开fridaserver服务:
c:usersqiang>adb shell setprop xro.start.myfrd  1  
测试重启adbd服务:
c:usersqiang>adb shell setprop xro.start.myadbd  1


三星引领电视行业15年的秘密:为用户提供卓越视听体验
电动汽车高压连接器和线束的屏蔽效能测试--线注入法
无人机想要开始商用 还需解决这几个难题
电磁炉的原理是怎么样的详细资料概述
服务器处理器参数面面观
添加自定义属性控制fridaserver启动和停止
支持WAPI的iPhone量产 上市时间表未定
开关电源设计过程中的注意事项以及排错方式
华为云CDN,如何助力智能新媒体转型
2020充电模块标准产业研讨会上重磅发布充电基础设施发展趋势白皮书
为什么我们要选择SDR作为稳定交易进行价格的标准
aigo国民好物固态硬盘P3000高性价比 你值得拥有
华为鸿蒙系统HarmonyOS的四大技术特点与三大新兴之处分析
互联网应用蓬勃发展,让卫星服务出现了商业新机
「工业树莓派」raspi-config 常用配置介绍
2030年全球驱动电机市场规模年均增速将在18%-20%
宽带固定增益放大器THS4302的工作原理和应用电路分析
刷脸支付在商业投资推动下,发起了新的变革
单张消费级显卡微调多模态大模型
Arduino常用的三种通信协议 2