web-dev-qa-db-fra.com

Déterminer si un iPhone est cassé en prison par programme

Comment déterminez-vous (par programme) si un iPhone/iPod est:

  1. Prison cassée
  2. Exécution d'une copie piratée de votre logiciel

Pinch Media peut détecter si un téléphone est cassé en prison ou si le logiciel en cours d'exécution est fissuré, quelqu'un sait-il comment procéder? Y a-t-il des bibliothèques?

78
rjstelling

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 changer l'Info.plist. Comme c'est un fichier normal auquel vous avez accès, il est assez facile de déterminer de telles modifications.

39
zakovyrya

Détecter un téléphone jailbreaké est aussi simple que de vérifier la présence de /private/var/lib/apt/ dossier. Bien que cela ne détecte pas les utilisateurs du programme d'installation uniquement, la plupart ont désormais installé Cydia, Icy ou RockYourPhone (qui utilisent tous apt)

Pour détecter les utilisateurs piratés, le moyen le plus simple consiste à vérifier la présence d'une clé SignerIdentity dans le Info.plist. Étant donné que les crackers avancés peuvent facilement trouver la norme [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] vérifie, il est préférable de masquer ces appels en utilisant le runtime Objective C disponible via #import <objc/runtime.h> ou utilisez d'autres équivalents.

25
rpetrich

Pour développer la réponse de zakovyrya, vous pouvez utiliser le code suivant:

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

TOUTEFOIS, la personne jailbreakant votre application peut hexedit votre programme et en tant que tel, elle pourrait éditer la chaîne @ "SignerIdentity" pour lire @ "siNGeridentity" ou autre chose qui retournerait nil, et donc passerait.

Donc, si vous utilisez ceci (ou l'une des autres suggestions de http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • Ne vous attendez pas à ce que cela fonctionne pour toujours
  • N'utilisez pas ces informations pour casser/gêner votre application de quelque manière que ce soit (sinon elles auront une raison de la modifier, de sorte que votre application ne saura pas qu'elle est jailbreakée)
  • Probablement sage d'obscurcir cette partie du code. Par exemple, vous pouvez 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 qu'il a en fait dit SignerIdentity ou siNGeridentity?)
  • Ne dites pas aux gens sur un site Web public comme stackoverflow comment vous le faites
  • Gardez à l'esprit que ce n'est qu'un guide et qu'il n'est pas infaillible (ni à l'épreuve des crackers!) - avec une grande puissance vient une grande responsabilité.
10
Benjie

Pour développer les commentaires de yonel et Benjie ci-dessus:

1) méthode de Landon Fuller s'appuyant sur la vérification du chiffrement, lié ci-dessus par yonel, semble être le seul qui ne soit toujours pas vaincu par les outils de craquage automatisés. Je ne serais pas trop inquiet à propos de Apple changer l'état de l'en-tête LC_ENCRYPTION_INFO de si tôt. Cela semble avoir des effets imprévisibles sur les iphones jailbreakés (même lorsque l'utilisateur a acheté une copie .. .)

En tout cas, je ne prendrais aucune action imprudente contre un utilisateur basé sur ce code ...

2) Pour compléter le commentaire de Benjie concernant. obscurcissement (une nécessité absolue lorsque vous traitez avec des valeurs de chaîne dans votre code anti-piratage): un moyen similaire mais peut-être encore plus simple consiste à toujours vérifier un salé version hachée de la valeur que vous recherchez. Par exemple (même si cette vérification n'est plus efficace), vous vérifieriez le nom de clé de chaque MainBundle comme md5 (keyName + "some secret salt") par rapport à la constante appropriée ... Plutôt basique, mais sûr de vaincre toute tentative de localiser le chaîne.

Bien sûr, cela vous oblige à pouvoir interroger indirectement la valeur que vous souhaitez comparer (par exemple en parcourant un tableau le contenant). Mais c'est le plus souvent le cas.

5
user296305