关于反调试及反反调试那些事

前言

在逆向和保护的过程中,总会涉及到反调试和反反调试的问题,这篇文章主要是总结一下几种常见的反调试手段以及反反调试的方法。

反调试

ptrace的

为了方便应用软件的开发和调试,从Unix的的早期版本开始就提供了一种对运行中的进程进行跟踪和控制的手段,那就是系统调用ptrace()。 通过ptrace可以对另一个进程实现调试跟踪,同时ptrace还提供了一个非常有用的参数那就是PT_DENY_ATTACH,这个参数用来告诉系统,阻止调试器依附。

所以常用最反的调试方案就是通过调用ptrace来实现反调试。

#ifndef PT_DENY_ATTACH
    #define PT_DENY_ATTACH 31
#endif

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);

ptrace(PT_DENY_ATTACH, 0, 0, 0);

void *handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = (ptrace_ptr_t)dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);

复制代码
的sysctl

当一个进程被调试的时候,该进程会有一个标记来标记自己正在被调试,所以通过可以sysctl去查看当前进程的信息,看有没有这个标记位即可检查当前调试状态。

BOOL isDebuggerPresent(){
    int name[4];                //指定查询信息的数组

    struct kinfo_proc info;     //查询的返回结果
    size_t info_size = sizeof(info);

    info.kp_proc.p_flag = 0;

    name[0] = CTL_KERN;
    name[1] = KERN_PROC;
    name[2] = KERN_PROC_PID;
    name[3] = getpid();         

    if(sysctl(name, 4, &info, &info_size, NULL, 0) == -1){
        NSLog(@"sysctl error ...");
        return NO;
    }

    return ((info.kp_proc.p_flag & P_TRACED) != 0);
}

复制代码

检测到调试器就退出,或者制造崩溃,或者隐藏工程啥的,当然也可以定时去查看有没有这个标记。

系统调用

为从实现从用户态切换到内核态,系统提供了一个系统调用函数syscall,讲到上面的ptrace也是通过系统-调用去实现的。

Kernel Syscalls 71 这里可以找到对应ptrace的编号。

26\. ptrace               801e812c T

复制代码

所以如下的调用等同于调用ptrace

    syscall(26,31,0,0,0);

复制代码

syscall是通过软中断来实现从用户态到内核态,可以也。汇编通过svc调用来实现。

#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"
         
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值