一、檢測調(diào)試
當(dāng)一個應(yīng)用被調(diào)試的時候,會給進(jìn)程設(shè)置一個標(biāo)識(P_TRACED),我們可以通過檢測該進(jìn)程是否有設(shè)置這個標(biāo)識來檢測進(jìn)程是否正在被調(diào)試以保護(hù)好我們的應(yīng)用。
為了讓這個函數(shù)以inline方式編譯,需要設(shè)置編譯器的優(yōu)化選項(xiàng),-0z(函數(shù)以inline方式編譯),-fast(加快編譯速度)。
如果你不確信產(chǎn)生的目標(biāo)代碼以inline的方式編譯該函數(shù),你也可以將其轉(zhuǎn)化成宏的方式。
當(dāng)前該方法只能檢測debugger或dtrace的調(diào)試,而不能阻止非法代碼注入或者cycript依附。
二、阻止調(diào)試(阻止GDB依附)
調(diào)用ptrace設(shè)置參數(shù)PT_DENY_ATTACH,如果有調(diào)試器依附,則會產(chǎn)生錯誤并退出。關(guān)于PT_DENY_ATTACH的說明如下:

這時再使用gdb attach的話會產(chǎn)生錯誤:
Segmentation fault: 11
或者使用gdb run該應(yīng)用也會產(chǎn)生錯誤:
Program exited with code 055.

當(dāng)然該方法也會被調(diào)試者下斷點(diǎn)的方式來動態(tài)繞過或者使用IDA等反匯編工具打補(bǔ)丁繞過,所以我們應(yīng)該在程序的多處地方調(diào)用該方式。