今天有一個(gè)需求,需要對(duì)項(xiàng)目進(jìn)行反調(diào)試處理 ?查看了很多的博客,終于找到了,大多寫的不是很全.我總結(jié)下.
一般使用
? ? ptrace_ptr(PT_DENY_ATTACH,0,0,0);來(lái)反調(diào)試捺氢。
首先要在工程的main.m類中導(dǎo)入頭文件#include<dlfcn.h>,
我查找了幾篇博客都沒(méi)寫這個(gè),導(dǎo)致了很多錯(cuò)誤.
然后就是代碼部分了
typedefint(*ptrace_ptr_t)(int_request,pid_t_pid,caddr_t_addr,int_data);
void* dlopen(constchar* pathname,intmode );
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH31
#endif? // !defined(PT_DENY_ATTACH)
voiddisable_gdb() {
? ? void* handle =dlopen(0,RTLD_GLOBAL|RTLD_NOW);
? ? ptrace_ptr_tptrace_ptr =dlsym(handle,"ptrace");
? ? ptrace_ptr(PT_DENY_ATTACH,0,0,0);
? ? dlclose(handle);
}
最后在 main 函數(shù)中調(diào)用
intmain(intargc,char* argv[]) {
?? ?/**防止GDB掛起*/
#ifndef DUBUG
? ? disable_gdb();
#endif
? ? @autoreleasepool {
? ? ? ? return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
? ? }
}
不過(guò)還有反反調(diào)試,可以破解反調(diào)試的.
1,ptrace這個(gè)函數(shù)很容易修改,幾種破解方式
運(yùn)行時(shí)期扁远,斷點(diǎn)ptrace酬荞,直接返回 :
通過(guò)tweak,替換disable_gdb函數(shù)
在二進(jìn)制文件中 粟瞬,修改 PT_DENY_ATTACH的31,改成 任意一個(gè)值同仆,如PT_ATTACH 0.
2,開(kāi)發(fā)者要達(dá)到反調(diào)試的目的,必然是在某個(gè)地方(大多數(shù)還是在main函數(shù))執(zhí)行了ptrace(PT_DENY_ATTACH, 0, 0, 0)裙品。所以反反調(diào)試的思路非常簡(jiǎn)單俗批,就是阻止這個(gè)執(zhí)行的發(fā)生。
既然lldb有-w這個(gè)選項(xiàng)來(lái)等待一個(gè)進(jìn)程的啟動(dòng)市怎,你可以使用lldb來(lái)捕獲到一個(gè)進(jìn)程的啟動(dòng)并在程序執(zhí)行到ptrace命令之前修改或忽略PT_DENY_ATTACH命令岁忘。
命令行執(zhí)行:? ~ sudo lldb -n "helloptrace" -w。這里用sudo是因?yàn)閘ldb的一個(gè)bug区匠,當(dāng)你讓lldb等待某個(gè)進(jìn)程的啟動(dòng)時(shí)不用sudo會(huì)出錯(cuò)干像。
找到上述項(xiàng)目的二進(jìn)制文件,拖到命令行中執(zhí)行驰弄,然后lldb就應(yīng)該能夠成功attach上去:
?? ~ sudo lldb -n"helloptrace"-w(lldb) process attach --name"helloptrace"--waitforProcess 8336 stopped* thread#1, stop reason = signal SIGSTOPframe#0: 0x0000000109522b9a dyld`__ioctl + 10dyld`__ioctl:->? 0x109522b9a <+10>: jae? ? 0x109522ba4? ? ? ? ? ? ? ; <+20>? ? 0x109522b9c <+12>: mov? ? rdi, rax? ? 0x109522b9f <+15>: jmp? ? 0x109522325? ? ? ? ? ? ? ; cerror? ? 0x109522ba4 <+20>: retExecutable modulesetto"/Users/gogleyin/Library/Developer/Xcode/DerivedData/helloptrace-bjtaxdebpzdyraaogpbcrihdgwku/Build/Products/Debug/helloptrace".Architecturesetto: x86_64h-apple-macosx.
創(chuàng)建如下斷點(diǎn):
(lldb) rb ptrace -s libsystem_kernel.dylib
continue繼續(xù)執(zhí)行后你就會(huì)在ptrace函數(shù)將要執(zhí)行時(shí)停下來(lái)麻汰。你可以用lldb來(lái)讓程序不執(zhí)行那個(gè)函數(shù)并提前返回:
(lldb) thread return 0
continue繼續(xù)執(zhí)行,一個(gè)反反調(diào)試就達(dá)成了戚篙!雖然程序進(jìn)入了ptrace函數(shù)五鲫,但你是告訴lldb讓它提前返回使得函數(shù)邏輯沒(méi)有得到執(zhí)行。
參考博客:
鏈接:http://www.reibang.com/p/75776311ae36
鏈接:http://www.reibang.com/p/13e90ec55234
鏈接:https://segmentfault.com/a/1190000012216003