反debug
一凛驮、防護(hù)debug
1黔夭、ptrace(process trace 進(jìn)程跟蹤)
此函數(shù)提供了一個(gè)進(jìn)程監(jiān)聽控制另一個(gè)進(jìn)程本姥,并且可以檢測到被控制進(jìn)程的內(nèi)存和寄存器里面的數(shù)據(jù)厂僧。它可以用來實(shí)現(xiàn)斷點(diǎn)調(diào)試和系統(tǒng)調(diào)用跟蹤颜屠。debugserver就是用的它。
2密浑、在代碼中加入
ptrace(PT_DENY_ATTACH,0,0,0)進(jìn)行防護(hù)
參數(shù)講解
/*
arg1:ptrace要做的事情
arg2:要操作的進(jìn)程
arg3(地址)粗井、arg4(數(shù)據(jù)):取決于arg1
*/
二浇衬、反-防護(hù)debug
1、下載fishhook
2胆剧、動態(tài)庫注入
3、代碼
//定義指針,保存原來的函數(shù)地址
int (*ptrace_p)(int _request, pid_t _pid, caddr_t _addr, int _data);
//定義自己的函數(shù)
int my_ptrace(int _request, pid_t _pid, caddr_t _addr, int _data){
if (_request != PT_DENY_ATTACH) {//如果不是拒絕連接,就保持調(diào)用
return ptrace_p(PT_DENY_ATTACH,_pid,_addr,_data);
}
//如果是拒絕加載,就不執(zhí)行直接return
return 0;
}
+(void)load
{
//交換
struct rebinding ptraceBd;//fishHook的綁定結(jié)構(gòu)體
ptraceBd.name = "ptrace";//函數(shù)名稱
ptraceBd.replacement = my_ptrace;//新函數(shù)地址
ptraceBd.replaced = (void *)&ptrace_p;//原始函數(shù)地址的指針
//弄一個(gè)數(shù)組,放fishHook的綁定結(jié)構(gòu)體
struct rebinding bindings[] = {ptraceBd};
//fishHook的重綁定函數(shù)
rebind_symbols(bindings, 1);
}
三、反-反-防護(hù)debug
1铃绒、其實(shí)就是反fishhook。
2矮燎、依據(jù)動態(tài)庫的加載順序漏峰,在app中加入反debug的動態(tài)庫届榄,這樣因?yàn)轫樞騼?yōu)先于黑客注入的動態(tài)庫铝条,所以又防住了席噩。
四、小知識點(diǎn)
1埠忘、應(yīng)用中的動態(tài)庫的加載順序-從上到下
動態(tài)庫.jpg
2莹妒、最后才是加載我們APP的Mach-O.