1.安卓系統(tǒng)中配置后臺進(jìn)程討論
在以下討論兩種selinux開啟的情況啟動(dòng)frida-server的方法。
1.1 init.xx.rc文件中配置
在安卓系統(tǒng)中配置native后臺服務(wù),主要是在init.xx.rc文件中添加服務(wù)配置信息。比如adbd后臺服務(wù)配置如下:
#adbdiscontrolledviapropertytriggersininit..usb.rc
serviceadbd/system/bin/adbd--root_seclabel=usu:s0
classcore
socketadbdseqpacket660systemsystem
disabled
seclabeluadbd:s0
這種方法配置主要是通過init進(jìn)程進(jìn)行啟動(dòng)管理。如果配置的后臺進(jìn)程服務(wù)的功能需要超級root權(quán)限操作的,最好關(guān)閉selinux的情況下進(jìn)行配置。
以下是通過init.xx.rc文件中配置啟動(dòng)fridaserver的一個(gè)參考配置:
servicemyfridaserver/system/bin/myfridaserverarm64-D
classmain
userroot
seclabeluinit:s0
1.2 進(jìn)程中啟動(dòng)服務(wù)配置
可以選擇合適的后臺進(jìn)程,調(diào)用 system函數(shù)進(jìn)行服務(wù)啟動(dòng)。比如選擇超級 root權(quán)限的adbd、或者root權(quán)限的init進(jìn)程。
1.3 兩種方式的測試
在內(nèi)置fridaserver的過程中,分別對以上兩種方式進(jìn)行了測試。
-
init.xx.rc中國配置
在開啟 selinux的情況下,由于 init進(jìn)程被限制了很多功能,比如禁止ptrace其他進(jìn)程,會(huì)導(dǎo)致失敗。所以該種配置需要根據(jù)需要內(nèi)置服務(wù)的功能進(jìn)行分析,是否適合。雖然init進(jìn)程運(yùn)行的是root用戶運(yùn)行,但是selinux的域?yàn)?strong style="font-size:inherit;color:inherit;line-height:inherit;">init,被限制了很多特權(quán)功能。如果不在乎selinux,可以關(guān)閉selinux之后進(jìn)行內(nèi)置。
-
進(jìn)程中啟動(dòng)服務(wù)
進(jìn)程中啟動(dòng)服務(wù)主要是需要找到權(quán)限高的進(jìn)程作為母體。比如像 init進(jìn)程、adbd進(jìn)程。在測試過程中,selinux打開的情況下雖然init進(jìn)程root用戶運(yùn)行,但是selinux標(biāo)簽init限制了很多特權(quán),所以不大適合啟動(dòng)fridaserver。在上一篇文章中已經(jīng)實(shí)現(xiàn)了adbd以root權(quán)限運(yùn)行,并且運(yùn)行標(biāo)簽變成了usu:s0,所以adbd作為母體啟動(dòng)服務(wù)之后,服務(wù)就存在了超級權(quán)限,比較適合fridaserver這種需要特權(quán)的服務(wù)。
以下是通過命令查看的系統(tǒng)init進(jìn)程和adbd進(jìn)程運(yùn)行的selinux域的情況:
C:UsersQiang>adbshellps-Z|findstr"adbd"
usu:s0root1143111359604564poll_schedule_timeout794c9aa3c8Sadbd
C:UsersQiang>adbshellps-Z|findstr"init"
uinit:s0root10869848240SyS_epoll_wait76f889a248Sinit
uvendor_init:s0root4541397365256poll_schedule_timeout79937963c8Sinit
uvendor_init:s0root4551389684328poll_schedule_timeout74340f23c8Sinit
二、adbd中啟動(dòng)fridaserver開發(fā)
2.1 查找合適的啟動(dòng)入口
在adbd啟動(dòng)過程中,會(huì)根據(jù)傳入的參數(shù)如果存在root_seclabel會(huì)將adbd進(jìn)程的域由uadbd:s0修改為"usu:s0"域。具體相關(guān)邏輯位于文件"systemcoreadbdaemonmain.cpp" 中,代碼如下:
staticvoiddrop_privileges(intserver_port){
ScopedMinijailjail(minijail_new());
...
if(should_drop_privileges()){
...
}else{
//minijail_enter()willabortifanypriv-droppingstepfails.
minijail_enter(jail.get());
if(root_seclabel!=nullptr){
//修改當(dāng)前進(jìn)程的域?yàn)閡su:s0,從而獲得超級權(quán)限
if(selinux_android_setcon(root_seclabel)0){
LOG(FATAL)<"CouldnotsetSELinuxcontext";
}
//TODO可以考慮在此處添加啟動(dòng)的邏輯
}
...
}
}
}
通過以上分析我們可以在adbd設(shè)置root_seclable成功之后加入啟動(dòng)frida-server的啟動(dòng)邏輯。
2.2 添加啟動(dòng)核心代碼
添加如下方法實(shí)現(xiàn)啟動(dòng) fridaserver進(jìn)程。
//線程處理函數(shù),主要是判斷手機(jī)重啟完成之后再去啟動(dòng)**fridaserver**
void*work_thread_once(void*m)
{
MYLOGD("work_threadstart");
while(1>0)
{
std::stringprop=android::GetProperty("sys.boot_completed","");
MYLOGD("start_fridaserver_oncesys.boot_completed:%s",prop.c_str());
boolboot_ok=(prop=="1");
//boolbool_myfrd=(myfrd=="1");
MYLOGD("start_fridaserver_oncesys.boot_completed:%s",prop.c_str());
if(boot_ok)
{
break;
}
sleep(4);
}
std::stringport_str="27042";
MYLOGD("start_fridaserver_oncestarttolaunchmyfridaserverarm64");
charcmd_buf[128]={0};
sprintf(cmd_buf,"killallmyfridaserverarm64
sleep1
myfridaserverarm64-l0.0.0.0:%s-D",port_str.c_str());
system(cmd_buf);
MYLOGD("start_fridaserver_oncestartmyfridaserverarm64finish");
returnNULL;
}
//創(chuàng)建線程等待手機(jī)啟動(dòng)完成之后啟動(dòng)fridaserver
staticvoidstart_fridaserver_once()
{
MYLOGD("start_fridaserver_oncestart");
pthread_tthread_id;
inti=9;
pthread_create(&thread_id,NULL,&work_thread_once,(void*)&i);
MYLOGD("start_fridaserver_oncethreadiscreated!");
}
以上邏輯中判斷手機(jī)完全重啟了才啟動(dòng)。
在設(shè)置 root_label的地方加入調(diào)用,參考代碼如下:
staticvoiddrop_privileges(intserver_port){
ScopedMinijailjail(minijail_new());
...
if(should_drop_privileges()){
...
}else{
//minijail_enter()willabortifanypriv-droppingstepfails.
minijail_enter(jail.get());
if(root_seclabel!=nullptr){
//修改當(dāng)前進(jìn)程的域?yàn)閡su:s0,從而獲得超級權(quán)限
if(selinux_android_setcon(root_seclabel)0){
LOG(FATAL)<"CouldnotsetSELinuxcontext";
}
//TODO可以考慮在此處添加啟動(dòng)的邏輯
start_fridaserver_once();
}
...
}
}
}
3.編譯測試
3.1 編譯adb模塊
參考命令:
//完整編譯手機(jī)鏡像參考命令
qiang@ubuntu:~/lineageOs$sourcebuild/envsetup.sh
qiang@ubuntu:~/lineageOs$breakfastoneplus3
qiang@ubuntu:~/lineageOs$brunchoneplus3
//只編譯adbd模塊參考
qiang@ubuntu:~/lineageOs$makeadbd
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=10
LINEAGE_VERSION=17.1-20210324-UNOFFICIAL-oneplus3
...
3.2 push到手機(jī)
由于之前我們已經(jīng)刷了一次自己編譯的手機(jī)鏡像。所以此處只修改了adbd模塊,可以只編譯單個(gè)模塊替換手機(jī)系統(tǒng)的就可以。參考命令:
qiang@ubuntu:~/lineageOs$adbdevices
*daemonnotrunning;startingnowattcp:5037
*daemonstartedsuccessfully
Listofdevicesattached
d5cc1133device
qiang@ubuntu:~/lineageOs$adbremount
[libfs_mgr]dt_fstab:Skipdisabledentryforpartitionvendor
[libfs_mgr]dt_fstab:Skipdisabledentryforpartitionvendor
[libfs_mgr]dt_fstab:Skipdisabledentryforpartitionvendor
remountsucceeded
qiang@ubuntu:~/lineageOs$adbpushout/target/product/oneplus3/system/bin/adbd/system/bin/adbd
out/target/product/oneplus3/system/bin...shed.0.9MB/s(30608bytesin0.034s)
qiang@ubuntu:~/lineageOs$
qiang@ubuntu:~/lineageOs$
3.3 重啟手機(jī)測試
參考如下命令:
//查看當(dāng)前內(nèi)置的fridaserver是否開機(jī)之后自動(dòng)啟動(dòng)
C:UsersQiang>adbreboot
C:UsersQiang>adbshellps-Z|findstr"myfridaserver"
usu:s0root3216113942443008poll_schedule_timeout7da95663c8Smyfridaserverarm64
//測試手機(jī)frida-server是否能連接上
C:UsersQiang>frida-ps-U
PIDName
-------------------------------------------------------
2190.dataservices
3290.dataservices
2305.qtidataservices
...
-
進(jìn)程
+關(guān)注
關(guān)注
0文章
203瀏覽量
13960 -
安卓系統(tǒng)
+關(guān)注
關(guān)注
0文章
273瀏覽量
20554 -
root
+關(guān)注
關(guān)注
1文章
86瀏覽量
21389
原文標(biāo)題:配置fridaserver為后臺進(jìn)程
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論