2009-08-05 12 views
3

J'ai une question sur un bon moyen de protéger un peu mon application de cacao contre le piratage. Je sais que c'est impossible! Donc, dans mon application, j'ai une méthode isRegistered() qui s'exécute chaque fois que l'utilisateur lance l'application. Ceci est appelé par le délégué applicationDidFinishLaunching: App. Donc, si cette méthode renvoie true, l'application continue à exécuter le code, sinon une alerte apparaît indiquant que l'application n'est pas enregistrée et qu'il y a xx jour pour acheter une licence.Cocoa app - problème de sécurité

C'est un bon moyen? Parce que, je n'ai aucune expérience dans ce domaine.

Merci d'avance pour votre aide!


SOLVED

Tout d'abord, merci à tout le monde! Je pense la même chose: toute protection contre la copie peut arrêter le piratage. J'essaye seulement de résoudre ce petit bogue, même si je sais que quelqu'un va craquer à nouveau mon application. Cependant, c'est vrai - la meilleure chose est d'améliorer l'application et de ne pas perdre de temps pour essayer de rendre la protection contre le piratage plus efficace.

+0

Ce post me rappelle un épisode de Seinfeld! Mais sinon c'est une bonne question! :) – jbrennan

+0

@BitDrink Dans votre section Résolu, aviez-vous vraiment l'intention de dire "toute protection contre la copie peut arrêter le piratage"? Basé sur les conversations ci-dessous, "aucune protection contre la copie peut arrêter le piratage" serait plus correct. – CajunLuke

Répondre

7

La solution que vous décrivez n'exige presque aucune expertise pour se fissurer. Il est trivial de changer votre fonction isRegistered() pour toujours retourner vrai. Ainsi, l'effort nécessaire pour contourner votre protection est une infime fraction de l'effort que vous auriez à consacrer à la mise en œuvre de toute l'infrastructure pour aider les utilisateurs à acheter des codes d'enregistrement. En d'autres termes, vous n'obtenez pas un bon retour sur investissement. Il y a un certain débat pour savoir si le retour sur investissement mettant en œuvre la protection contre le piratage (plutôt que d'améliorer votre produit) est suffisamment bon (parce que vous vous dressez contre des gens qui n'ont rien de mieux à faire que de prouver qu'ils sont plus intelligents que vous).

Un bon moyen de rétablir l'équilibre du retour sur investissement est d'utiliser un code préexistant tel que AquaticPrime. De cette façon, au moins vous n'aurez pas passé autant de temps à courir après les arcs-en-ciel :)

+0

Vous avez raison! Ce que vous avez décrit est ce qui s'est passé avec mon application! Un pirate a remplacé l'appel isRegistered() avec une valeur TRUE constante! AquaticPrime est bon mais je ne veux pas utiliser un framework! Il y a quelque chose que je peux faire pour résoudre ce problème? Cependant, merci! – BitDrink

+1

@BitDrink: Vous ne pouvez pas en faire trop à ce sujet. Peu importe la complexité de votre système anti-piratage, il s'agit d'une décision unique: authentique ou piratée. Le cracker trouvera ce point et le remplacera par constant vrai. Vous pouvez utiliser des sommes de contrôle mais il en va de même pour le code de contrôle de somme de contrôle. – stribika

+0

Et si je n'utilise pas l'appel isRegistered() mais que j'implémente le corps de cette méthode [isRegistered()] dans le délégué applicationDidFinishLaunching, c'est une bonne solution ou c'est la même chose? (merci pour la réponse) – BitDrink

4

Je ne suis pas dans une entreprise de logiciels emballés sous film rétractable, mais mon ami est. Et son observation après 10 ans de vente de son produit était que cela n'a aucun sens de créer une protection trop sophistiquée parce que toujours quelqu'un va le pirater. Vous êtes seul et le monde est infini. Il est préférable d'investir du temps et de l'argent dans l'amélioration de votre logiciel plutôt que de travailler sur la protection contre la copie. Gardez également à l'esprit qu'environ 10% ne voleront jamais et que 10% d'entre eux essaieront toujours. Assurez-vous simplement que ces 80% est en mesure d'acheter votre produit sans aucun autre obstacle maire. Que vous pourriez ignorer ces méchants 10%. En fait, c'est une citation de Joel Spolsky IHMO.

Donc, votre solution semble être complètement OK du point de vue technique et rester avec elle.

+0

Votre suggestion est la bienvenue! Merci! – BitDrink

0

Ceci est une bonne question. Après avoir lu les réponses, je pense que ce que BitDrink voulait vraiment faire était: nous savons qu'une fonction isRegistered() est simple à pirater. Sachant que tout système de protection sera éventuellement piraté, quelles sont les stratégies pour écrire une fonction qui est plus difficile à pirater qu'une fonction isRegistered qui retourne un booléen?

Fondamentalement, tout système de protection contre la copie finira par avoir quelque chose qui ressemble à ceci:

if (program is registered) 
    let the program continue 
else 
    nagging message 
end 

Tout pirate avec une copie de GDB finira par trouver la première ligne et écrire un tout petit patch pour dépouiller dehors. La plupart des systèmes de protection contre la copie se concentrent sur la sécurité par l'obscurité, c'est-à-dire en rendant cette ligne difficile à trouver. Vous pouvez également rendre ce système plus robuste en signant le binaire et en vérifiant la signature, mais vous n'aurez qu'à ajouter un autre cerceau pour que les hackers puissent y passer. Ils trouveront éventuellement votre clé publique et la remplaceront par leur propre clé publique afin de pouvoir remplacer votre signature. Cependant, je crois que cela les ralentira considérablement. Leopard offre un utilitaire de signature de code, mais je ne sais pas s'il peut être utilisé pour empêcher des applications signées incorrectement de fonctionner.

Il n'y a pas une solution parfaite à ce problème, mais il y a deux choses à retenir:

  1. votre système d'enregistrement sera être brisé. Il n'y a absolument aucun moyen de contourner cela.
  2. votre système de reglstration est une barrière entre l'utilisateur et votre programme. Vous devriez optimiser pour la (espérons la majorité des) utilisateurs légitimes et rendre cela aussi facile que possible.
2

Cela ne vaut presque jamais la peine de mettre en œuvre votre propre système anti-piratage, car vous devrez presque toujours consacrer beaucoup d'efforts à quelque chose qui peut ensuite être cassé très facilement. S'appuyer sur une implémentation partagée - dans ce cas un cadre comme AquaticPrime (beaucoup de personnes sur la liste de diffusion macsb le recommandent) - et vous vous fiez effectivement sur le cadre étant assez bon pour protéger votre propre application ainsi que tous les autres . Le cadre de signature de code sur Leopard et plus tard vous permet de signer votre code de telle sorte que s'il est trafiqué, il refusera de s'exécuter - voir la documentation de l'option kill dans le manpage.