Comment puis-je empêcher le vol de mon code?

Que se passe-t-il exactement quand je lance un fichier .NET? Je sais que C # est compilé en code IL et je pense que le fichier exe généré est simplement un lanceur qui lance le runtime et lui transmet le code IL. Mais comment? Et à quel point le processus est-il complexe?

Le code IL est incorporé dans l’exe. Je pense qu’il peut être exécuté à partir de la mémoire sans l’écrire sur le disque alors que les exe ordinaires ne le sont pas (ok, oui mais c’est très compliqué).

Mon dernier objective est d’extraire le code IL et d’écrire mon propre lanceur chiffré afin d’empêcher les scriptkiddies d’ouvrir mon code dans Reflector et de voler facilement toutes mes classes. Eh bien, je ne peux pas empêcher l’ingénierie inverse complètement. S’ils sont capables d’inspecter la mémoire et de capturer le moment où je transmets l’IL pur à l’exécution, le fait qu’il s’agisse d’un fichier .net ou non importe peu, n’est-ce pas? Je sais qu’il existe plusieurs outils d’obscurcissement, mais je ne veux pas gâcher le code IL lui-même.

EDIT: il semble donc que ça ne vaut pas la peine d’essayer ce que je voulais. Ils vont le craquer quand même … Je vais donc chercher un outil d’obscurcissement. Et oui, mes amis ont également dit qu’il suffisait de renommer tous les symboles en un nom dénué de sens. Et l’ingénierie inverse ne sera pas si facile après tout.

Si vous souhaitez absolument chiffrer votre assemblage, la meilleure façon de le faire est probablement de placer votre code de programme dans des assemblys de bibliothèques de classes et de les chiffrer. Vous pouvez ensuite écrire un petit fichier exécutable qui déchiffre les assemblages en mémoire et les exécute.

C’est une très mauvaise idée pour deux raisons:

  1. Vous allez devoir inclure la clé de cryptage dans votre stub. Si un pirate 1337 peut utiliser vos ensembles réfléchis de manière significative, il peut tout aussi bien voler votre clé de cryptage et les décrypter lui-même. (Ceci est fondamentalement le trou analogique )
  2. Personne ne se soucie de votre code 1337. Je suis désolé, mais c’est un amour difficile. Personne d’autre ne pense que le code de quelqu’un est presque aussi intéressant que l’auteur.

Un “secret” que vous partagez avec des milliers de personnes n’est pas un secret. N’oubliez pas que vos attaquants n’ont qu’à briser votre schéma de “cryptage” sortingvial-à-casser-parce-que-la-clé-est-juste-là-bas.

Si votre code est si précieux qu’il doit restr secret, gardez-le secret . Laissez le code uniquement sur vos propres serveurs; écrivez votre logiciel en tant que service Web. Puis sécurisez le serveur.

le fichier exe généré est juste un lanceur qui lance le runtime et lui transmet le code IL.

Pas exactement. Il existe différentes manières de configurer votre programme, mais normalement, le code IL est compilé en code machine natif qui s’exécute en processus avec le moteur d’exécution.

En ce qui concerne les enfants, vous vous leurrez si vous pensez pouvoir leur vendre ou à quiconque utilise ce qu’ils redissortingbuent. S’ils ne peuvent pas déverrouiller votre application, ils iront de l’avant et en trouveront une qu’ils peuvent ou dont ils pourraient se passer. Ils représentent exactement 0 $ en ventes potentielles; cela n’a aucun sens de faire trop d’efforts pour tenter de les contrecarrer, car votre investissement ne rapporterait rien. Un obscurcisseur de base pourrait convenir, mais n’allez pas plus loin.

De manière réaliste, la plupart des développeurs sont confrontés à un défi beaucoup plus grand lié à l’obscurité qu’au piratage. Tout ce que vous faites qui vous empêche de faire connaître votre produit vous fait plus de mal que ne le font les pirates. Cela inclut faire payer les gens pour l’obtenir. La plupart du temps, une meilleure approche consiste à disposer d’une version gratuite de votre application que les enfants n’ont même pas besoin de déverrouiller. quelque chose qui fonctionne déjà assez bien pour eux pour que craquer votre application ne soit qu’une perte de temps, et pas seulement un essai limité dans le temps. Laissez-les et autant d’autres que possible le diffuser au loin.

Maintenant, je sais que vous avez éventuellement besoin de clients payants. L’important est d’utiliser à présent toute l’attention que vous obtenez du produit gratuit pour promouvoir ou promouvoir quelque chose d’autre plus rentable. Une option consiste ici également à disposer d’une version premium avec des fonctionnalités supplémentaires destinées en grande partie à un public d’entresockets; faciliter, par exemple, le déploiement sur un réseau complet et sa gestion. Les entresockets ont des poches plus profondes et sont plus susceptibles de payer vos droits de licence. Votre version gratuite sert ensuite à promouvoir votre produit et à lui donner une légitimité pour vos clients professionnels.

Bien sûr, il existe également d’autres modèles, mais quoi que vous fassiez, cela vaut la peine de rappeler que l’obscurité est le plus gros défi et que les copies piratées de votre logiciel ne se traduiront jamais en ventes. En fin de compte (et bien sûr, cela dépend de votre exécution), vous serez en mesure de gagner plus d’argent avec un modèle d’entreprise qui tire parti de ces points que d’essayer de les combattre.

“… empêche les scriptkiddies d’ouvrir mon code dans Reflector et de voler toutes mes classes facilement.”

Malheureusement, quelle que soit la manière dont vous masquez le lancement, il suffit d’une demi-douzaine de commandes dans un débogueur pour vider un assemblage en cours d’exécution dans un fichier choisi par l’utilisateur. Ainsi, même si vous pouvez lancer votre application comme suggéré par Brian, il n’est pas difficile d’obtenir les composants de cette application dans Reflector une fois qu’elle est en cours d’exécution (je peux envoyer un exemple de WinDbg si quelqu’un le trouve intéressant).

Les outils d’obfuscation sont créés à partir d’une énorme expérience technique et sont souvent conçus pour empêcher les débogueurs de s’attacher de manière fiable à un processus ou d’en extraire des informations. Comme Brian l’a dit: Je ne suis pas certain de la raison pour laquelle vous êtes déterminé à préserver la liberté d’apprentissage et, si vous souhaitez une protection significative contre les scripts pour enfants, vous devrez peut-être changer d’avis.

“Ils ont copié tout ce qu’ils pouvaient suivre, mais ils ne pouvaient pas copier mon esprit, alors je les ai laissés transpirer et voler un an et demi derrière.” – R. Kipling

Personnellement, je pense que l’obscurcissement est la solution. C’est simple et peut être efficace, surtout si tout votre code est dans un exe (je ne suis pas sûr de ce que le problème est de “foutre en l’air”).

Cependant, si vous sentez que cela ne fonctionnera pas pour vous, vous pouvez peut-être chiffrer votre fichier exe et l’intégrer comme ressource de recherche dans votre programme de lancement. Le moyen le plus simple de le gérer serait de déchiffrer la ressource exe, de l’écrire dans un fichier et de l’exécuter. Une fois l’exécution de l’exécutable terminée, supprimez le fichier. Vous pourriez également être en mesure de l’exécuter via les fonctions Emit. Je ne sais pas du tout comment cela fonctionnerait, mais voici un article pour vous aider à démarrer – Utilisation de Reflection Emit pour mettre en cache des assemblages .NET .

Bien sûr, votre clé de déchiffrement devrait probablement être intégrée à l’exécutable, de sorte que quelqu’un de vraiment déterminé sera capable de déchiffrer votre assemblage de toute façon. C’est pourquoi l’obscurcissement est probablement la meilleure approche.

Copier ma réponse à partir de cette question (qui n’est pas exactement dupliquée mais qui peut être résolue avec la même réponse, donc CW):

Un EXE Windows contient plusieurs “pièces”. Simplifié , le code .net (= MSIL) n’est qu’une partie de l’EXE. Il existe également une “vraie” partie Windows native dans l’EXE qui sert de lanceur au framework .net qui exécute ensuite MSIL.

Mono va juste prendre le MSIL et l’exécuter, en ignorant les éléments natifs de Windows Launcher.

Encore une fois, ceci est un aperçu simplifié.

Edit: Je crains que ma compréhension des détails profonds de Depp ne soit pas suffisante pour vraiment beaucoup de détails (je sais plus ou moins ce qu’est un en-tête PE, mais pas vraiment les détails), mais j’ai trouvé ces liens utiles:

Structure d’assemblage NET – Partie II

Fondations .NET – Structure d’assemblage .NET

Annexe: Si vous voulez vraiment aller plus loin, procurez-vous une copie sur Advanced .net Debugging . Le tout premier chapitre explique exactement comment l’assemblage .net est chargé avant et après Windows XP (depuis XP, Windows Loader est conscient de .net, ce qui change radicalement le mode de démarrage des applications .net).