Compiler C# to Native?

je pense que je suis quelque peu confus au sujet de compiler .NET byte-code au code natif, ou peut-être que je suis confus au sujet du résultat final. Alors s'il vous plaît, supportez-moi pendant que j'essaie de trouver ce que je crois comprendre pour que vous m'aidiez à comprendre ce que je rate.

ce que j'aimerais faire c'est compiler mon application écrite en C# jusqu'au code natif régulier comme je l'aurais 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 très difficile) à contourner, mais j'ai juste l'impression d'Inverser l'assemblage x86 est plus difficile que d'inverser ce que le réflecteur me donne.

maintenant si je jette mon application C# dans Reflector, je récupère mon code source. En général, quand je jette mes applications C/C++ non gérées dans IDAPro et que J'utilise le décompilateur HexRays, Je n'obtiens pas le même degré de décompilation de retour et je dois recourir à échauffer à travers le démontage x86 pour comprendre le flux logique. Je crois comprendre qu'une telle décompilation provient de Reflector car L'application est dans MSIL au lieu du code natif plus terne que HexRays essaie de décompiler.

Je n'ai aucune inquiétude à propos de la machine client qui a encore besoin de l'exécution .NET, Je n'essaie pas de contourner tout cela. J'aimerais lancer des programmes d'obscurcissement comme upx sur mon programme, et le faire comme un binaire .NET échoue.

d'après ce que j'ai compris de cette" question connexe fait ce que je veux. J'ai essayé ngen . Mais après avoir copié le fichier de sortie à partir du répertoire C:Windowsassemblies...applicationName.ni.exe quelque part, je peux double-cliquer, et essayer de l'exécuter produit une erreur à propos de lui n'étant pas"une application Win32 valide". En outre, quand je jette le applicationName.ni.exe dans le réflecteur, je reçois le même résultat que pour le applicationName.exe . Comme applicationName.ni.exe est censé être un code natif, Je m'attendais à ce que Reflector se trompe, mais ce n'est pas le cas. Si c'est comme ça que je dois faire, pourquoi le réflecteur m'a-t-il donné une telle décompilation?

donc, juste pour résumer ma question principale encore une fois: Comment puis-je compiler mon programme .NET dans un binaire natif que le réflecteur ne se décompose pas si facilement? Ou quelles sont les meilleures pratiques pour protéger un produit écrit dans un. net le langage des ingénieurs novices?

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

Merci!

mise à jour: je comprends que ce que je cherche pourrait limiter certaines des caractéristiques du langage comme la réflexion, mais je pense que je suis d'accord avec cela. Aucun de mes codes ne fait d'appels explicites Assembly.Load ou quoi que ce soit du sorte. Mais ne pourrait-on pas les remplacer par des appels GetProcAddress/LoadLibrary de toute façon?

60
demandé sur Community 2009-12-17 16:03:47

10 réponses

je viens de validé .Net Native sur VS2015 & Windows 8.1 (lorsqu'il est configuré correctement, examiner .proj to validate) et la construction d'une architecture particulière (peut-être exagéré, n'ont pas validé), va produire un fichier natif qui vous donnera le " plus difficile de rétro-ingénierie " code que vous recherchez qui pour moi était impossible de lire .DLL via DotPeek (Free.Net decompiler from JetBrains).

19
répondu Sivx 2015-06-15 13:54:48

ce n'est pas comme ça que le ngen.exe fonctionne. Il exécute simplement le compilateur JIT à l'avance pour générer le .ni.exe or .ni.dll module. Ce fichier binaire ne contient pas de métadonnées, seulement le code machine généré à partir de L'IL pour les corps de méthode. Le CLR doit encore trouver l'assemblage original. 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 temps chaud de démarrage de votre application, c'est tout.

mon conseil habituel à tous ceux qui pourraient être intéressés à démonter mes assemblages est de les diriger vers sourceforge.net. Il a des teraoctets de code source, écrits et maintenus par des programmeurs qui sont généralement meilleurs que moi. Parfois, même avec de bons commentaires. Si votre masque ne fonctionne pas bien alors magasinez pour un meilleur. Il y a beaucoup de.

28
répondu Hans Passant 2009-12-17 13:21:16

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

17
répondu Ðаn 2014-04-03 13:31:46

Si vous voulez protéger votre code, un obfuscateur est l'approche typique. Dotfuscator est dans une course aux armements avec réflecteur depuis un certain temps et nous l'utilisons sur nos produits. Dans la pratique, cependant, un humain habile peut facilement lire le code obscurci.

compiler en code natif va à l'encontre de l'objectif d'avoir un langage géré. Le principal avantage est de permettre à la cible runtime de JIT the IL dans quelque chose qui est optimalement acceptable pour le PROCESSEUR cible. Si vous voulez autrement, vous utiliserez quelque chose comme l'option en avance sur le temps en mono .

16
répondu plinth 2009-12-17 13:09:21

Spoon (auparavant Xenocode) a un produit qui pourrait correspondre à vos besoins . Nous l'utilisons pour un programme D'installation basé sur WPF, donc nous n'avons pas besoin de bootstrap .net pour charger le programme d'installation lui-même.

8
répondu dkackman 2011-03-04 16:37:47

ngen ajoute le code natif, mais il ne supprime pas le MSIL. Par conséquent, tout outil fonctionnant sur le MSIL peut encore fonctionner. Vous avez également besoin de cette réflexion, quelque chose qui serait très difficile pour un vrai compilateur natif.

7
répondu MSalters 2009-12-17 13:10:50

c'est un masque gratuit, ce qui est très bien: eazfuscator

5
répondu chris 2010-09-08 12:01:53

je pourrais prendre du recul et vous demander pourquoi vous cherchez ce type de protection. Je n'essaie pas de dire que vous n'avez pas besoin de protection, mais je pense que cela vaut la peine de comprendre la motivation.

par exemple, si vous voulez une protection parce que vous avez un algorithme dans votre système où il serait dévastateur pour la sécurité si quelqu'un l'a rétro-conçu, alors vous pourriez avoir besoin d'envisager une approche différente. Cela signifie qu'il ya une faille dans l'algorithme et pas de le degré d'obscurcissement ou de compilation native vous y aidera.

si C'est une question de propriété intellectuelle, alors je pense que l'obscurcissement est probablement votre meilleure approche ici. C'est un peu comme mettre une serrure sur votre porte. Quelqu'un peut briser la serrure et entrer, mais il le fait intentionnellement au lieu de simplement marcher dans la porte.

4
répondu Brian Genisio 2009-12-17 13:43:19

C'est finalement possible en utilisant le compilateur natif .NET de Microsoft

il compile automatiquement la version de sortie des applications qui sont écrites en code géré (C# ou Visual Basic) et qui ciblent le .net Framework et Windows 10 en code natif.

..

•vos applications fourniront les performances supérieures de code natif.

"151900920 •* vous pouvez continuer pour programmer en C# ou Visual Basic.

•vous pouvez continuer à profiter des ressources fournies par le .net Framework, y compris sa bibliothèque de classe, la gestion automatique de la mémoire et la collecte des ordures, et le traitement des exceptions.

pour les utilisateurs de vos applications, .NET Native offre ces avantages:

•exécution Rapide des temps

•Constante de temps de démarrage rapide

•Faible déploiement et mise à jour des coûts

•Optimisé application l'utilisation de la mémoire

mais .net Native implique plus qu'une compilation de code natif. Il transforme la façon dont les applications .net Framework sont construites et exécutées. En particulier:

"151900920 • * pendant la précompilation, les parties requises du Framework .NET sont liées statiquement dans votre application. Cela permet à l'application de fonctionner avec les bibliothèques app-locales du Framework .NET, et le compilateur d'effectuer une analyse globale pour optimiser les performances de victoires. Par conséquent, les applications se lancent toujours plus rapidement, même après la mise à jour de .net Framework.

"151900920 •* le .net Native runtime est optimisé pour la précompilation statique et offre ainsi des performances supérieures. En même temps, il conserve les caractéristiques de réflexion de base que les développeurs trouvent si productives.

"151900920 • * .net natif utilise le même back end que le compilateur C++, qui est optimisé pour scénarios de précompilation statique.

https://msdn.microsoft.com/en-us/library/dn584397 (v=V110).aspx

disponible uniquement avec VS.NET 2015.

4
répondu Amir 2015-10-29 15:32:50

cela est possible en utilisant le compilateur IL2CPU. IL2CPU est développé par les mêmes personnes qui font COSMOS (C# Open Source Managed Operating System) et n'est disponible qu'en téléchargeant cosmos. IL2CPU produit des fichiers ASM qui peuvent être compilés par Nasm (d'autres assembleurs peuvent fonctionner, mais il est préférable d'utiliser nasm). le seul problème avec IL2CPU est qu'il est intégré au projet Cosmos et qu'il est assez difficile de le faire fonctionner seul.

3
répondu Tuomas Laakkonen 2013-08-04 15:53:27