2015-12-07 21 views
5

Sto costruendo un'app per iOS che trasmette dati sensibili al mio server e sto firmando le mie richieste API come misura aggiuntiva. Voglio rendere il reverse engineering il più difficile possibile, e avendo usato Cycript per trovare le chiavi di firma di alcune app del mondo reale, so che non è difficile trovare queste chiavi collegandole a un processo. Sono assolutamente consapevole del fatto che se qualcuno è veramente abile e cerca abbastanza difficile, alla fine lo sarà exploit, ma sto cercando di renderlo il più difficile possibile, pur rimanendo conveniente per me stesso e gli utenti.Rileva se Cycript/Substrate o gdb è collegato al processo di un'applicazione iOS?

Posso controllare lo stato di jailbroken e adottare misure aggiuntive, oppure posso eseguire il blocco SSL, ma entrambi sono ancora facili da aggirare collegando al processo e modificando la memoria.

Esiste un modo per rilevare se qualcosa (sia che si tratti Cycript, gdb, o qualsiasi strumento simile che può essere utilizzato per il cracking del processo) è collegato al processo, pur non essere stato respinto da App Store?

MODIFICA: Questo non è un duplicato di Detecting if iOS app is run in debugger. Questa domanda è più correlata all'output e controlla un flusso di output per identificare se c'è un flusso di output collegato a un logger, mentre la mia domanda non è correlata a quello (e tale controllo non copre le mie condizioni).

+0

Eventuali duplicati di [Rilevare se app iOS viene eseguito in debugger] (http://stackoverflow.com/questions/4744826/detecting-if-ios-app-is-run-in-debugger) – Petesh

+1

@ Petesh no, vedi la mia modifica. –

+0

Sembra essere esattamente * quello che stai chiedendo: utilizza sysctl per verificare se il processo viene tracciato, che è ciò che accade quando esegui un processo con un debugger o ne hai uno collegato mentre sei in esecuzione. – Petesh

risposta

5

rilevamento gdb è possibile via the linked stackoverflow question - utilizza il kstat per determinare se il processo è in fase di debug. Questo rileverà se un debugger è attualmente collegato al processo.

C'è anche una parte di codice - Using the Macro SEC_IS_BEING_DEBUGGED_RETURN_NIL in iOS app - che consente di inserire una macro che esegue il debugger collegato in una varietà di posizioni nel codice (è C/Objective-C).

Per quanto riguarda la rilevazione Cycript, quando viene eseguito nei confronti di un processo, si inietta un dylib nel processo di trattare con le comunicazioni tra la linea di comando cycript e il processo - la biblioteca ha una parte del nome che sembra cynject. Quel nome non assomiglia a nessuna delle librerie presenti su una tipica app iOS. Questo dovrebbe essere rilevabile con un piccolo ciclo come (C):

BOOL hasCynject() { 
    int max = _dyld_image_count(); 
    for (int i = 0; i < max; i++) { 
     const char *name = _dyld_get_image_name(i); 
     if (name != NULL) { 
      if (strstr(name, "cynject") == 0) return YES; 
     } 
    } 
} 

Ancora una volta, dandogli un nome migliore di questo sarebbe opportuno che, così come offuscando la stringa che si sta testando.

Questi sono solo gli approcci che possono essere presi - sfortunatamente questi ti proteggeranno solo in qualche modo in fase di esecuzione, se qualcuno sceglie di puntare IDA o qualche altro disassemblatore su di esso allora non verrai protetto.

Il motivo per cui il controllo per debugger è implementato come macro è che si inserirà il codice in una varietà di punti del codice e, di conseguenza, qualcuno che tenta di risolverlo dovrà applicare una patch all'app in un varietà di posti.

+0

come posso implementare in un progetto rapido? –

+0

Come puoi implementare esattamente cosa? Ci sono essenzialmente 3 risposte qui - due link ad altre risposte e questo codice, che può essere tradotto rapidamente con un po 'di sforzo (avrete bisogno di un'intestazione di bridging per le funzioni '_dyld_image_count' e' _dyld_get_image_name') – Petesh

2

Per quanto ne so, l'iniezione del processo Cycript è resa possibile dai simboli di debug. Pertanto, se si eliminano i simboli di debug per la versione di App Store (l'impostazione di generazione predefinita per la configurazione di rilascio), ciò sarebbe di aiuto.

Un'altra azione da intraprendere, che non avrebbe alcun impatto sull'usabilità dell'app, sarebbe quella di utilizzare un offuscatore. Tuttavia, ciò renderebbe inutile qualsiasi rapporto di arresto anomalo, poiché non sarebbe possibile dare un senso ai simboli, anche se il rapporto di arresto anomalo è stato simboleggiato.

+0

Stripping a binario - cioè una versione non debug - rallenta un reverse engineering che usa strumenti come Hooper, ida pro, radare2 ecc. Secondo me, non aiuta molto contro Cycript o Frida. Una volta che è possibile iniettare una libreria Cycript o Frida, si stanno eseguendo modifiche al runtime e si può eseguire il dump della classe o delle funzioni con il minimo sforzo. – rustyMagnet

2

Sulla base della risposta di @ petesh, ho trovato che il codice seguente ha ottenuto ciò che volevo su un telefono jailbroken con Cycript. L'esistenza delle stringhe di printf è d'oro per un reverse engineer, quindi questo codice è adatto solo per applicazioni demo/crack-me.

#include <stdio.h> 
#include <string.h> 
#include <mach-o/dyld.h> 

int main() 
{ 
     int max = _dyld_image_count(); 
     for (int i = 0; i < max; i++) { 
      const char *name = _dyld_get_image_name(i); 
      const char needle[11] = "libcycript"; 
      char *ret; 

      if ((ret = strstr(name, needle)) != NULL){ 
       printf("%s\nThe substring is: %s\n", name, ret); 
      } 
     } 

    return 0; 
} 
+0

davvero intelligente! hai effettivamente provato questo? e pensi che la presenza di 'libcycript' porti a un'app rifiutata? –

+0

Ciao @ CanPoyrazoğlu Ho impostato la mia app dimostrativa in crash quando rileva questa libreria. Cycript viene iniettato nel processo dell'app sul dispositivo iOS jailbroken. Il prossimo passo è quello di assicurarsi che lo schianto sia effettivamente in grado di codificare i dati presenti nell'heap della memoria, prima dell'uscita. – rustyMagnet

+0

un modo per implementarlo in modo rapido? –