web-dev-qa-db-fra.com

Comment durcir une application iPhone / Android Il est donc difficile de renverser l'ingénieur?

Ce sont les objectifs suivants que j'ai à l'esprit:

  1. Faites de l'application difficile à craquer, car le binaire tiendra des jetons secrets.
  2. Si cela peut toujours être fissuré, est-ce que l'application peut indiquer à quelqu'un ou à sa propre soi que celle-ci a été craquée (comme une vérification contre une somme de contrôle ou un certificat ou le système d'exploitation le faire pour l'application) et prendre une action? L'application binaire peut être infectée ou un code incorrect peut être injecté si le programme est également en mémoire, les méthodes suggérées devraient donc être en mesure de gérer ces deux cas.

J'utilise ces plates-formes:

  • iPhone [OS: iOS, langue: objectif-c]
  • Android [OS: Android, langue: Java]

Veuillez ne pas prendre en compte les coûts et les délais de développement, car il s'agit d'une application essentielle pour son auditoire. Ce sera génial si je peux obtenir les questions répondis aux deux plateformes. Merci pour votre temps et votre attention déjà.

Editer 1 : Sont cesclasses de protection sans papiers? Je ne vois aucune documentation sous le Apple Docs. Quelqu'un a une idée de si ces utilisations sont d'une utilisation?

Edition 2 : Codesign for Mac OS X est venu avec un -o kill Option pour la signature des fichiers binaires tels que chaque fois qu'un binaire ne correspond pas à sa somme de contrôle dans le certificat, le système d'exploitation le tuerait. détaillé ici [drapeaux d'option ctrl-f 'option']. Y a-t-il quelque chose comme ça pour iOS?

Edit 3 : Je pense utiliser une combinaison de ces idées. Donc, au cas où quelqu'un vient à la recherche d'ici, cela pourrait aider. fonction à sens unique & transfert inconscient .

10
kumar

Fondamentalement, l'objectif "1" ne fonctionnera pas; L'ingénierie inverse fonctionne simplement trop bien. Il sera particulièrement facile avec le Android version, car Java est vraiment simple à décompiler (sur Android, un format de bytecode spécifique est utilisé car le Java La mise en œuvre est Dalvik , pas le "vrai" Java, mais le principe reste). Cependant, il ne sera pas si difficile avec la version iPhone (Objective-C compilé ARM code, pas la chose la plus difficile de démonter et de déterminer).

L'objectif "2" ne fonctionnera pas non plus. Tout d'abord, l'ingénierie inverse et l'extraction de données sont passives seulement, la demande est donc inhabituée - par conséquent, il n'ya rien que l'application puisse faire pour détecter que de tels ingénieurs inverse ont eu lieu. En outre, il est facile de modifier un code d'application pour contourner tout test interne; C'est la technique de craquage numéro 1 employée pour contourner la protection de la copie des jeux depuis le début des années 1980 (au moins).

Le mieux que vous puissiez espérer, est de fractionner les utilisateurs en deux catégories: ceux qui ont jailbreaké leur téléphone et ceux qui ne l'ont pas fait. Sur un iPhone non jailbreaké, seules les applications approuvées consciencieusement par Apple peuvent être installées et exécutées, cela empêche ainsi l'installation d'une application modifiée et non officielle qui utiliserait vos "jetons secrets" dans un La façon dont vous ne voulez pas. Mais la jailbreaking est exactement ce que les gens font pour installer des applications non approuvées, et cela semble être relativement facile.

Vous pouvez également essayer de rendre la vie plus difficile pour les attaquants en renouvelant très souvent vos jetons secrets et en publiant constamment de nouvelles versions de votre application. C'est ce que les fournisseurs de console de jeu font, avec de nouvelles "versions de firmware" constantes que les utilisateurs doivent télécharger pour pouvoir jouer avec les jeux plus récents, voir les nouveaux films ou se connecter à un réseau de joueurs. Cela agace aussi des utilisateurs, donc ce n'est pas vraiment bon marché.

Les choses seraient beaucoup plus faciles pour vous si vous pouviez organiser des "jetons secrets" spécifiques à l'utilisateur - de cette façon, si une valeur de jeton est indûment extraite, vous pouvez toujours la noircir sur votre serveur (je suppose que votre application utilise les jetons à se connecter à un serveur quelque part).

Notez que garder le secret de données dans une application déployée ou, à défaut de détecter de manière fiable une utilisation frauduleuse desdites données, est le Saint Graal de tous les éditeurs de jeux et des éditeurs de films du monde entier. Enfin, j'ai entendu, les grands joueurs comme Sony et Warner ne l'ont pas encore trouvé, et ce n'est pas faute d'essais.

8
Tom Leek

Comment durcir une application iPhone/Android de sorte que c'est difficile à inverser l'ingénieur?

Empêcher l'ingénierie inverse du logiciel est un problème difficile.

Prévention de l'ingénierie inverse du logiciel d'application sur une plate-forme informatique générale avec une aide matérielle faible (PC, iPhone ou Android téléphone) pour une période de temps significative (mois) est un problème exceptionnellement difficile.

Généralement au lieu de protéger toute la demande, une alternative commune consiste à tenter la protection des données critiques utilisées par l'application et d'abandonner la protection de l'ensemble de l'application.

[1] Faites de l'application difficile à craquer, car le binaire tiendra des jetons secrets.

Votre bien que voici expose le concept "Protéger le concept de données". Ce que vous voulez vraiment que l'application protège est quelques pièces de données critiques: les jetons secrets.

Comment protéger les données lorsque l'application ne peut pas se protéger?

Vous passez la responsabilité du système d'exploitation. Il existe deux types de protection que les systèmes d'exploitation peuvent offrir: contrôle d'accès et cryptographie. La plupart des protections que nous utilisons lorsque nous autorisons ou nierons la lecture de données ou effectuer une action spécifique sont des contrôles d'accès.

Un contrôle d'accès prend comme entrée une action et un identifiant qui veut faire l'action. Sa sortie est approuve ou refuser la permission d'effectuer l'action. Un contrôle d'accès utilise un ensemble ou des règles ou une table pour déterminer si un identifiant doit être autorisé à effectuer une action.

Par exemple: Alice a un jeu de fusion de jeu sur un ordinateur. Le contrôle d'accès de l'ordinateur a une règle que seule Alice peut exécuter Fungame. Bob se trouve à l'ordinateur et tente de courir Fungame. Le contrôle d'accès de l'ordinateur prend en entrée 'Exécuter Fungame' et 'Bob'. Basé sur la règle 'Seul Alice peut exécuter Fungame', la sortie du contrôle d'accès est nie.

Le contrôle d'accès fournit une manière directe et générale de prendre des décisions concernant l'autorisation ou la nier, tandis que la cryptographie fournit une méthode plus indirecte pour permettre ou nier. Avec le cryptage et le déchiffrement, nous pouvons transformer des données afin que les données aient un sens ou n'ont aucun sens.

Le cryptage et le déchiffrement nécessitent au moins une clé cryptographique. La valeur de la clé devient un contrôle d'accès avec les deux règles "permettent à quiconque la clé de prendre des données compréhensibles et de la rendre incompréhensible" et "permettre à quiconque la clé de prendre des données incompréhensibles et de le rendre compréhensible". Faire des données incompréhensibles protège uniquement les données d'apporter. Une personne peut toujours être en mesure de lire les données, mais elle ne sera pas sous une forme qu'ils comprennent.

Notez que la clé au lieu de l'identifiant d'un acteur devient le composant essentiel. Toute personne qui a la clé, peu importe la façon dont ils l'obtiennent, peuvent accéder aux données. Cela rend la clé de la clé un problème. Si vous stockez la clé sur le même système que les données que vous fournissez n'importe qui avec les moyens d'accéder à vos données. C'est pourquoi les phraséphrases nécessitent une mémorisation. Mémorisation d'une phrase secrète stocke la clé (passhéque) dans votre tête au lieu de sur le système.

Donc, pour protéger vos jetons, vous pouvez utiliser les contrôles d'accès du système d'exploitation, ou vous pouvez chiffrer les jetons ou les deux. Si une personne dispose d'un système d'exploitation qui n'applique pas ses propres contrôles d'accès (iPhone jailbreaké ou enraciné Android téléphone), vous ne pouvez pas compter sur les contrôles d'accès du système d'exploitation. Cependant, aussi longtemps que la clé Utilisé pour chiffrer vos jetons ne réside pas sur le même système que les jetons cryptés, vos jetons seront toujours protégés même si le système d'exploitation est compromis.

Cependant, garder la clé du système en question est un autre problème difficile appelé gestion clé.

[2] Si cela peut toujours être fissuré, est-ce que l'application peut indiquer à quelqu'un ou à sa propre soi que celle-ci a été craquée (comme une vérification de la somme de contrôle ou du certificat ou le système d'exploitation le faire pour l'application) et prendre une action?

L'application binaire peut être infectée ou un code incorrect peut être injecté pendant que le programme est également en mémoire, les méthodes suggérées devraient donc être en mesure de traiter ces deux cas.

Le concept d'examen d'une donnée de données à voir si elle est inhabituée depuis sa dernière inspection s'appelle la vérification de l'intégrité. Un moyen efficace d'évaluer l'état d'un morceau de données est appelé hachage cryptographique. Pour effectuer une vérification d'intégrité, vous devez d'abord calculer le hachage cryptographique d'un morceau de données, puis protéger la valeur de hachage résultante. À une heure ultérieure recalculer le hachage cryptographique sur le même morceau de données. Comparez la valeur de hachage recalculée à la valeur de hachage protégée. Si les deux valeurs sont identiques, les données sont inchangées. Si les deux valeurs de hachage diffèrent, les données ont été modifiées.

Vous pouvez traiter l'application binaire en stockage comme une donnée et effectuer une vérification de l'intégrité. Vous pouvez également traiter l'application binaire en mémoire comme une donnée et effectuer une vérification d'intégrité.

Le concept d'examen d'un programme de fonctionnement pour voir s'il s'agit de traitement tel que conçu est appelé attestation. Vérification de toute la mémoire utilisée par le code d'exécution est typiquement infaisable afin que l'attestation vérifie généralement quelque chose d'un peu plus simple, telles que les valeurs de certains ensembles de données ou l'état du programme exécutant et sa transition entre les États. L'attestation est difficile à obtenir, il n'est donc pas largement utilisé dans les logiciels commerciaux.

5
this.josh

Bien qu'ils soient des méthodes de code auto-modifiant (par exemple, auto-modificatives intelligentes (par exemple) et de vérification automatique pour Obj-C, Java/Dalvik, IPA, Jar et APK - c'est ma conviction qu'ils sont tous aussi facilement que subversés que leur Asm, c, c ++, cousins ​​PE et elfe. Les capacités des ingénieurs inverse sont de manière directe de l'année 2012.

Ma suggestion est de conserver la totalité de votre propriété intellectuelle sur le côté serveur et d'authentifier et d'autoriser avec précautionner toutes les actions ou l'inaction, semblables à la manière dont les mmorpgs non rootkit attrapent des tricheurs (par exemple quelque chose comme, mais pas tout à fait, punkbuster).

Les applications mobiles devraient être trop simples et ne doivent jamais faire confiance à l'utilisateur - comme chaque application côté client.

4
atdre