防debug的猫腻

反debug

一、防护debug

1、ptrace(process trace 进程跟踪)
    此函数提供了一个进程监听控制另一个进程,并且可以检测到被控制进程的内存和寄存器里面的数据。它可以用来实现断点调试和系统调用跟踪。debugserver就是用的它。
2、在代码中加入
    ptrace(PT_DENY_ATTACH,0,0,0)进行防护
    参数讲解
    /*
        arg1:ptrace要做的事情
        arg2:要操作的进程
        arg3(地址)、arg4(数据):取决于arg1
    */  

二、反-防护debug

1、下载fishhook
2、动态库注入
3、代码
//定义指针,保存原来的函数地址
int (*ptrace_p)(int _request, pid_t _pid, caddr_t _addr, int _data);

//定义自己的函数
int my_ptrace(int _request, pid_t _pid, caddr_t _addr, int _data){
    if (_request != PT_DENY_ATTACH) {//如果不是拒绝连接,就保持调用
        return ptrace_p(PT_DENY_ATTACH,_pid,_addr,_data);
    }
    //如果是拒绝加载,就不执行直接return
    return 0;
}

+(void)load
{
    //交换
    struct rebinding ptraceBd;//fishHook的绑定结构体
    ptraceBd.name = "ptrace";//函数名称
    ptraceBd.replacement = my_ptrace;//新函数地址
    ptraceBd.replaced = (void *)&ptrace_p;//原始函数地址的指针
    //弄一个数组,放fishHook的绑定结构体
    struct rebinding bindings[] = {ptraceBd};
    //fishHook的重绑定函数
    rebind_symbols(bindings, 1);
}

三、反-反-防护debug

1、其实就是反fishhook。
2、依据动态库的加载顺序,在app中加入反debug的动态库,这样因为顺序优先于黑客注入的动态库,所以又防住了。

四、小知识点

1、应用中的动态库的加载顺序-从上到下


防debug的猫腻_第1张图片
动态库.jpg

2、最后才是加载我们APP的Mach-O.

你可能感兴趣的:(防debug的猫腻)