1. 程式人生 > >Android雙程序保護實現的思考及過程說明

Android雙程序保護實現的思考及過程說明

採用雙程序的方式,對父程序進行保護,基於訊號的傳送和接收,實現相互的保護防止被動態攻擊。

雙程序程序保護主要功能:
1、保護父程序,ptrace所有執行緒,防止被附加、除錯、暫停;
2、保護子程序,防止被暫停、異常退出;

對應說明圖:
雙程序實現說明圖

不足之處與修補思考:
子程序未被ptrace,可以通過向子程序注入並ptrace PTRACE_DETACH實現解除反附加

改進:
減少對主程序其中一個執行緒的附加,使子程序能被該執行緒附加,減去子程序的弱點,但同時卻給主程序留下一個坑點。

對應說明圖:
雙程序實現改進說明圖

針對實現過程的一些說明:
1、為什麼子程序可以監聽父程序訊號?
使用ptrace後,父程序的parent會相應轉變為ptrace程序,此時parent不一定等於real_parent。

2、主程序能被ptrace的條件?
主程序需使用prctl函式,設定PR_SET_DUMPABLE為1,prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)

3、隱藏子程序一個小技巧
如果子程序是通過執行可執行檔案進行建立的,可以通過直接對引數argv地址內容進行修改,保證子程序的檔名及引數隱藏,有利於干擾動態分析,或者使用 prctl(PR_SET_NAME, new_name);進行修改

4、如何監聽不斷建立的新執行緒
ptrace提供了一個PTRACE_SETOPTIONS選項,可以設定監聽執行緒呼叫一些函式的操作,這些函式包括PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEFORK,可以保證當子執行緒建立時仍然被監聽。

5、監聽訊號
子程序
WIFSIGNALED:監聽執行緒退出
WIFSTOPPED :監聽執行緒暫停及恢復
WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP : 新執行緒被建立完成後,收到的訊號,或者遇到斷點時
WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP : 當一個執行緒建立另一個執行緒返回時,收到的訊號,此處需注意,此時建立的子執行緒被暫停,ptrace(PTRACE_GETEVENTMSG, pid, 0, &new_pid)獲取新執行緒ID,並恢復執行

主程序
WIFSIGNALED:監聽執行緒退出
WIFSTOPPED :監聽執行緒暫停及恢復