Déterminer si un iPhone est cassé prison Programmatically
-
16-09-2019 - |
Question
Comment déterminez-vous (programme) si un iPhone / iPod est:
- prison cassé
- Exécution d'une copie fissurée de votre logiciel
Pincez médias peut détecter si un téléphone est cassé ou prison le fonctionnement du logiciel est fissuré, personne ne sait comment ils le font? Y a-t-il des bibliothèques?
Autres conseils
La détection d'un téléphone jailbreaké est aussi facile que de vérifier la présence du dossier /private/var/lib/apt/
. Bien que cela ne détecte pas la plupart ont les utilisateurs de l'installateur seulement, maintenant ont installé Cydia, ou Icy RockYourPhone (tous qui utilisent apt)
Pour détecter les utilisateurs pirates, le plus simple est de vérifier la présence d'une clé SignerIdentity
dans Info.plist
de votre application. Étant donné que les craquelins avancés peuvent facilement trouver les contrôles standard [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"]
, il est préférable de masquer ces appels à l'aide du moteur d'exécution Objectif C disponible via #import <objc/runtime.h>
ou utiliser des équivalents alternatifs.
Juste pour développer la réponse de zakovyrya, vous pouvez utiliser le code suivant:
if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
// Jailbroken
}
Cependant, la personne jailbreaking votre application peut hexedit votre programme et en tant que tels, ils pourraient modifier la chaîne @ « SignerIdentity » pour lire @ « siNGeridentity » ou quelque chose d'autre qui reviendrait nul, et passer ainsi.
Donc, si vous utilisez ce (ou l'un des autres suggestions de http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):
- Ne vous attendez pas à travailler pour toujours
- Ne pas utiliser ces informations pour briser / entraver votre application de quelque manière que (sinon ils ont des raisons de hexedit, donc votre application ne saura pas qu'il est jailbreaké)
- Probablement sage de ce bit obfusquer du code. Par exemple, vous pouvez mettre la chaîne base64 inversée codée dans votre code, puis le décoder dans l'application en inversant le processus.
- Valider votre validation ultérieurement dans votre code (par exemple quand j'ai dit SignerIdentity, disait-elle en fait SignerIdentity ou siNGeridentity?)
- Ne pas dire aux gens sur un site Web public comme stackoverflow comment vous le faites
- Gardez à l'esprit, il est seulement un guide et est pas infaillible (ni pirate épreuve!) -. Avec une grande puissance vient une grande responsabilité
Pour développer des Yonel et de commentaires de Benjie ci-dessus:
1) la méthode de Landon Fuller se fondant sur l'enregistrement de cryptage, lié ci-dessus par Yonel, semblent être le seul pas encore vaincu par des outils de craquage automatisés. Je ne serais pas trop inquiet au sujet d'Apple changer l'état de l'en-tête LC_ENCRYPTION_INFO dans un proche avenir. Il ne semble pas 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 téméraire contre un utilisateur en fonction de ce code ...
2) Pour compléter re commentaire de Benjie. obscurcissement (une nécessité absolue quand traiter toutes les valeurs de chaîne dans votre code anti-piratage): un similaire, mais peut-être même plus simple est de toujours vérifier salés hashed version du la valeur que vous recherchez. Par exemple (même si ce contrôle est plus efficace), vous vérifier chaque nom de la clé de mainBundle comme md5 (keyName + « un peu de sel secret ») ... plutôt de base contre la constante appropriée, mais assurez-vous de vaincre toute tentative de localiser le string.
Bien sûr, cela vous oblige à être en mesure d'interroger indirectement la valeur que vous voulez comparer (par exemple en passant par un tableau contenant). Mais c'est le plus souvent le cas.