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

2019-02-17  本文已影响18人  king_jensen

一、采用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来定位防护代码了.

上一篇下一篇

猜你喜欢

热点阅读