2015-01-03 13 views
7

Sto provando a chiamare una funzione su ptrace come questa ptrace(PT_DENY_ATTACH, 0, 0, 0); Ma quando provo a importarlo usando #include <sys/ptrace.h> Xcode mi dà un errore 'sys/ptrace.h' file not found. Mi manca qualcosa, devo importare una libreria o è semplicemente non disponibile su iOS?ptrace su iOS 8

+0

Sono anche affrontando lo stesso problem.Did a trovare la soluzione? – SandeepAggarwal

+0

Purtroppo non ancora. – imas145

risposta

1

Questo sembra funzionare per me e impedirà di collegare il debugger. Non ho provato il #ifdef OTTIMIZZA se funziona nella distribuzione, quindi fammi sapere se trovi qualche problema.

//#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

Il codice viene compilato, ma continua a non funzionare come previsto (nega l'allegato di un debugger). Ho creato un'applicazione per test iOS a vista singola e ho modificato solo il file main.m. Se non mi sbaglio completamente, Xcode (o qualsiasi debugger) non dovrebbe essere in grado di collegarsi ad esso. In caso di Xcode, non dovrebbe nemmeno lanciare. Ma l'app funziona bene ... Per testare ulteriormente questo, ho inserito un NSLog all'interno del metodo disable_gdb, e non è mai stato stampato. C'è qualcosa che devo fare per far funzionare il DEBUG #ifndef? – imas145

+0

Sì, inserisco manualmente DEBUG nel mio progetto come definizione di precompilazione per build DEBUG. Ci sono altri modi più recenti (usinf DEBUG_BUILD = 1) o __OPTIMIZE__, ma il mio è un codice più vecchio. –

3

Il problema qui è che Xcode è anteporre suo percorso di base SDK per tutti i percorsi di intestazione di sistema (ad esempio, /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9. 0.sdk/usr/include /). Sfortunatamente, ptrace.h non è lì ma si trova in/usr/include/sys /. Così, per risolvere questo problema, è necessario modificare la vostra istruzione include di essere:

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

Non ho idea del motivo per cui ptrace.h non è incluso nel SDK ma la funzionalità che stai cercando funziona quando è in esecuzione al telefono.

Aggiornamento: Anche se questo consente di utilizzare la funzionalità ptrace, caricandoli di Apple si tradurrà in App rifiuto a causa di:

Non-public API usage: 

The app references non-public symbols in <app name>: _ptrace