2015-01-03 14 views
7

Próbuję wywołać funkcję na ptrace jak ten ptrace(PT_DENY_ATTACH, 0, 0, 0); Ale kiedy próbuję zaimportować go przy użyciu #include <sys/ptrace.h> Xcode daje mi błąd 'sys/ptrace.h' file not found. Czy brakuje mi czegoś, czy muszę zaimportować bibliotekę, czy jest to po prostu niedostępne w systemie iOS?ptrace na iOS 8

+0

Jestem również stoi w tym samym problem.Did najlepsze rozwiązanie? – SandeepAggarwal

+0

Nic, niestety, niestety. – imas145

Odpowiedz

1

Wydaje się, że działa to dla mnie i uniemożliwi dołączenie debuggera. Nie przetestowałem #ifdef OPTIMIZE, jeśli działa w dystrybucji, więc daj mi znać, jeśli znajdziesz jakieś problemy.

//#include <sys/ptrace.h> 
#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[]) { 

//#ifndef DEBUG => use the following instead. 
#ifdef __OPTIMIZE__ 
    //ptrace(PT_DENY_ATTACH, 0, 0, 0); 
    disable_gdb(); 
#endif 
+0

Kod się kompiluje, ale nadal nie działa zgodnie z oczekiwaniami (odmawiaj załączenia debuggera). Stworzyłem aplikację testową dla systemu iOS z pojedynczym widokiem i zmodyfikowałem tylko plik main.m. Jeśli się nie mylę, Xcode (lub dowolny debugger) nie będzie mógł się do niego podłączyć. W przypadku Xcode nie powinno się nawet uruchamiać. Ale aplikacja działa dobrze ... Aby dodatkowo przetestować to, umieściłem NSLog wewnątrz metody disable_gdb i nigdy nie został wydrukowany. Czy jest coś, co muszę zrobić, aby #ifndef DEBUG działało? – imas145

+0

Tak, ręcznie umieszczam DEBUG w moim projekcie jako definicję prekompilacji dla buildów DEBUG. Istnieją inne nowsze sposoby (usinf DEBUG_BUILD = 1) lub __OPTIMIZE__, ale mój jest starszym kodem. –

3

Problem polega na tym, że Xcode jest poprzedzenie jej ścieżkę bazową SDK do wszystkich ścieżek nagłówka systemu (np /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9. 0.sdk/usr/include /). Niestety, ptrace.h nie istnieje, ale znajduje się w/usr/include/sys /. Tak więc, aby rozwiązać ten problem, należy zmienić to oświadczenie będzie:

#include </usr/include/sys/ptrace.h> 

nie mam pojęcia dlaczego ptrace.h nie jest zawarte w SDK ale funkcjonalność, której szukasz nie działa, gdy jest uruchomiony na telefonie.

Aktualizacja: Chociaż nie pozwala na korzystanie z funkcji ptrace, przesyłając do Apple App spowoduje odrzucenie ze względu na:

Non-public API usage: 

The app references non-public symbols in <app name>: _ptrace 
Powiązane problemy