【iOS安全-TikTok越狱检测之二 <调试器检测>】此文章归类为:iOS安全。
来了,调试器检测。总结如下,多多指教:
检测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;
}
|
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;
}
|
更多【iOS安全-TikTok越狱检测之二 <调试器检测>】相关视频教程:www.yxfzedu.com