80 votes

Déterminer si un iPhone est Jail broken de manière programmatique

Comment déterminer (de manière programmatique) si un iPhone/iPod est :

  1. La prison est rompue
  2. Exécution d'une copie piratée de votre logiciel

Pinch Media peut détecter si un téléphone est " jail broken " ou si le logiciel utilisé est " cracké ", est-ce que quelqu'un sait comment ils font ? Existe-t-il des bibliothèques ?

1 votes

Apple sait comment le déterminer :p

2 votes

2 votes

Si vous vous intéressez à cette question, pourquoi ne pas soutenir la proposition de l'Aire 51 pour un jail-breaking site Stack Exchange

39voto

zakovyrya Points 5403

Ici est l'un des moyens de détecter si votre application a été piratée.

En bref : le cracking nécessite généralement de modifier l'Info.plist. Comme il s'agit d'un fichier régulier auquel vous avez accès, il est assez facile de déterminer ces changements.

1 votes

Malheureusement, il existe une solution de contournement qui rompt ce mécanisme de détection. Une fois l'application installée, la clé SignerIdentity n'est plus nécessaire, de sorte que le pirate peut simplement se connecter à son téléphone jailbreaké et modifier la liste de contrôle pour la supprimer.

0 votes

@KevinBallard avez-vous des recommandations pour détecter les jailbreaks courants en 2017 ?

0 votes

@Cœur Non, je ne me suis pas penché sur la question depuis que j'ai écrit ce commentaire.

25voto

rpetrich Points 25769

Pour détecter un téléphone jailbreaké, il suffit de vérifier la présence des éléments suivants /private/var/lib/apt/ dossier. Bien que cela ne détecte pas les utilisateurs de l'Installer-only, la plupart d'entre eux ont déjà installé Cydia, Icy ou RockYourPhone (qui utilisent tous apt).

Pour détecter les utilisateurs pirates, la méthode la plus simple consiste à vérifier la présence d'un SignerIdentity de votre application. Info.plist . Comme les crackers avancés peuvent facilement trouver la norme [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] il est préférable d'obscurcir ces appels à l'aide du runtime Objective C disponible via la commande #import <objc/runtime.h> ou utiliser des équivalents alternatifs.

10voto

Benjie Points 3416

Pour compléter la réponse de zakovyrya, vous pouvez utiliser le code suivant :

if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
  // Jailbroken
}

CEPENDANT, la personne qui jailbreake votre application peut éditer votre programme en hexadécimal et ainsi modifier la chaîne @"SignerIdentity" pour lire @"siNGeridentity" ou quelque chose d'autre qui renverrait nil, et donc passerait.

Ainsi, si vous utilisez cette méthode (ou l'une des autres suggestions de la rubrique http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • Ne vous attendez pas à ce qu'il fonctionne éternellement
  • N'utilisez pas ces informations pour casser/entraver votre application de quelque manière que ce soit (sinon, ils auront une raison de l'hexadécimer, de sorte que votre application ne saura pas qu'elle est jailbreakée).
  • Il est probablement judicieux d'obscurcir cette partie du code. Par exemple, vous pourriez mettre la chaîne inversée encodée en base64 dans votre code, puis la décoder dans l'application en inversant le processus.
  • Validez votre validation plus tard dans votre code (par exemple, lorsque j'ai dit SignerIdentity, est-ce que j'ai bien dit SignerIdentity ou siNGeridentity ?)
  • Ne dites pas aux gens sur un site web public comme stackoverflow comment vous le faites.
  • N'oubliez pas qu'il ne s'agit que d'un guide et qu'il n'est pas infaillible (ni à l'épreuve des craquements !) - un grand pouvoir implique une grande responsabilité.

0 votes

Cela vérifie donc l'identité du signataire sur votre App bundle, mais qu'en est-il du cas où l'application n'est pas piratée ou quoi que ce soit d'autre mais que l'appareil est JailBroken, comment le détecteriez-vous ?

0 votes

Posez la question sur SO et quelqu'un vous répondra :)

5voto

Pour compléter les commentaires de Yonel et Benjie ci-dessus :

1) La méthode de Landon Fuller s'appuyant sur la vérification du cryptage, dont le lien est donné ci-dessus par Yonel, semble être le seul à ne pas avoir été vaincu par les outils de piratage automatisés. Je ne m'inquiéterais pas outre mesure de voir Apple modifier l'état de l'en-tête LC_ENCRYPTION_INFO dans un avenir proche. Cela semble avoir des effets imprévisibles sur les iPhone jailbreakés (même lorsque l'utilisateur a acheté une copie...).

En tout état de cause, je ne prendrais pas de mesures irréfléchies à l'encontre d'un utilisateur sur la base de ce code...

2) Pour compléter le commentaire de Benjie concernant l'obscurcissement (une nécessité absolue lorsque vous traitez des valeurs de chaîne dans votre code anti-piratage) : une méthode similaire, mais peut-être encore plus facile, consiste à toujours vérifier une valeur de salé haché de la valeur recherchée. Par exemple (même si cette vérification n'est plus efficace), vous pourriez vérifier le nom de la clé de chaque MainBundle comme md5(keyName + "some secret salt") par rapport à la constante appropriée... C'est assez basique, mais cela permet d'éviter toute tentative de localisation de la chaîne de caractères.

Bien entendu, cela suppose que vous puissiez interroger indirectement la valeur que vous souhaitez comparer (par exemple en passant par un tableau qui la contient). Mais c'est le plus souvent le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X