2009-12-17 34 views
57

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.Compilare C# in Nativo?

Quello che mi piacerebbe fare è compilare la mia applicazione scritta in C# fino al 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 obiettivo finale non è impossibile (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 flusso 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.

Era la mia comprensione da this domanda correlata che ngen fa quello che voglio. Ho provato a utilizzare ngen. Ma dopo aver copiato il file di output dalla directory C:\Windows\assemblies\...\applicationName.ni.exe in un punto in cui posso fare doppio clic e provare a eseguirlo genera un errore in quanto non è "un'applicazione Win32 valida". Inoltre, quando lancio lo applicationName.ni.exe in Reflector, ottengo la stessa uscita che ho ottenuto dal solo applicationName.exe. Dal momento che il applicationName.ni.exe è un codice nativo, mi aspettavo che Reflector si commettesse un errore, ma non lo fece. 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 decomporrà 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 Codewall.

Grazie!

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

+2

sul codice protettori/obstufactors maggior parte di loro sono commerciali e moderatamente costoso se il vostro non è una società di sviluppo di software però anche il livello superiore quelli commerciali possono avere un sacco di problemi con il tuo codice in realtà funziona subito dopo che lo fa è cosa. –

risposta

19

Ho appena convalidatoNet Nativi su VS2015 & di Windows 8.1 (se configurato correttamente, esaminare .proj per convalidare) e la costruzione di una particolare architettura (può essere eccessivo, non hanno convalidato) , produrrà un file nativo che ti darà il codice "difficile da decodificare" che stai cercando, che per me non era abilitato a leggere .dll via DotPeek (decompilatore .Net gratuito da JetBrains).

+12

Ottimo! Sei anni dopo, i miei sogni si sono finalmente avverati. ;) – mrduclaw

+8

Si noti che questo è per le app di Windows 10 Universal, non WPF o WinForms. Ad esempio, Windows 8.1 e versioni successive. –

+2

@EricEskildsen, quindi non è possibile compilare in modo nativo per WPF/WinForms? –

16

Se si desidera proteggere il 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 lo ahead-of-time option in mono.

+0

Dotfuscator non fa che offuscare i nomi delle variabili in modo che sia più difficile da leggere? E capisco che non riceverò le ottimizzazioni in fase di esecuzione, e sono d'accordo. Il mio scopo principale nell'uso di C# era la facilità e la bellezza della sintassi e delle librerie del linguaggio, le ottimizzazioni sono state al secondo posto. – mrduclaw

+18

"La compilazione in codice nativo vanifica lo scopo di avere un linguaggio gestito" - Questo non è vero. – zezba9000

+0

Una caratteristica dei linguaggi .NET gestiti è che possono essere ** verificabili ** in modo sicuro **.La compilazione di IL verificabile in modo verificabile con codice nativo non perde questa caratteristica specifica. Inoltre, ciò che descrivi come * "vantaggio principale" * non esiste nemmeno nella realtà (nemmeno 5 anni dopo aver inizialmente scritto questa risposta): Sebbene possibile in teoria, il compilatore JIT di .NET è estremamente conservativo e l'unica ottimizzazione degna di nota quello che è successo sin dal suo inizio è un miglioramento del ** throughput del codice **. Non è stato fatto alcun lavoro sull'ottimizzazione del codice nativo emesso. – IInspectable

7

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.

+0

Nessuno del mio codice usa esplicitamente Reflection, e io sto bene senza di esso. Salvo alcune limitazioni sul linguaggio stesso, è possibile? – mrduclaw

+0

Lo sai, ma l'ipotetico compilatore C# -to-nativo non può davvero supporlo. – MSalters

26

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 è possibile 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 consiglio abituale a chiunque possa essere interessato a smontare le mie assemblee è indicarle 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.

+2

Grazie! Questa è esattamente la spiegazione che stavo cercando riguardo a ciò che 'ngen' sta facendo. Hai qualche suggerimento su un buon, libero, offuscatore? – mrduclaw

+1

Conosco solo i disassemblatori buoni e gratuiti. Un disassemblatore deve essere libero, chiedendo soldi per sconfiggere lo scopo di usarne uno. Buoni offuscatori costano soldi. Visual Studio viene fornito con uno, Dotfuscator. Non ho mai sentito parlare di un'azienda che vende un prodotto basato su codice sorgente incrinato che è stato protetto da Dotfuscator. Ciò suggerisce che funzioni bene. –

8

Il cucchiaio (precedentemente Xenocode) ha a product that might fit your needs. Lo usiamo per una UI di installazione basata su WPF, quindi non dobbiamo riavviare .net per caricare il programma di installazione stesso.

+0

Questo sembra fantastico, è solo un po 'più costoso di quanto mi piacerebbe poiché sono solo uno sviluppatore solitario e non lo faccio per un'azienda. – mrduclaw

+0

In effetti il ​​prezzo può essere un po 'proibitivo. Funziona bene però. Non sono sicuro che ci sia qualche open source o altre alternative là fuori. Un altro svantaggio è che si ottiene un eseguibile molto grande ma la virtualizzazione dell'ambiente è piuttosto fluida. – dkackman

4

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 si desidera una protezione perché si dispone di un algoritmo nel sistema in cui sarebbe devastante per la sicurezza se qualcuno lo ha decodificato, potrebbe essere necessario prendere in considerazione un approccio diverso. Significa che c'è un difetto nell'algoritmo e nessuna quantità di offuscamento o compilazione nativa ti aiuterà.

Se si tratta di IP, penso che l'offuscamento sia probabilmente il miglior approccio 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.

+0

Oh no, i miei algoritmi non stanno facendo niente di speciale. È a metà tra la curiosità accademica e le preoccupazioni dell'IP. Penso che un decente (ma gratuito) obfuscator probabilmente mi soddisfi bene per i miei problemi di PI, ma ho un pacchetto di codice personalizzato che ho scritto in precedenza che vorrei usare anche nelle mie applicazioni .NET. Qualche suggerimento per un offuscatore? – mrduclaw

5

questo è un obfuscator gratuito, che è davvero buono: eazfuscator

+4

Gratuito per 30 giorni di utilizzo. * –

3

Ciò è possibile 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.

+0

Sembra un lavoro basato su IL2C su https://csnative.codeplex.com/ (il collegamento potrebbe presto andare via con lo spegnimento di codeplex) –

17

Ieri, al , Microsoft ha annunciato .NET Native. Secondo lo 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."

+0

Ma come può essere utilizzato in VS2013? Non ho la licenza VS2015 quindi voglio usare. Native in VS2013 –

+1

@EldarZeynalov Forse dovresti guardare VS2015 Community Edition? – Redacted

4

Questo è finalmente possibile utilizzare NET compilatore di Microsoft nativo

Si compila automaticamente la versione di rilascio di applicazioni che sono scritte in codice gestito (C# o Visual Basic) e destinati a .NET Framework e Windows 10 al codice nativo.

..

• Le tue applicazioni fornirà le prestazioni superiori di codice nativo.

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

• È possibile 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 applicazioni, .NET nativo offre questi vantaggi:

• tempi di esecuzione rapidi

• tempi di avvio veloci Coerentemente

• implementazione e aggiornamento Bassi costi

• Ottimizzato utilizzo della memoria app

Ma .NET Native richiede 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 all'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 Native è 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++, 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.