1.屬性添加說明
為了通過安卓系統的屬性控制fridaserver啟動和停止,將加入如下屬性:
#該屬性控制啟動和停止frida #0:停止 1:啟動 xro.start.myfrd=0 #該屬性設置fridaserver啟動的端口,默認端口為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=" ...
由于新增的屬性需要在后續開發的具有System權限的App中設置和獲取。如果不配置系統App的selinux訪問策略,App將沒有權限進行屬性修改操作。由于adbd運行已經擁有了超級權限,adbd對新增的屬性具有讀取和設置的能力,所以可以不用為adbd配置訪問新增屬性的selinux策略。安卓系統中和selinux配置相關的目錄路徑如下:
systemsepolicy
新增屬性配置操作如下。
(1).定義屬性標簽類型"mysystem_prop"
在以下文件中添加自定義的屬性標簽類型定義,文件路徑如下:
systemsepolicypublicproperty.te systemsepolicyprebuiltsapi29.0publicproperty.te
自定義的屬性標簽定義如下:
typemysystem_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是否已經在運行了
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;
}
//通過廣播發送當前的fridaserver運行狀態,方便App中狀態更新
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");
}
//線程處理函數,根據屬性值來判斷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?第一次啟動,并且狀態屬性為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
添加的內容為:
onproperty:xro.start.myadbd=1
stopadbd
startadbd
5.編譯刷機驗證
5.1 編譯
參考命令如下:
qiang@ubuntu:~/lineageOs$sourcebuild/envsetup.sh
qiang@ubuntu:~/lineageOs$breakfastoneplus3
qiang@ubuntu:~/lineageOs$brunchoneplus3
Lookingfordependenciesindevice/oneplus/oneplus3
Lookingfordependenciesindevice/oppo/common
....
5.2 刷機
參考命令:
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 測試驗證
測試關閉fridaserver服務:
C:UsersQiang>adbshellsetpropxro.start.myfrd0
測試打開fridaserver服務:
C:UsersQiang>adbshellsetpropxro.start.myfrd1
測試重啟adbd服務:
C:UsersQiang>adbshellsetpropxro.start.myadbd1

審核編輯:湯梓紅
-
System
+關注
關注
0文章
166瀏覽量
38669 -
文件
+關注
關注
1文章
594瀏覽量
26054 -
端口
+關注
關注
4文章
1104瀏覽量
33963 -
安卓系統
+關注
關注
0文章
274瀏覽量
21460
原文標題:添加自定義屬性控制fridaserver啟動和停止
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
如何添加自定義單板
labview 的Xcontrol控件 的自定義屬性
如何讓自定義布爾控件的顏色屬性節點有效
如何自定義Component 屬性
Orcad中元器件自定義屬性方法
添加自定義屬性控制fridaserver啟動和停止
評論