一杠愧、檢測(cè)調(diào)試
當(dāng)一個(gè)應(yīng)用被調(diào)試的時(shí)候淆九,會(huì)給進(jìn)程設(shè)置一個(gè)標(biāo)識(shí)(P_TRACED)劲蜻,我們可以通過檢測(cè)該進(jìn)程是否有設(shè)置這個(gè)標(biāo)識(shí)來(lái)檢測(cè)進(jìn)程是否正在被調(diào)試以保護(hù)好我們的應(yīng)用纹安。
為了讓這個(gè)函數(shù)以inline方式編譯尤辱,需要設(shè)置編譯器的優(yōu)化選項(xiàng),-0z(函數(shù)以inline方式編譯)厢岂,-fast(加快編譯速度)光督。
如果你不確信產(chǎn)生的目標(biāo)代碼以inline的方式編譯該函數(shù),你也可以將其轉(zhuǎn)化成宏的方式塔粒。
當(dāng)前該方法只能檢測(cè)debugger或dtrace的調(diào)試结借,而不能阻止非法代碼注入或者cycript依附。
二卒茬、阻止調(diào)試(阻止GDB依附)
調(diào)用ptrace設(shè)置參數(shù)PT_DENY_ATTACH船老,如果有調(diào)試器依附,則會(huì)產(chǎn)生錯(cuò)誤并退出圃酵。關(guān)于PT_DENY_ATTACH的說明如下:
這時(shí)再使用gdb attach的話會(huì)產(chǎn)生錯(cuò)誤:
Segmentation fault: 11
或者使用gdb run該應(yīng)用也會(huì)產(chǎn)生錯(cuò)誤:
Program exited with code 055.
當(dāng)然該方法也會(huì)被調(diào)試者下斷點(diǎn)的方式來(lái)動(dòng)態(tài)繞過或者使用IDA等反匯編工具打補(bǔ)丁繞過柳畔,所以我們應(yīng)該在程序的多處地方調(diào)用該方式。