-
-
[原创]TikTok越狱检测之二 <调试器检测>
-
发表于:
2024-3-21 17:04
4740
-
来了,调试器检测。总结如下,多多指教:
检测app 是否被附加调试:
原理就是检测父进程是否 launchd启动,在OS X和iOS 系统中,用户环境始于launchd,为用户态出现的第一个进程,为所有的进程的祖先,launchd 的进程PID = 1,
正常情况下,app的启动都是launchd来启动的。当app 被调试的时候,PID 的值则变成了调试器的PID,不等于 1
下面是检测TikTok app 是否被附加调试三种方法,
1.是通过 sysctl函数调用
2.通过getppid 函数调用
3.利用汇编代码svc 调用
检测和反检测都是一目了然的,矛和盾的关系都是平等的。
//非Debug状态,返回值为1,Debug状态返回Debugserver进程id
//首先,它检查父进程 id (ppid) 是否与 /sbin/launchd 相同,后者为 1。不相等则为调试状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | + (pid_t)GetParentPidByProc {
int name[ 4 ];
name[ 0 ] = CTL_KERN;
name[ 1 ] = KERN_PROC;
name[ 2 ] = KERN_PROC_PID;
name[ 3 ] = getpid();
struct kinfo_proc info;
size_t info_size = sizeof(info);
info.kp_proc.p_flag = 0 ;
/ * 查询成功返回 0 * /
int error = sysctl(name, sizeof(name) / sizeof( * name), &info, &info_size, NULL, 0 );
if (error = = 0 ) {
return info.kp_eproc.e_ppid;
}
return 0 ;
}
|
//非Debug状态,返回值为1,Debug状态返回Debugserver进程id
//首先,它检查父进程 id (ppid) 是否与 /sbin/launchd 相同,后者为 1。不相等则为调试状态
1 2 3 4 5 6 7 8 9 10 | + (pid_t) GetParentPid{
bool bRet = false;
pid_t LAUNCHD_PID = 1 ;
pid_t ppid = getppid();
if (ppid = = LAUNCHD_PID) {
bRet = true;
}
return ppid;
}
|
//通过svc 汇编代码来调用,非Debug状态,返回值为1,Debug状态返回Debugserver进程id
1 2 3 4 5 6 7 8 9 10 11 12 | + (pid_t) GetParentPidBySvc{
NSInteger ppid = 0 ;
__asm__ volatile(
"mov x16,#39\t\n"
"svc 0x80\t\n"
"mov %0,x0\t\n"
: "=r" (ppid)
:
:
);
return (pid_t)ppid;
}
|
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)