2015-07-03 29 views
7

Angenommen, ich baue eine .NET-Assembly und habe sie nicht mit einem starken Namen signiert, dann wird sie in einen Speicher kopiert, dann in einen anderen, und dann landet sie in der Produktion. Wenn ein oder zwei Teile des Assembly-Inhalts versehentlich geändert werden (ein Hardwareproblem oder etwas ähnliches), besteht die Möglichkeit, dass die .NET-Laufzeitumgebung es nicht bemerkt und das Assembly-Image trotzdem als gültig betrachtet?Sind .NET-Assemblies ohne starke Namen vor versehentlicher Beschädigung geschützt?

+0

Hängt von der Art der Beschädigung ab, wo es in der Datei passiert ist und ob die Laufzeit sich verifizieren lässt. Ich habe gesehen, dass ein 4k-Block von Daten in einer Framework-Assembly beschädigt wurde und Anwendungen nicht merklich beeinflusst. Wir bemerkten nur, dass etwas nicht stimmte, wenn einige Builds fehlschlugen (die Beschädigung überlappte einen Teil der Tabelle mit benutzerdefinierten Attributen, was dazu führte, dass sie ihre Elternreferenzen und C# verloren gingen, um einige 'out'-Parameter als' ref'-Parameter zu sehen). –

Antwort

0

Nicht sicher, was Sie mit .net Runtime wird es nicht bemerken? .net Runtime wird DLL-Verifizierung nicht ausführen, wenn es nicht stark signiert ist. Es wird versuchen, die DLL zu laden. Wenn die Änderung die DLL korrumpiert, wird Dll-Laden fehlschlagen.

+0

Baugruppen enthalten IL-Code. Angenommen, es gibt eine Anweisung irgendwo innerhalb des Codes und Bits ändern sich so, dass sie in eine andere noch gültige Anweisung geändert wird. Wird Laufzeit einfach diesen Code laden und glücklich ausführen? – sharptooth

6

dieses Programm schreiben:

using System; 

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

es kompilieren, führen Sie es ...

Jetzt ist es in Notepad öffnen ++, zu finden gehen, wählen Sie die erweiterte Suche Typ, für H\0 suchen ... Finden Sie die H NUL e NUL l ... und die H mit einem X ersetzen ... speichern und Relaunch ...

Xello world! 

Beachten Sie, dass starke nam ed Baugruppen werden in der Regel nicht überprüft ... Versuchen einen starken Namen hinzufügen ... kompilieren ... laufen

sn -v yourprogram.exe 

und prüfen, ob es richtig ist ...

es jetzt ändern ... wiederholen sie die

sn -v yourprogram.exe 

und sehen, dass die Validierung fehlschlägt ...

jetzt versuchen, es zu laufen ... es läuft richtig!

Von MSDN

Ab .NET Framework Version 3.5 Service Pack 1 (SP1), mit starkem Namen Signaturen werden nicht überprüft, wenn eine Versammlung in ein Voll Vertrauen AppDomain Objekt geladen wird, wie die Standard-AppDomain für die MyComputer-Zone.

+0

Bleib dran, heißt das, ich kann eine von Dritten signierte Assembly nehmen, sie so modifizieren, dass zB ein Teil davon jetzt in meinen Code hineinruft, und sie wird immer noch geladen und läuft gut? Worum geht es bei unterschriebenen Baugruppen, wenn das der Fall ist? –

+0

@DavidArno Strong-Name ist in erster Linie gebaut, um die DLL-Hölle aufzulösen ... Mit starkem Namen können Sie mehrere Baugruppen mit dem gleichen "menschlichen Namen" haben, die aber von verschiedenen Firmen hergestellt werden. Sie können die Baugruppenprüfung erneut aktivieren. – xanatos

1

Ja, es gibt eine Chance.

Lassen Sie uns die Frage auf den Kopf stellen.

Kann ich irgendein Bit in der Baugruppe beliebig ändern und trotzdem ausführen/verwenden?

Nein, viele Bits und Bytes werden beim Laden und Ausführen gelesen und die meisten sind wichtig.

Wenn sich Text oder Zahlen, im Grunde genommen Daten, ändern, geht die Wahrscheinlichkeit weit nach unten, aber nicht vollständig auf Null, je nachdem, welche Daten sich geändert haben.

So ist die Antwort auf Ihre Frage ist, dass:

  • Die Anordnung könnte in der Lage sein, zu laden und auszuführen, auch wenn sie möglicherweise mit falschen/ungerade Ergebnisse
  • Die Montage nicht
laden könnte

Es gibt jedoch keine Garantie, wie auch immer.