Compilare C # in Nativo?

Penso di essere un po ‘confuso riguardo la compilazione del codice byte .NET nel codice nativo, o forse sono confuso riguardo al risultato finale. Quindi, per favore, sopportami mentre cerco di capire cosa penso di capire, così puoi aiutarmi a capire cosa mi manca.

Quello che mi piacerebbe fare è compilare la mia applicazione scritta in C # su un normale codice nativo come se avessi scritto in C. Il mio ragionamento non ha nulla a che fare con le prestazioni, ma piuttosto con un certo grado di protezione. Capisco che il mio objective finale non è imansible (o anche così difficile) da eludere, ma ho proprio voglia di invertire l’assemblaggio di x86 è più difficile che invertire ciò che Reflector mi dà.

In questo momento, se lancio la mia applicazione C # in Reflector, in pratica ottengo il mio codice sorgente. In genere quando lancio le mie applicazioni C / C ++ non gestite in IDAPro e utilizzo il decompilatore HexRays, non riesco a ottenere lo stesso grado di decompilazione e devo ricorrere al guado del disassemblaggio x86 per capire il stream logico. Ho capito che una tale decompilazione deriva da Reflector a causa del fatto che l’applicazione è in MSIL invece del più nativo codice nativo che HexRays tenta di decompilare.

Non ho dubbi sul fatto che la macchina client abbia ancora bisogno dei runtime .NET, non sto cercando di eludere nulla di tutto ciò. Mi piacerebbe eseguire normali programmi di offuscamento del software come upx sul mio programma, e farlo come un binario .NET fallisce.

Ho capito da questa domanda correlata che ngen fa quello che voglio. Ho provato a usare ngen . Ma dopo aver copiato il file di output dalla directory C:\Windows\assemblies\...\applicationName.ni.exe da qualche parte, posso fare doppio clic e provare a eseguirlo genera un errore a causa del fatto che non è “un’applicazione Win32 valida” “. Inoltre, quando lancio il file applicationName.ni.exe in Reflector, ottengo lo stesso risultato che ho ottenuto solo da applicationName.exe . Dal momento che applicationName.ni.exe dovrebbe essere un codice nativo, mi aspettavo che Reflector si inserisse in errore, ma non è così. Se questo è il modo in cui dovrei fare questo, perché Reflector mi ha ancora dato una così grande decompilazione?

Quindi, solo per riassumere la mia domanda principale di nuovo: come posso compilare il mio programma .NET in un binario nativo che Reflector non decompilerà così facilmente? O quali sono le migliori pratiche per proteggere un prodotto scritto in un linguaggio .NET da ingegneri invianti newbie?

Se ho bisogno di uno strumento diverso, preferirei qualcosa di gratuito e non qualcosa come il Codewall .

Grazie!

AGGIORNAMENTO: Capisco che quello che sto cercando potrebbe limitare alcune delle caratteristiche del linguaggio come Reflection, ma penso che mi stia bene. Nessuno del mio codice fa alcuna esplicita chiamata Assembly.Load o qualcosa del genere. Ma non potrebbero semplicemente essere sostituiti con le chiamate GetProcAddress/LoadLibrary ?

Ho appena convalidato .Net Native su VS2015 e Windows 8.1 (se configurato correttamente, esaminare .proj per convalidare) e build per una particolare architettura (potrebbe essere eccessivo, non essere stato convalidato), produrrà un file nativo che ti darà il ” più difficile da decodificare “il codice che stai cercando, che per me non era abilitato a leggere .dll tramite DotPeek (decompilatore .Net gratuito da JetBrains).

Non è così che funziona ngen.exe. Esegue semplicemente il compilatore JIT in primo piano per generare il modulo .ni.exe o .ni.dll. Quel file binario non contiene metadati, solo il codice macchina generato dall’IL per i corpi del metodo. Il CLR deve ancora trovare l’assemblaggio originale. Solo in questo modo è ansible determinare che è disponibile un’immagine ngen-editor in modo che possa utilizzare il codice macchina da esso anziché generarlo dall’IL dell’assembly.

Ngen.exe accelera il tempo di avvio della tua app, tutto qui.

Il mio consueto consiglio a chiunque possa essere interessato a smontare le mie assemblee è di indirizzarle a sourceforge.net. Ha terabyte di codice sorgente, scritto e gestito da programmatori che sono solitamente migliori di me. A volte anche con buoni commenti. Se il tuo obfuscator non funziona bene, cerca di migliorarne uno. Ci sono molti.

Ieri, al Build 2014 , Microsoft ha annunciato .NET Native . Secondo le FAQ , “… Inizialmente, ci stiamo concentrando sulle app di Windows Store con .NET Native. A lungo termine continueremo a migliorare la compilazione nativa per tutte le applicazioni .NET.”

Se vuoi proteggere il tuo codice, un offuscatore è l’approccio tipico. Dotfuscator è stato in una corsa agli armamenti con riflettore per un po ‘e lo usiamo sui nostri prodotti. In pratica, tuttavia, un uomo esperto può facilmente leggere il codice offuscato.

La compilazione in codice nativo vanifica lo scopo di avere una lingua gestita. Il vantaggio principale è quello di consentire al runtime di destinazione di JIT l’IL in qualcosa che sia ottimamente accettabile per la CPU di destinazione. Se vuoi diversamente, dovresti usare qualcosa come l’ opzione in anticipo in mono .

Spoon (precedentemente Xenocode) ha un prodotto che potrebbe adattarsi alle tue esigenze . Lo usiamo per una UI di installazione basata su WPF, quindi non dobbiamo riavviare .net per caricare il programma di installazione stesso.

NGEN aggiunge codice nativo, ma non rimuove MSIL. Pertanto, qualsiasi strumento operativo su MSIL può ancora funzionare. Ne hai bisogno anche per la riflessione, qualcosa che sarebbe molto difficile per un vero compilatore nativo.

questo è un offuscatore gratuito, che è silenzioso: eazfuscator

Potrei fare un passo indietro e chiedere perché stai cercando questo tipo di protezione. Non sto cercando di argomentare che non hai bisogno della protezione, ma penso che valga la pena comprenderne la motivazione.

Ad esempio, se vuoi protezione perché hai un algoritmo nel tuo sistema in cui sarebbe devastante per la sicurezza se qualcuno lo decodifica, allora potresti dover considerare un approccio diverso. Significa che c’è un difetto nell’algoritmo e nessuna quantità di offuscamento o compilazione nativa ti aiuterà.

Se è una questione di IP, penso che l’offuscamento sia probabilmente il tuo approccio migliore qui. È un po ‘come mettere una serratura alla tua porta. Qualcuno può rompere il lucchetto e entrare, ma lo fanno intenzionalmente anziché semplicemente camminare nella porta.

Questo è finalmente ansible utilizzando il compilatore nativo .NET di Microsoft

Compila automaticamente la versione di rilascio delle app che sono scritte in codice gestito (C # o Visual Basic) e che indirizzano .NET Framework e Windows 10 al codice nativo.

..

• Le tue app forniranno prestazioni superiori del codice nativo.

• È ansible continuare a programmare in C # o Visual Basic.

• È ansible continuare a sfruttare le risorse fornite da .NET Framework, tra cui la libreria di classi, la gestione automatica della memoria e la garbage collection e la gestione delle eccezioni.

Per gli utenti delle tue app, .NET Native offre questi vantaggi:

• Tempi di esecuzione rapidi

• Tempi di avvio costantemente rapidi

• Bassi costi di implementazione e aggiornamento

• Utilizzo ottimizzato della memoria dell’app

Ma .NET Native coinvolge più di una compilazione in codice nativo. Trasforma il modo in cui le app .NET Framework sono create ed eseguite. In particolare:

• Durante la precompilazione, le parti richieste di .NET Framework sono collegate staticamente alla tua app. Ciò consente all’app di funzionare con le librerie locali dell’app di .NET Framework e al compilatore di eseguire analisi globali per ottenere risultati migliori. Di conseguenza, le app si avviano costantemente più velocemente anche dopo gli aggiornamenti di .NET Framework.

• Il runtime .NET nativo è ottimizzato per la precompilazione statica e quindi è in grado di offrire prestazioni superiori. Allo stesso tempo, mantiene le caratteristiche di riflessione di base che gli sviluppatori trovano così produttivo.

• .NET Native utilizza lo stesso back-end del compilatore C ++, che è ottimizzato per scenari di precompilazione statici.

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

Questo è disponibile solo con VS.NET 2015.

Questo è ansible usando il compilatore IL2CPU. IL2CPU è sviluppato dalle stesse persone che creano COSMOS (C # Open Source Managed Operating System) ed è disponibile solo scaricando cosmos. IL2CPU produce file ASM che possono essere compilati tramite Nasm (alcuni altri assemblatori potrebbero funzionare ma è meglio usare nasm). l’unico problema con IL2CPU è che è integrato nel Progetto Cosmos ed è abbastanza difficile farlo funzionare da solo.