2012-08-31 14 views
6

Ho bisogno di un modo stabile per tentare di eseguire un eseguibile senza segno su un dispositivo iOS per verificare se il dispositivo è stato jailbroken (cioè consente l'esecuzione di codice non firmato).Esecuzione di codice non firmato in un'applicazione iOS per testare il jailbreak

Ho scritto un piccolo file eseguibile che essenzialmente non fa nulla.

int main(int argc, char *argv[]) { 
    return 23; 
} 

Che ho compilato ed eseguito con successo su un dispositivo iOS (sia Jailbroken e non).

Ho quindi aggiunto questo eseguibile a un pacchetto di app e distribuito l'app su un dispositivo iOS.

Ciò risulta in una versione di sola lettura dell'eseguibile sul dispositivo. Ho provato a chmod questo file per dargli autorizzazioni di esecuzione, ma questo non è riuscito, quindi l'ho copiato nella directory tmp per l'app, dove sono stato in grado di chmod con permessi eseguibili.

Altre domande hanno suggerito di usare execve per chiamare l'eseguibile, ma questo sostituirà il processo in esecuzione con quello nuovo, che ucciderà l'app. Fork() fallisce sempre, quindi non è un'opzione. System() richiede una shell, e sarebbe possibile avere un jailbreak senza una shell che permetta comunque l'esecuzione di codice non firmato, quindi è fuori. Forcelle Popen(), quindi non funzionerà. È interessante notare che, da quello che ho scoperto, chiamare execv sul mio eseguibile in un dispositivo normale causa un errore "Operazione non consentita", mentre chiamarlo su un dispositivo jailbroken causa un errore "Autorizzazione negata". Questo da solo potrebbe funzionare per il rilevamento del jailbreak, tranne nel caso in cui se si verifica un jailbreak in cui l'esecuzione di execv è consentita, l'App si bloccherà immediatamente mentre il processo verrà sostituito.

In base a this, iBooks esegue il rilevamento del jailbreak in questo modo, ma sembra utilizzare il file binario di fairplayd per eseguire le chiamate execve.

Qualcuno ha suggerimenti per eseguire un file eseguibile o utilizzare fairplayd?

risposta

3

Non è possibile modificare direttamente le autorizzazioni dell'eseguibile di test, poiché le risorse dell'app non possono essere modificate dopo l'installazione dell'app. Quello sarebbe un buco di sicurezza. Quindi, ecco perché è necessario copiarlo in una directory tmp/cache/documenti, per renderlo eseguibile.

non sono sicuro se la vostra applicazione deve supportare il multitasking, e se è necessario rilevare il jailbreak alla partenza della prima manche, o se è ok per aspettare fino a quando l'applicazione si chiude. Ma, se è possibile disattivare il multitasking, allora si potrebbe implementare questo metodo (piccolo eseguibile chiamato test in questo esempio):

- (void)applicationWillTerminate:(UIApplication *)application { 
    NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent: @"test"]; 
    int result = execlp([path UTF8String], [path UTF8String], NULL); 
    // if we got here, then the attempt to run the external process failed, so make a note of this: 
    [[NSUserDefaults standardUserDefaults] setValue: [NSNumber numberWithBool: NO] forKey: @"is_jailbroken"]; 
    NSLog(@"test returns %d", result); 
} 

Se la chiamata execlp() riesce, allora sì, il processo sarà sostituito. Ma il processo sta per chiudere comunque. Quando faccio questo, non vedo un vero registro di crash, quindi non sono sicuro che Apple si lamenterebbe di questo. Non c'è aspetto di arresto anomalo dell'utente.

Se non è possibile eseguire il processo separato, l'app continuerà la linea di codice che consente di registrare il fatto che il telefono non è apparentemente jailbroken, che può essere notato al prossimo avvio dell'app.

Se si do necessario supportare il multitasking, è possibile provare a inserire il codice sopra in un callback multitasking come applicationDidEnterBackground:. Se il telefono è normale, la chiamata exec non riesce (e restituisce), quindi l'app non verrà chiusa (uscita). Suppongo (?) Che i revisori Apple non testino la tua app sui telefoni jailbroken. Per quelle persone con telefoni jailbroken, la tua app uscirà, invece di andare in background. Forse è abbastanza buono per le tue esigenze?

Inoltre, solo FYI, ci sono altri modi per testare un sistema jailbroken, che sono probabilmente abbastanza affidabili (non sono sicuro se si vuole essere in grado di rilevare un telefono jailbroken il 100% delle volte, o rilevare il configurazione standard jailbroken)

Determining if an iPhone is Jail broken Programmatically

How do I detect that an iOS app is running on a jailbroken phone?

+0

sistema passa un comando alla shell ed eseguire codice non firmato non significa necessariamente avere una shell. – richie

+0

Per me, il sistema restituisce sempre 32512, a indicare che non è possibile trovare il file, indipendentemente dal fatto che il telefono sia jailbroken o meno. – richie

+0

@richie, ok scusa. Devo averlo eseguito nel mio piccolo programma "ciao mondo" jailbreak (installato in '/ Applications /'), che è quello che faccio di solito quando rispondo alle domande di jailbreak. Ricevo lo stesso codice di ritorno con 'system()'. Ho aggiornato la mia risposta con un'altra alternativa, che usa 'execlp'. Ho fatto in modo di testare questo con un'app che si installa su '/ var/mobile/Applications'. Di nuovo, mi scuso. – Nate

Problemi correlati