iOS防護(hù) ptrace反調(diào)試

在 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

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容