webentwicklung-frage-antwort-db.com.de

Kompilieren von C # zu Native?

Ich glaube, ich bin etwas verwirrt über das Kompilieren von .NET-Bytecode in systemeigenen Code, oder vielleicht bin ich verwirrt über das Endergebnis. Bitte nehmen Sie Kontakt mit mir auf, wenn ich versuche, das zu sortieren, was ich zu verstehen glaube, damit Sie mir helfen können, herauszufinden, was mir fehlt.

Was ich tun möchte, ist meine in C # geschriebene Anwendung in normalen nativen Code zu kompilieren , wie ich es bekommen würde, wenn ich sie in C geschrieben hätte. Meine Argumentation hat nichts mit Leistung zu tun, sondern mit einem gewissen Grad an Schutz. Ich verstehe, dass mein Endziel nicht unmöglich (oder sogar so schwierig) zu umgehen ist, aber ich habe das Gefühl, dass es schwieriger ist, die x86-Assembly umzukehren, als das, was Reflector mir gibt.

Wenn ich jetzt meine C # -Anwendung in Reflector stecke, bekomme ich im Grunde genommen meinen Quellcode zurück. Wenn ich meine nicht verwalteten C/C++ - Anwendungen in IDAPro verwende und den HexRays-Dekompiler verwende, erhalte ich in der Regel nicht den gleichen Grad der Dekompilierung zurück und muss auf das Durchwaten der x86-Disassembly zurückgreifen, um den Logikfluss zu verstehen. Ich verstehe, dass diese großartige Dekompilierung von Reflector kommt, weil sich die Anwendung in MSIL befindet und nicht in dem knapperen nativen Code, den HexRays zu dekompilieren versucht.

Ich habe keine Bedenken, dass der Client-Rechner immer noch die .NET-Laufzeiten benötigt. Ich versuche nicht, irgendetwas davon zu umgehen. Ich möchte normale Software-Verschleierungsprogramme wie upx auf meinem Programm ausführen, und dies als .NET-Binärdatei zu tun, schlägt fehl.

Es war mein Verständnis aus diese verwandte Frage, dass ngen tut, was ich will. Ich habe versucht, ngen zu verwenden. Nach dem Kopieren der Ausgabedatei aus dem Verzeichnis C:\Windows\assemblies\...\applicationName.ni.exe In ein anderes Verzeichnis kann ich doppelklicken, und der Versuch, sie auszuführen, führt zu einem Fehler, dass es sich nicht um eine "gültige Win32-Anwendung" handelt. Wenn ich den applicationName.ni.exe In Reflector wirf, erhalte ich die gleiche Ausgabe wie mit dem applicationName.exe. Da applicationName.ni.exe Nativer Code sein soll, habe ich erwartet, dass Reflector einen Fehler macht, aber das war nicht der Fall. Wenn das so ist, wie ich es tun soll, warum hat Reflector mich dann immer noch so großartig dekompiliert?

Um meine Hauptfrage noch einmal zusammenzufassen: Wie kann ich mein .NET-Programm in eine native Binärdatei kompilieren, die Reflector nicht so einfach dekompiliert? Oder welche Best Practices gibt es, um ein in einer .NET-Sprache geschriebenes Produkt vor unerfahrenen Reverse-Engineers zu schützen?

Wenn ich ein anderes Tool benötige, bevorzuge ich etwas Freies und nicht etwas wie Codewall .

Vielen Dank!

UPDATE: Ich verstehe, dass das, wonach ich suche, einige der Merkmale der Sprache wie Reflection einschränken könnte, aber ich denke, ich bin damit einverstanden . Keiner meiner Codes führt explizite Assembly.Load - Aufrufe oder ähnliches aus. Aber konnten diese nicht trotzdem durch GetProcAddress/LoadLibrary - Aufrufe ersetzt werden?

64
mrduclaw

Ich habe gerade validiert. Net Native auf VS2015 & Windows 8.1 (bei korrekter Konfiguration überprüfen Sie .proj, um zu validieren) Wenn Sie für eine bestimmte Architektur bauen (möglicherweise übertrieben, nicht validiert), wird eine native Datei erstellt, die den Code "schwerer zurückzuentwickeln" enthält, nach dem Sie suchen, der für mich deaktiviert war zum Lesen von . dll über DotPeek (kostenloser .Net-Dekompiler von JetBrains).

21
Sivx

So funktioniert ngen.exe nicht. Es wird lediglich der JIT-Compiler ausgeführt, um das Modul .ni.exe oder .ni.dll zu generieren. Diese Binärdatei enthält keine Metadaten, nur den Maschinencode, der aus der AWL für die Methodenkörper generiert wurde. Die CLR muss weiterhin die Originalbaugruppe finden. Nur dann kann es feststellen, dass ein generiertes Image verfügbar ist, sodass es den Maschinencode daraus verwenden kann, anstatt ihn aus der IL der Assembly zu generieren.

Ngen.exe beschleunigt den Warmstart Ihrer App, das ist alles.

Mein üblicher Rat an alle, die daran interessiert sein könnten, meine Baugruppen zu zerlegen, ist, sie auf sourceforge.net zu verweisen. Es hat Terabyte Quellcode, geschrieben und gepflegt von Programmierern, die normalerweise besser sind als ich. Manchmal auch mit guten Kommentaren. Wenn Ihr Obfuscator nicht gut funktioniert, suchen Sie nach einem besseren. Da sind viele.

29
Hans Passant

Gestern, um Build 2014 , kündigte Microsoft . NET Native an. Laut FAQ , "... konzentrieren wir uns zunächst auf Windows Store-Apps mit .NET Native. Langfristig werden wir native weiter verbessern Kompilierung für alle .NET-Anwendungen. "

18
Ðаn

Wenn Sie Ihren Code schützen möchten, ist ein Obfuscator der typische Ansatz. Dotfuscator ist seit einiger Zeit in einem Wettrüsten mit Reflektoren und wir verwenden es für unsere Produkte. In der Praxis kann ein Fachmann jedoch leicht verschleierten Code lesen.

Das Kompilieren zu nativem Code hat den Zweck, eine verwaltete Sprache zu haben. Der Hauptvorteil besteht darin, der Ziellaufzeit zu ermöglichen, die AWL in etwas zu überführen, das für die Ziel-CPU optimal geeignet ist. Wenn Sie etwas anderes wünschen, würden Sie so etwas wie die Vor-Zeit-Option in Mono verwenden.

17
plinth

Spoon (zuvor Xenocode) hat ein Produkt, das möglicherweise Ihren Anforderungen entspricht . Wir verwenden es für eine WPF-basierte Installationsoberfläche, sodass wir nicht bootstrap .net müssen, um das Setup-Programm selbst zu laden.

8
dkackman

NGEN fügt nativen Code hinzu, entfernt jedoch nicht die MSIL. Daher kann jedes Tool, das unter MSIL ausgeführt wird, weiterhin funktionieren. Sie benötigen dies auch zum Nachdenken, was für einen echten nativen Compiler sehr schwierig wäre.

7
MSalters

dies ist ein kostenloser Obfuscator, der recht gut ist: eazfuscator

5
chris

Dies ist endlich mit dem .NET Native Compiler von Microsoft möglich

Die Release-Version von Apps, die in verwaltetem Code (C # oder Visual Basic) geschrieben sind und das .NET Framework und Windows 10 auf systemeigenen Code ausrichten, wird automatisch kompiliert.

..

• Ihre Apps bieten die überlegene Leistung von nativem Code.

• Sie können weiterhin in C # oder Visual Basic programmieren.

• Sie können weiterhin die von .NET Framework bereitgestellten Ressourcen nutzen, einschließlich der Klassenbibliothek, der automatischen Speicherverwaltung und Garbage Collection sowie der Ausnahmebehandlung.

Für Benutzer Ihrer Apps bietet .NET Native die folgenden Vorteile:

• Schnelle Ausführungszeiten

• Gleichbleibend schnelle Startzeiten

• Geringe Bereitstellungs- und Aktualisierungskosten

• Optimierte Nutzung des App-Speichers

.NET Native umfasst jedoch mehr als nur die Kompilierung von nativem Code. Es verändert die Art und Weise, wie .NET Framework-Apps erstellt und ausgeführt werden. Im Speziellen:

• Während der Vorkompilierung werden erforderliche Teile von .NET Framework statisch mit Ihrer App verknüpft. Auf diese Weise kann die App mit app-lokalen Bibliotheken von .NET Framework ausgeführt werden, und der Compiler kann globale Analysen durchführen, um Leistungsgewinne zu erzielen. Infolgedessen werden Apps auch nach .NET Framework-Aktualisierungen durchgehend schneller gestartet.

• Die .NET Native-Laufzeit ist für die statische Vorkompilierung optimiert und bietet daher eine überlegene Leistung. Gleichzeitig bleiben die zentralen Reflexionsfunktionen erhalten, die Entwickler für so produktiv halten.

• .NET Native verwendet dasselbe Back-End wie der C++ - Compiler, der für statische Vorkompilierungsszenarien optimiert ist.

https://msdn.Microsoft.com/en-us/library/dn584397 (v = vs.110) .aspx

Dies ist nur mit VS.NET 2015 verfügbar.

5
Amir

Ich könnte zurücktreten und fragen, warum Sie nach dieser Art von Schutz suchen. Ich versuche nicht zu argumentieren, dass Sie den Schutz nicht brauchen, aber ich denke, es lohnt sich, die Motivation zu verstehen.

Wenn Sie beispielsweise Schutz wünschen, weil Sie einen Algorithmus in Ihrem System haben, der für die Sicherheit verheerend wäre, wenn jemand ihn rückentwickelt hätte, müssen Sie möglicherweise einen anderen Ansatz in Betracht ziehen. Dies bedeutet, dass der Algorithmus fehlerhaft ist und dass Ihnen keine Verschleierung oder native Kompilierung dabei hilft.

Wenn es um geistiges Eigentum geht, dann denke ich, ist die Verschleierung wahrscheinlich der beste Ansatz hier. Es ist so, als würde man ein Schloss an der Tür anbringen. Jemand kann das Schloss aufbrechen und einsteigen, aber er tut es absichtlich, anstatt nur durch die Tür zu gehen.

4
Brian Genisio

Dies ist mit dem IL2CPU-Compiler möglich. IL2CPU wird von denselben Leuten entwickelt, die COSMOS (C # Open Source Managed Operating System) herstellen, und ist nur durch Herunterladen von cosmos verfügbar. IL2CPU erzeugt ASM-Dateien, die über Nasm kompiliert werden können (einige andere Assembler funktionieren möglicherweise, es ist jedoch am besten, nasm zu verwenden). Das einzige Problem mit IL2CPU ist, dass es in das Cosmos-Projekt integriert ist und es ziemlich schwierig ist, es für sich alleine zum Laufen zu bringen.

3

Andere Antworten erwähnen den nativen Compiler von Microsoft .NET, Sagen Ihnen aber nicht, wie Sie das tun sollen.

Hier ist ein Tutorial, in dem CoreRT zum Kompilieren Ihres C# - Projekts in nativen Code verwendet wird.

Hinweis: Ich musste auch die folgende Zeile auskommentieren, damit alles funktioniert:

<!-- <add key="helloworld" value="https://api.helloworld.org/v3/index.json" /> -->

Die Ausgabe ist eine ungefähr 4MB Große ausführbare Datei:

In der Tat ist der Code mit .NET - Dekompilierern nicht mehr lesbar, und IDA Pro (ein nativer Code-Disassembler) erkennt ihn als nativen Code.

3
BullyWiiPlaza