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?
risposta
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à.
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
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.
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? –
@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
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.
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'). –