2010-01-28 14 views
5

Ho creato un wrapper C++ CLI per codice C++ nativo, che a sua volta faccio riferimento alla mia applicazione C#. È possibile proteggere in qualche modo questo assieme in modo che possa essere utilizzato solo nella mia applicazione senza la possibilità che altri lo utilizzino?(C#/C++ CLI) È possibile proteggere i miei assembly C++ CLI dall'utilizzo in altri progetti .NET?

Sono una tecnologia sviluppatore di Microsoft, Sono tutto di egoismo :)

+0

L'utilizzo di una chiave privata tra la mia applicazione C# e come parametro del costruttore potrebbe essere un modo valido per eseguire questa operazione o sarebbe considerato un trucco? –

+0

Non sei sicuro di cosa intendi, ma non ti consiglio di mettere la tua chiave privata da nessuna parte tranne il computer più sicuro nella stanza più buia del tuo ufficio! – CesarGon

risposta

3

Ho usato this technique con successo.

In pratica, si tratta di proteggere il proprio assembly dal caricamento inserendo una richiesta di sicurezza in fase di collegamento e utilizzando la chiave pubblica del nome del gruppo come prova. Solo gli assembly firmati con la tua chiave privata potranno caricarlo.

+0

Possibile duplicato: http://stackoverflow.com/questions/1929080/net-how-to-make-a-class-such-that-only-one-other-specific-class-can-instantiat :) –

+1

@BlueRaja : Il post a cui fai riferimento chiede di creare un'istanza di una classe; qui si tratta di usare un intero assemblaggio. La tecnica nella mia risposta può essere applicata a entrambi, ma altre tecniche possono essere valide solo per una di esse. Quindi penso che non sia un duplicato. :-) – CesarGon

0

Sì, ma questa sarà una battaglia persa contro un determinato attaccante.

Ad esempio, è possibile fornire una versione crittografata che accetta solo una determinata chiave, come suggerito da alcune persone. Ma poi dovrai decodificarlo sui tuoi client, che potrebbero non disporre di archivi di memoria crittografati, quindi un determinato utente malintenzionato potrebbe semplicemente leggere il blocco di memoria appropriato e deserializzare il risultato per ottenere l'assembly originale.

0

Non perfettamente. LinkDemand viene applicato solo in un ambiente di trust parziale. Il codice in esecuzione con pieno affidamento può anche utilizzare la riflessione per accedere a tipi privati ​​e in genere ignorare qualsiasi protezione che si desidera discutere.

Forse vuoi che il tuo codice C++/CLI chiami Assembly :: GetEntryAssembly e lo controlli contro una whitelist di app approvate per cui è destinata la libreria.

Ovviamente, si desidera ridurre al minimo la quantità di codice gestito (e attributi) coinvolti nei controlli poiché il codice gestito è veramente facile da decompilare.

In realtà, mescolare il controllo occasionale nella logica di base del codice C++ è l'unica speranza che non venga aggirato.