Как исправить "неявное объявление функции 'ptrace' неверно" - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь защитить приложение от перехвата. Используйте «ptrace» с PT_DENY_ATTACH, чтобы гарантировать, что никакая инфраструктура перехвата не может присоединиться к вызывающему процессу;если такие фреймворки попытаются присоединиться, процесс завершится.

В файле main.m.

#import <sys/types.h>

int main(int argc, char *argv[]) {
        #ifndef DEBUG
            ptrace(PT_DENY_ATTACH, 0, 0, 0);
        #endif
}

сборка прошла успешно, но при архивировании выдает ошибку как

 implicit declaration of function 'ptrace' is invalid in C99 [-Werror,-Wimplicit-function-declaration]

ptrace(PT_DENY_ATTACH, 0, 0, 0);

use of undeclared identifier 'PT_DENY_ATTACH'

Попробовал другое решение:

#import <dlfcn.h>
#import <sys/types.h>

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif  // !defined(PT_DENY_ATTACH)

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

int main(int argc, char *argv[]) {
    @autoreleasepool {
        disable_gdb();
    }
  return UIApplicationMain(argc, argv, nil, className);
}

Я ожидаю, что приложение будет собрано, но завершенос ошибкой:

Initializing 'ptrace_ptr_t' (aka 'int (*)(int, int, char *, int)') with an expression of type 'void *' converts between void pointer and function pointer
...