1.安卓系統中配置后臺進程討論
在以下討論兩種selinux開啟的情況啟動frida-server的方法。
1.1 init.xx.rc文件中配置
在安卓系統中配置native后臺服務,主要是在init.xx.rc文件中添加服務配置信息。比如adbd后臺服務配置如下:
#adbdiscontrolledviapropertytriggersininit..usb.rc
serviceadbd/system/bin/adbd--root_seclabel=usu:s0
classcore
socketadbdseqpacket660systemsystem
disabled
seclabeluadbd:s0
這種方法配置主要是通過init進程進行啟動管理。如果配置的后臺進程服務的功能需要超級root權限操作的,最好關閉selinux的情況下進行配置。
以下是通過init.xx.rc文件中配置啟動fridaserver的一個參考配置:
servicemyfridaserver/system/bin/myfridaserverarm64-D
classmain
userroot
seclabeluinit:s0
1.2 進程中啟動服務配置
可以選擇合適的后臺進程,調用 system函數進行服務啟動。比如選擇超級 root權限的adbd、或者root權限的init進程。
1.3 兩種方式的測試
在內置fridaserver的過程中,分別對以上兩種方式進行了測試。
-
init.xx.rc中國配置
在開啟 selinux的情況下,由于 init進程被限制了很多功能,比如禁止ptrace其他進程,會導致失敗。所以該種配置需要根據需要內置服務的功能進行分析,是否適合。雖然init進程運行的是root用戶運行,但是selinux的域為init,被限制了很多特權功能。如果不在乎selinux,可以關閉selinux之后進行內置。
-
進程中啟動服務
進程中啟動服務主要是需要找到權限高的進程作為母體。比如像 init進程、adbd進程。在測試過程中,selinux打開的情況下雖然init進程root用戶運行,但是selinux標簽init限制了很多特權,所以不大適合啟動fridaserver。在上一篇文章中已經實現了adbd以root權限運行,并且運行標簽變成了usu:s0,所以adbd作為母體啟動服務之后,服務就存在了超級權限,比較適合fridaserver這種需要特權的服務。
以下是通過命令查看的系統init進程和adbd進程運行的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中啟動fridaserver開發
2.1 查找合適的啟動入口
在adbd啟動過程中,會根據傳入的參數如果存在root_seclabel會將adbd進程的域由uadbd:s0修改為"usu:s0"域。具體相關邏輯位于文件"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){
//修改當前進程的域為usu:s0,從而獲得超級權限
if(selinux_android_setcon(root_seclabel)0){
LOG(FATAL)<"CouldnotsetSELinuxcontext";
}
//TODO可以考慮在此處添加啟動的邏輯
}
...
}
}
}
通過以上分析我們可以在adbd設置root_seclable成功之后加入啟動frida-server的啟動邏輯。
2.2 添加啟動核心代碼
添加如下方法實現啟動 fridaserver進程。
//線程處理函數,主要是判斷手機重啟完成之后再去啟動**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;
}
//創建線程等待手機啟動完成之后啟動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!");
}
以上邏輯中判斷手機完全重啟了才啟動。
在設置 root_label的地方加入調用,參考代碼如下:
staticvoiddrop_privileges(intserver_port){
ScopedMinijailjail(minijail_new());
...
if(should_drop_privileges()){
...
}else{
//minijail_enter()willabortifanypriv-droppingstepfails.
minijail_enter(jail.get());
if(root_seclabel!=nullptr){
//修改當前進程的域為usu:s0,從而獲得超級權限
if(selinux_android_setcon(root_seclabel)0){
LOG(FATAL)<"CouldnotsetSELinuxcontext";
}
//TODO可以考慮在此處添加啟動的邏輯
start_fridaserver_once();
}
...
}
}
}
3.編譯測試
3.1 編譯adb模塊
參考命令:
//完整編譯手機鏡像參考命令
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到手機
由于之前我們已經刷了一次自己編譯的手機鏡像。所以此處只修改了adbd模塊,可以只編譯單個模塊替換手機系統的就可以。參考命令:
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 重啟手機測試
參考如下命令:
//查看當前內置的fridaserver是否開機之后自動啟動
C:UsersQiang>adbreboot
C:UsersQiang>adbshellps-Z|findstr"myfridaserver"
usu:s0root3216113942443008poll_schedule_timeout7da95663c8Smyfridaserverarm64
//測試手機frida-server是否能連接上
C:UsersQiang>frida-ps-U
PIDName
-------------------------------------------------------
2190.dataservices
3290.dataservices
2305.qtidataservices
...
-
進程
+關注
關注
0文章
202瀏覽量
13947 -
安卓系統
+關注
關注
0文章
273瀏覽量
20535 -
root
+關注
關注
1文章
85瀏覽量
21376
原文標題:配置fridaserver為后臺進程
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論