1.屬性添加說明
為了通過安卓系統(tǒng)的屬性控制fridaserver啟動和停止,將加入如下屬性:
#該屬性控制啟動和停止frida #0:停止 1:啟動 xro.start.myfrd=0 #該屬性設(shè)置fridaserver啟動的端口,默認(rèn)端口為27042 xro.start.myfrd.port=27042 #該屬性控制adbd進(jìn)程重啟,這個屬性是為了方便控制adbd進(jìn)程重啟 #1:停止adbd然后再啟動 #0:停止adbd然后再重啟 xro.start.myadbd=
2.系統(tǒng)中添加屬性
2.1 系統(tǒng)中新增屬性
在文件"build oolsuildinfo.sh"中添加以下屬性,添加之后屬性如下:
... echo"xro.start.myfrd=0" echo"xro.start.myfrd.port=27042" echo"xro.start.myadbd=" ...
由于新增的屬性需要在后續(xù)開發(fā)的具有System權(quán)限的App中設(shè)置和獲取。如果不配置系統(tǒng)App的selinux訪問策略,App將沒有權(quán)限進(jìn)行屬性修改操作。由于adbd運(yùn)行已經(jīng)擁有了超級權(quán)限,adbd對新增的屬性具有讀取和設(shè)置的能力,所以可以不用為adbd配置訪問新增屬性的selinux策略。安卓系統(tǒng)中和selinux配置相關(guān)的目錄路徑如下:
systemsepolicy
新增屬性配置操作如下。
(1).定義屬性標(biāo)簽類型"mysystem_prop"
在以下文件中添加自定義的屬性標(biāo)簽類型定義,文件路徑如下:
systemsepolicypublicproperty.te systemsepolicyprebuiltsapi29.0publicproperty.te
自定義的屬性標(biāo)簽定義如下:
typemysystem_prop,property_type;
由于以上兩個文件內(nèi)容必須保持一致,所以請確保以上兩個文件中添加的內(nèi)容保持一致,否則編譯報錯。
(2).為自定義的屬性關(guān)聯(lián)標(biāo)簽
在以下文件中添加自定義的屬性關(guān)聯(lián)的selinux標(biāo)簽,文件路徑如下:
systemsepolicyprivateproperty_contexts systemsepolicyprebuiltsapi29.0privateproperty_contexts
添加的標(biāo)簽內(nèi)容如下:
#表示xro.start.前綴的屬性標(biāo)簽都為mysystem_prop xro.start.umysystem_prop:s0
由于以上兩個文件內(nèi)容必須保持一致,所以請確保以上兩個文件中添加的內(nèi)容保持一致,否則編譯報錯。
(3).為system_app添加自定義屬性訪問權(quán)限
為了讓system權(quán)限的app能夠訪問到自定義的屬性,需要在以下文件中添加訪問規(guī)則,文件路徑如下:
systemsepolicyprivatesystem_app.te systemsepolicyprebuiltsapi29.0privatesystem_app.te
添加的訪問規(guī)則如下:
#表示允許系統(tǒng)權(quán)限的app讀取mysystem_prop標(biāo)簽的屬性 get_prop(system_app,mysystem_prop) #表示允許系統(tǒng)權(quán)限的app修改mysystem_prop標(biāo)簽的屬性值 set_prop(system_app,mysystem_prop)
由于以上兩個文件內(nèi)容必須保持一致,所以請確保以上兩個文件中添加的內(nèi)容保持一致,否則編譯報錯。
3.使用屬性控制fridaserver運(yùn)行
在課程"配置fridaserver為后臺服務(wù)程序"中已經(jīng)實現(xiàn)了adbd啟動之后啟動fridaserver的功能。本篇中將使用新增的屬性來控制fridaserver啟動、停止。
在文件"systemcoreadbdaemonmain.cpp"中通過屬性控制fridaserver的核心關(guān)鍵代碼如下:
//該函數(shù)判斷fridaserver是否已經(jīng)在運(yùn)行了 staticintis_fridaserver_running(){ intret=-1; charbuf[256]={0}; FILE*fp=NULL; if((fp=popen("ps","r"))==NULL) { MYLOGD("popenerrorinis_fridaserver_running"); returnret; } while(fgets(buf,255,fp)!=NULL){ MYLOGD("readline====>%s",buf); if(strstr(buf,"myfridaserverarm64")!=NULL) { ret=0; break; } } pclose(fp); returnret; } //通過廣播發(fā)送當(dāng)前的fridaserver運(yùn)行狀態(tài),方便App中狀態(tài)更新 staticvoidbroadcast_frida_server_status(intstatus,constchar*portstr) { //ambroadcast-acom.android.myaction.FRIDA_SERVER_STATUS--esisRunning0 charcmd_buf[128]={0}; sprintf(cmd_buf,"ambroadcast-acom.android.myaction.FRIDA_SERVER_STATUS--esisRunning%d--esport%s",status,portstr); system(cmd_buf); MYLOGD("broadcast_frida_server_statussuccess"); } //線程處理函數(shù),根據(jù)屬性值來判斷fridaserver的啟動、停止 //1forstart //2forstop //3forrunning void*work_thread(void*m){ MYLOGD("work_threadstart"); while(1>0){ std::stringprop=android::GetProperty("sys.boot_completed",""); std::stringmyfrd=android::GetProperty("xro.start.myfrd",""); std::stringport_str=android::GetProperty("xro.start.myfrd.port","27042"); boolboot_ok=(prop=="1"); //boolbool_myfrd=(myfrd=="1"); MYLOGD("sys.boot_completed:%s",prop.c_str()); if(boot_ok){ intfrida_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("starttolaunchmyfridaserverarm64"); charcmd_buf[128]={0}; sprintf(cmd_buf, "killallmyfridaserverarm64 sleep1 myfridaserverarm64-l0.0.0.0:%s-D", port_str.c_str()); system(cmd_buf); MYLOGD("startmyfridaserverarm64finish"); android::SetProperty("xro.start.myfrd","3"); }elseif(myfrd=="0"){ MYLOGD("starttostopmyfridaserverarm64"); charcmd_buf[128]={0}; sprintf(cmd_buf,"killallmyfridaserverarm64"); if(frida_status>=0){ system(cmd_buf); } MYLOGD("stopmyfridaserverarm64finish"); }elseif(myfrd=="3"){ if(frida_status0)?{ ????????????????????//說明adbd?第一次啟動,并且狀態(tài)屬性為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母體調(diào)用system函數(shù)創(chuàng)建的。測試過程中如果adbd殺掉fridaserver也會被殺掉。所以為了防止fridaserver卡死的情況,增加屬性控制adbd重啟的功能。同時通過該屬性控制adbd重啟方便在修改模塊adbd的代碼之后編譯測試。
具體操作如下:
在文件init.rc中添加屬性控制adbd的配置信息,init.rc文件路徑如下:
systemcore ootdirinit.rc
添加的內(nèi)容為:
onproperty:xro.start.myadbd=1 stopadbd startadbd
5.編譯刷機(jī)驗證
5.1 編譯
參考命令如下:
qiang@ubuntu:~/lineageOs$sourcebuild/envsetup.sh qiang@ubuntu:~/lineageOs$breakfastoneplus3 qiang@ubuntu:~/lineageOs$brunchoneplus3 Lookingfordependenciesindevice/oneplus/oneplus3 Lookingfordependenciesindevice/oppo/common ....
5.2 刷機(jī)
參考命令:
qiang@ubuntu:~/lineageOs$adbpushout/target/product/oneplus3/lineage-17.1-20210324-UNOFFICIAL-oneplus3.zip/sdcard/update.zip out/target/product/oneplus3/lineage-17...28.1MB/s(783285269bytesin26.561s) qiang@ubuntu:~/lineageOs$ qiang@ubuntu:~/lineageOs$ qiang@ubuntu:~/lineageOs$adbrebootrecovery qiang@ubuntu:~/lineageOs$ qiang@ubuntu:~/lineageOs$ qiang@ubuntu:~/lineageOs$
5.3 測試驗證
測試關(guān)閉fridaserver服務(wù):
C:UsersQiang>adbshellsetpropxro.start.myfrd0
測試打開fridaserver服務(wù):
C:UsersQiang>adbshellsetpropxro.start.myfrd1
測試重啟adbd服務(wù):
C:UsersQiang>adbshellsetpropxro.start.myadbd1
審核編輯:湯梓紅
-
System
+關(guān)注
關(guān)注
0文章
165瀏覽量
36943 -
文件
+關(guān)注
關(guān)注
1文章
566瀏覽量
24744 -
端口
+關(guān)注
關(guān)注
4文章
964瀏覽量
32079 -
安卓系統(tǒng)
+關(guān)注
關(guān)注
0文章
273瀏覽量
20563
原文標(biāo)題:添加自定義屬性控制fridaserver啟動和停止
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論