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

描述

1.属性添加说明

为了通过安卓系统的属性控制fridaserver启动和停止,将加入如下属性:

 

# 该属性控制启动和停止frida
# 0:停止 1:启动 
xro.start.myfrd=0
# 该属性设置frida server启动的端口,默认端口为27042
xro.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中设置和获取。如果不配置系统Appselinux访问策略,App将没有权限进行属性修改操作。由于adbd运行已经拥有了超级权限,adbd对新增的属性具有读取和设置的能力,所以可以不用为adbd配置访问新增属性的selinux策略。安卓系统中和selinux配置相关的目录路径如下:

 

systemsepolicy

 

新增属性配置操作如下。

(1).定义属性标签类型"mysystem_prop"

在以下文件中添加自定义的属性标签类型定义,文件路径如下:

 

systemsepolicypublicproperty.te
systemsepolicyprebuiltsapi29.0publicproperty.te

 

自定义的属性标签定义如下:

 

type mysystem_prop, property_type;

 

由于以上两个文件内容必须保持一致,所以请确保以上两个文件中添加的内容保持一致,否则编译报错。

(2).为自定义的属性关联标签

在以下文件中添加自定义的属性关联的selinux标签,文件路径如下:

 

systemsepolicyprivateproperty_contexts
systemsepolicyprebuiltsapi29.0privateproperty_contexts

 

添加的标签内容如下:

 

# 表示xro.start.前缀的属性标签都为mysystem_prop
xro.start.              umysystem_prop:s0

 

由于以上两个文件内容必须保持一致,所以请确保以上两个文件中添加的内容保持一致,否则编译报错。

(3).为system_app添加自定义属性访问权限

为了让system权限的app能够访问到自定义的属性,需要在以下文件中添加访问规则,文件路径如下:

 

systemsepolicyprivatesystem_app.te
systemsepolicyprebuiltsapi29.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 running
void *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 myfridaserverarm64
sleep 1
myfridaserverarm64 -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 myfridaserverarm64
sleep 1
myfridaserverarm64 -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:"<

 

4.属性控制adbd重启配置

在本方案中,fridaserver是由adbd母体调用system函数创建的。测试过程中如果adbd杀掉fridaserver也会被杀掉。所以为了防止fridaserver卡死的情况,增加属性控制adbd重启的功能。同时通过该属性控制adbd重启方便在修改模块adbd的代码之后编译测试。

具体操作如下:

在文件init.rc中添加属性控制adbd的配置信息,init.rc文件路径如下:

 

systemcore
ootdirinit.rc

 

添加的内容为:

 

on property:xro.start.myadbd=1
   stop  adbd
   start adbd

 

5.编译刷机验证

5.1 编译

参考命令如下:

 

 qiang@ubuntu:~/lineageOs$ source build/envsetup.sh
 qiang@ubuntu:~/lineageOs$ breakfast  oneplus3
 qiang@ubuntu:~/lineageOs$ brunch oneplus3
Looking for dependencies in device/oneplus/oneplus3
Looking for dependencies in device/oppo/common
....

 

5.2 刷机

参考命令:

 

qiang@ubuntu:~/lineageOs$ adb push out/target/product/oneplus3/lineage-17.1-20210324-UNOFFICIAL-oneplus3.zip  /sdcard/update.zip
out/target/product/oneplus3/lineage-17...28.1 MB/s (783285269 bytes in 26.561s)
qiang@ubuntu:~/lineageOs$ 
qiang@ubuntu:~/lineageOs$ 
qiang@ubuntu:~/lineageOs$ adb reboot recovery
qiang@ubuntu:~/lineageOs$ 
qiang@ubuntu:~/lineageOs$ 
qiang@ubuntu:~/lineageOs$ 

 

5.3 测试验证

测试关闭fridaserver服务:

 

 C:UsersQiang>adb shell setprop xro.start.myfrd  0

 

测试打开fridaserver服务:

 

 C:UsersQiang>adb shell setprop xro.start.myfrd  1

 

测试重启adbd服务:

 

 C:UsersQiang>adb shell setprop xro.start.myadbd  1

 

安卓系统

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分