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