2015-07-03 18 views
7

Supponiamo di creare un assembly .NET e di non averlo firmato con un nome sicuro, quindi viene copiato in un archivio, quindi in un altro e quindi finisce nella produzione. Se un bit o due dei contenuti dell'assembly vengono modificati accidentalmente (qualche problema hardware o qualcosa del genere) c'è una possibilità che .NET runtime non se ne accorga e considera comunque valida l'immagine dell'assieme?Gli assembly .NET sono privi di nomi protetti protetti dalla corruzione accidentale?

+0

Dipende dalla natura della corruzione, dove è successo nel file e se il runtime decide di verificare. Ho visto un blocco di 4k di dati in un assieme di framework corrotto e non influenzare in modo sensibile le applicazioni. Abbiamo notato che c'era qualcosa di sbagliato quando alcune build fallivano (la corruzione si sovrapponeva alla parte degli attributi personalizzati facendole perdere i riferimenti parent e C# per vedere alcuni parametri 'out' come parametri 'ref'). –

risposta

0

Non sai cosa intendi per runtime .net non lo noterai? . Runtime net non eseguirà la verifica dll se non è fortemente firmato. Proverà a caricare la DLL. Se la modifica danneggia la DLL, il caricamento di dll fallirà.

+0

Gli assembly contengono il codice IL. Supponiamo che ci siano delle istruzioni da qualche parte all'interno del codice e che i bit cambino in modo tale da essere trasformati in un'altra istruzione ancora valida. Il runtime caricherà e gestirà felicemente questo codice? – sharptooth

6

scrivere questo programma:

using System; 

namespace ConsoleApplication13 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Hello world!"); 
     } 
    } 
} 

compilarlo, farlo funzionare ...

Ora aprirlo in Notepad ++, andare a trovare, selezionare il tipo di ricerca estesa, cercare H\0 ... Trovare il H NUL e NUL l ... e sostituire il H con un X ... Salvare e rilanciare ...

Xello world! 

noti che forte nam assemblee ED non sono verificate normalmente ... tenta di aggiungere un nome sicuro ... compilare ... correre

sn -v yourprogram.exe 

e controllare che sia corretto ...

ora modificarlo ... eseguire nuovamente il

sn -v yourprogram.exe 

e vedere che la convalida non riesce ...

ora cercare di farlo funzionare ... funziona correttamente!

Da MSDN

partire dalla versione di .NET Framework 3.5 Service Pack 1 (SP1), con nome firme non vengono convalidate quando un assembly viene caricato in un oggetto AppDomain pieno di fiducia, come ad esempio la AppDomain predefinito per la zona MyComputer.

+0

Aspetta, vuol dire che posso prendere un assembly firmato da terze parti, modificarlo in modo che ad esempio alcuni aspetti di esso ora chiamino nel mio codice, e verranno caricati e eseguiti correttamente? Qual è il punto delle assemblee firmate se questo è il caso? –

+0

@DavidArno strong-name è progettato principalmente per risolvere il dll-hell ... Con il nome forte, è possibile avere più assembly con lo stesso "nome umano", ma prodotti da società diverse. È possibile riattivare la verifica dell'assieme. – xanatos

1

Sì, c'è una possibilità.

Giriamo la domanda sulla sua testa.

È possibile modificare arbitrariamente un singolo bit nell'assieme ed eseguirlo/utilizzarlo ancora?

No, molti bit e byte vengono letti durante il caricamento e l'esecuzione e la maggior parte di essi è importante.

Se testo o numeri, in pratica dati, cambiano, la possibilità va molto in basso, anche se non completamente a zero, a seconda dei dati esatti che sono cambiati.

Quindi la risposta alla tua domanda è che:

  • Il gruppo potrebbe essere in grado di caricare ed eseguire, anche se forse con risultati non corretti/dispari
  • L'assemblea non potrebbe caricare

Tuttavia, non vi è alcuna garanzia in ogni caso.