美文网首页
iOS安全攻防之ptrace等系统函数的调用方式

iOS安全攻防之ptrace等系统函数的调用方式

作者: king_jensen | 来源:发表于2019-02-17 14:17 被阅读18次

    一、采用dloen+dlsym调用ptrace

     //拼接一个 ptrace
        unsigned char funcStr[] = {
            ('a' ^ 'p'),
            ('a' ^ 't'),
            ('a' ^ 'r'),
            ('a' ^ 'a'),
            ('a' ^ 'c'),
            ('a' ^ 'e'),
            ('a' ^ '\0'),
        };
        unsigned char * p = funcStr;
        while (((*p) ^= 'a') != '\0') p++;
        
        //通过dlopen拿到句柄
        void * handle = dlopen("/usr/lib/system/libsystem_kernel.dylib", RTLD_LAZY);
        //定义函数指针
        int (*ptrace_p)(int _request, pid_t _pid, caddr_t _addr, int _data);
        
        if (handle) {
            ptrace_p = dlsym(handle, (const char *)funcStr);
            if (ptrace_p) {
                ptrace_p(PT_DENY_ATTACH, 0, 0, 0 );
            }
        }
    

    使用该方法调用ptrace可以使fishhook hook ptrace失效。

    二、syscall调用方式

    /**
    1.参数是函数编号
    2.其他的就是参数顺序
    */
    syscall(26,31,0,0);
    

    如何知道编号26是ptrace,可以查看 <sys/syscall.h>


    8D734A58FF3C224680D5F68F078F5E91.png

    以上两种方式虽然可以防止fishhook直接重绑定对应的系统函数,但是还是可以通过符号断点找到调用的系统函数(ptrance,syscall,sysctrl等等)

    三、使用汇编进行系统调用

        asm volatile(
                         "mov x0,#31\n"
                         "mov x1,#0\n"
                         "mov x2,#0\n"
                         "mov x3,#0\n"
                         "mov x16,#26\n"//中断根据x16 里面的值,跳转ptrace
                         "svc #0x80\n"//这条指令就是触发中断(系统级别的跳转!)
                         );
    
    #ifdef __arm64__
        asm(
            "mov x0,#0\n"
            "mov w16,#1\n"
            "svc #0x80\n"
        );
    #endif
    #ifdef __arm__ //32位下
        asm(
            "mov r0,#0\n"
            "mov r12,#1\n"
            "svc #80\n"
        );
    #endif
    

    使用这种方式调用系统函数(ptrace,syscall,sysctrl)进行防护,就只能通过去找代码块中的指令svc #0x80来定位防护代码了.

    相关文章

      网友评论

          本文标题:iOS安全攻防之ptrace等系统函数的调用方式

          本文链接:https://www.haomeiwen.com/subject/zulgeqtx.html