75 votes

Compiler C # en Natif?

Je pense que je suis un peu confus au sujet de la compilation .NET byte-code en code natif, ou peut-être que je suis confus sur le résultat final. Donc, s'il vous plaît garder avec moi comme j'essaye de faire le tri dans ce que je crois comprendre de sorte que vous pouvez m'aider à comprendre ce que je suis absent.

Ce que je voudrais faire est de compiler mon application écrite en C# vers le bas à la régulière en code natif , comme je serais si je l'avais écrit en C. Mon raisonnement n'a rien à voir avec la performance, mais plutôt avec un certain degré de protection. Je comprends que mon objectif final n'est pas impossible (ou même pas vraiment ce que difficile à contourner, mais j'ai juste envie de renverser x86 assemblée est plus difficile que le renversement de ce Réflecteur me donne.

Pour l'instant, si je lance mon application C# dans le Réflecteur, en gros, j'ai obtenir mon code source en arrière. Généralement, lorsque je jette mon non géré applications C/C++ dans IDAPro et l'utilisation de la HexRays decompiler, je n'arrive pas à obtenir le même degré de décompilation et j'ai du avoir recours à patauger dans des x86 démontage de comprendre la logique de flux. C'est ma compréhension que ces grands décompilation vient de Réflecteur en raison de la demande en MSIL au lieu de la plus laconique code natif HexRays essaie de le décompiler.

Je n'ai pas de préoccupations au sujet de la machine client ont encore besoin de l' .NET runtimes, je ne suis pas d'essayer de contourner cela. Je voudrais lancer un logiciel normal de la dissimulation de programmes, comme upx sur mon programme, et de le faire tant que .NET binaire échoue.

C'était ma compréhension de cette question connexe, qui ngen fait ce que je veux. J'ai essayé à l'aide d' ngen. Mais après avoir copié le fichier de sortie à partir de l' C:\Windows\assemblies\...\applicationName.ni.exe répertoire quelque part je peux double-cliquer dessus et d'essayer de l'exécuter, il se produit une erreur ce n'est pas "une application Win32 valide". De plus, lorsque je mets de l' applicationName.ni.exe dans le Réflecteur, j'obtiens le même résultat que j'ai fait juste de la applicationName.exe. Depuis applicationName.ni.exe est censé être en code natif, je m'attendais à Réflecteur à l'erreur, mais il n'a pas. Si ce la façon dont je suis censé faire cela, pourquoi n'Réflecteur me donnent encore un grand décompilation?

Donc, pour résumer ma question principale: Comment puis-je compiler mon .NET programme dans un fichier binaire natif qui Réflecteur ne sera pas si facilement décompiler? Ou ce qui est de certaines des meilleures pratiques pour la protection d'un produit écrit dans un .NET langue de newbie inverse ingénieurs?

Si j'ai besoin d'un autre outil, je préfère quelque chose de libre et pas quelque chose comme Codewall.

Merci!

Mise à JOUR: je comprends que ce que je suis à la recherche pourrait limiter certaines des caractéristiques de la langue comme Réflexion, mais je pense que je suis bien avec. Aucun de mon code n'explicite Assembly.Load des appels ou quoi que ce soit de la sorte. Mais ne pouvait pas juste être remplacé par GetProcAddress/LoadLibrary des appels de toute façon?

33voto

Hans Passant Points 475940

Ce n'est pas comment ngen.exe des œuvres. Il se borne à s'exécute le compilateur JIT avant de générer le .ni.exe ou .ni.dll le module. Que fichier binaire ne contient pas de métadonnées, seul le code machine généré à partir de la IL pour le corps des méthodes. Le CLR doit encore trouver l'original de l'assemblée. Alors seulement peut-on déterminer qu'il y a un ngen-ed de l'image afin qu'il puisse utiliser le code machine plutôt que de générer de l'assemblée, IL.

Ngen.exe accélère le démarrage à chaud le temps de votre application, c'est tout.

Mon conseil à toute personne qui pourrait être intéressée dans le démontage de mon assemblage est à point à sourceforge.net. Il a téra-octets de code source, écrit et maintenu par des programmeurs qui sont généralement mieux que moi. Parfois, même avec de bons commentaires. Si votre obfuscator ne fonctionne pas bien, alors magasiner pour un meilleur. Il y a beaucoup de.

18voto

Dan Points 3922

Hier, à Build 2014 , Microsoft a annoncé .NET Native . Selon la FAQ , "... Initialement, nous nous concentrons sur les applications du Windows Store avec .NET Native. À long terme, nous continuerons à améliorer la compilation native pour toutes les applications .NET."

17voto

plinth Points 26817

Si vous voulez protéger votre code, un obfuscateur est l'approche typique. Dotfuscator a été dans une course aux armements avec réflecteur pour un certain temps, et nous l'utilisons sur nos produits. Dans la pratique, cependant, un métier de l'humain pouvez facilement lire d'obfuscation de code.

La compilation en code natif défaites le but d'avoir un langage managé. Le principal avantage est de permettre l'exécution cible de JIT, de la IL en quelque chose qui est parfaitement acceptable pour le PROCESSEUR cible. Si vous voulez par ailleurs, vous pouvez utiliser quelque chose comme l' avance option en mono.

8voto

dkackman Points 8131

Spoon (anciennement Xenocode) propose un produit qui répond à vos besoins . Nous l'utilisons pour une interface d'installation basée sur WPF, de sorte que nous n'avons pas à initialiser .net pour charger le programme d'installation lui-même.

7voto

MSalters Points 74024

NGEN ajoute du code natif, mais il ne supprime pas le MSIL. Par conséquent, tout outil fonctionnant sur le MSIL peut toujours fonctionner. Vous avez également besoin de cela pour la réflexion, ce qui serait très difficile pour un vrai compilateur natif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X