在 iPhone 上運行 App,然后通過 GDB 進(jìn)行動態(tài)調(diào)試,是大多數(shù)攻擊者的首選。
本文主要介紹兩種反調(diào)試的方法。
1.ptrace反調(diào)試,阻止GDB依附
//ptrace反調(diào)試
#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t pid, caddr_t _addr, int _data);
#if !defined(PT_DENT_ATTACH)
#define PT_DENT_ATTACH 31
#endif
void disable_gdb() {
? ? void * handle = dlopen(0, RTLD_GLOBAL|RTLD_NOW);
? ? ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
? ? ptrace_ptr(PT_DENT_ATTACH, 0, 0, 0);
? ? dlclose(handle);
}
2.sysctl反調(diào)試
//sysctl反調(diào)試
#import <sys/sysctl.h>
#import <sys/types.h>
#import <unistd.h>
/*
函數(shù)的返回值若為0時,證明沒有錯誤,其他數(shù)字為錯誤碼。
arg1 傳入一個數(shù)組,該數(shù)組中的第一個元素指定本請求定向到內(nèi)核的哪個子系統(tǒng)。第二個及其后元素依次細(xì)化指定該系統(tǒng)的某個部分。
arg2 數(shù)組中的元素數(shù)目
arg3 一個結(jié)構(gòu)體,指向一個供內(nèi)核存放該值的緩沖區(qū),存放進(jìn)程查詢結(jié)果
arg4 緩沖區(qū)的大小
arg5/arg6 為了設(shè)置某個新值,arg5參數(shù)指向一個大小為arg6參數(shù)值的緩沖區(qū)。如果不準(zhǔn)備指定一個新值,那么arg5應(yīng)為一個空指針,arg6因為0.
*/
//int sysctl(int *, u_int, void *, size_t *, void *, size_t);
static bool is_debugger_present(void) {
? ? int name[4];//存放字節(jié)碼,查詢信息
? ? struct kinfo_proc info;//接受進(jìn)程查詢結(jié)果信息的結(jié)構(gòu)體
? ? size_t info_size = sizeof(info);//結(jié)構(gòu)體的大小
? ? info.kp_proc.p_flag = 0;
? ? name[0] = CTL_KERN;//內(nèi)核查看
? ? name[1] = KERN_PROC;//進(jìn)程查看
? ? name[2] = KERN_PROC_PID;//進(jìn)程ID
? ? name[3] = getpid();//獲取pid,據(jù)說這個可以直接傳0?
? ? int proc_err = sysctl(name, 4, &info, &info_size, NULL, 0);
? ? if (proc_err == -1) { //判斷是否出現(xiàn)了異常
? ? ? ? exit(-1);
? ? }
3.syscall
#import <sys/syscall.h>
syscall(SYS_ptrace,PT_DENT_ATTACH,0,0,0);
4.ioctl
#import <sys/ioctl.h>
void Anti_ioctl()?
{
?if (!ioctl(1, TIOCGWINSZ))?
{?
?exit(1);?
?}
}
5.內(nèi)聯(lián) svc + ptrace 實現(xiàn)和內(nèi)聯(lián) svc + syscall + ptrace 實現(xiàn)
static __attribute__((always_inline)) void AntiDebugASM() {
#ifdef __arm__
? ? asm volatile(
? ? ? ? ? ? ? ? "mov r0,#31\n"
? ? ? ? ? ? ? ? "mov r1,#0\n"
? ? ? ? ? ? ? ? "mov r2,#0\n"
? ? ? ? ? ? ? ? "mov r12,#26\n"
? ? ? ? ? ? ? ? "svc #80\n"
? ? ? ? ? ? ? ? );
#endif
#ifdef __arm64__
? ? asm volatile(
? ? ? ? ? ? ? ? "mov x0,#26\n"
? ? ? ? ? ? ? ? "mov x1,#31\n"
? ? ? ? ? ? ? ? "mov x2,#0\n"
? ? ? ? ? ? ? ? "mov x3,#0\n"
? ? ? ? ? ? ? ? "mov x16,#0\n"
? ? ? ? ? ? ? ? "svc #128\n"
? ? ? ? ? ? ? ? );
#endif
}