解除sysctl阻止调试器lldb / gdb依附

###我们知道常用的iOS反调试方法是ptrace其实还有一种就是利用sysctl查看内核进程状态标志判断是否是被调试状态,当进程被调试的时候info.kp_proc.p_flag会变成1,所以就可以通过sysctl查询进程相应的kinfo_proc信息就可以判断是否是在被调试状态,我们只需要在函数返回时修改p_flag = 0就可以让sysctl返回未在调试状态栏。下面我们要做的就是对sysctl下条件断点,在sysctl返回后,在二进制文件中找到kproc的首地址,然后找到p_flag相对kproc首地址的偏移,然后修改对应内存的值就可以了
####注意:这种方法不能检测Cycript附加到进程中,同时有的程序可能有多个sysctl函数来防■■!

 #include <assert.h>
 #include <stdbool.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/sysctl.h>

static bool AmIBeingDebugged(void)
    // Returns true if the current process is being debugged (either
    // running under the debugger or has a debugger attached post facto).
{
    int                 junk;
    int                 mib[4];
    struct kinfo_proc   info;
    size_t              size;

    // Initialize the flags so that, if sysctl fails for some bizarre
    // reason, we get a predictable result.

    info.kp_proc.p_flag = 0;

    // Initialize mib, which tells sysctl the info we want, in this case
    // we're looking for information about a specific process ID.

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

    // Call sysctl.

    size = sizeof(info);
    junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
    assert(junk == 0);

    // We're being debugged if the P_TRACED flag is set.

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

你只说了用sysctl检测的方法,没有说如何反检测啊~!

写了啊。。。对sysctl下断点,在sysctl返回后,在二进制文件中找到kproc的首地址,然后找到p_flag相对kproc首地址的偏移,然后修改对应内存的值就可以了

求贴个实例吧

1 个赞

大神。ios9的sysctl方法被屏蔽了,请问现在有什么办法可以获取到进程呢?

按照你的方法写的tweak.xm

include "mach-o/dyld.h"
include "sys/sysctl.h"
include "sys/stat.h"
include "substrate.h"

int (*old_sysctl)(int *, u_int, void *, size_t *, void *, size_t);
int (new_sysctl)(int *, u_int, void *, size_t *, void *, size_t);
int (new_sysctl)(int *a, u_int b, void *c, size_t *d, void *e, size_t f){
// NSLog(@"--------new_sysctl---------%d",a[0]);
return 0;
}

%ctor
{
    @autoreleasepool
    {
          void * sysctl = MSFindSymbol(NULL, "_sysctl");
          MSHookFunction((void *)sysctl, (void *)&new_sysctl, (void **)&old_sysctl);
    }
}

安装后没有效果,你说的那种.h.m,然后调用的那种方法没大明白
我是新手,希望大牛在说的明白一些,多谢大牛

[quote=“jackielee, post:1, topic:1953”]
们知道常用的iOS反调试方法是ptrace其实还有一种就是利用sysctl查看内核进程状态标志判断是否是被调试状态,当进程被调试的时候info.kp_proc.p_flag会变成1,所以就可以通过sysctl查询进程相应的kinfo_proc信息就可以判断是否是在被调试状态,我们只需要在函数返回时修改p_flag = 0就可以让sysctl返回未在调试状态栏。下面我们要做的就是对sysctl下条件断点,在sysctl返回后,在二进制文件中找到kproc的首地址,然后找到p_flag相对kproc首地址的偏移,然后修改对应内存的值就可以
[/quote]请问下,你这个解决了吗

论坛是个大宝库:joy:

是的