일반적인 앱은 launchd process에 의해 실행된다.
launchd 프로세스는 user mode로 첫번째로 돌아가는 프로세스로 PID=1이다.
따라서 일반적인 앱의 ppid(parent process id)=1로 조회된다면 정상이다.
반면 디버거에서 자식프로세스로 생성한 경우는 ppid는 디버거의 PID로 설정된다.
따라서 getppid() 함수 호출 결과가 launchd인 1이 아니라면 디버거에서 생성했다고 판단할 수 있다.
func AmIBeingDebugged() -> Bool { return getppid() != 1 }
[우회]
물론 getppid() 함수에 후킹 걸어서 항상 1이 반환되도록 하면 됨.
아니면 반환 결과를 보고 판단하는 함수를 패치해도 됨.