Nach der Verschlüsselung einer Assembly mit AxProtector .NET kommt es zu Performance-Problemen. Warum?

Teilen:

Dass durch die Verschlüsselung Performance Probleme auftreten können, ist uns bekannt. Die Ursache dafür ist, dass die Verschlüsselung den Original-Code an eine andere Stelle verschiebt und an der Original-Adresse AxProtector-Code eingefügt wird.

Wenn Sie nun die Assembly ausführen und eine verschlüsselte Methode aufgerufen wird, dann wird der AxProtector-Code vorgefunden, der an die entsprechende Stelle verweist, an die Ihr verschlüsselter Original-Code verschoben wurde. Anschließend wird der Code entschlüsselt, eine dynamische Methode erstellt und ausgeführt.

Dieser sicherheitstechnische "Umweg" lässt den ersten Aufruf einer verschlüsselten Methode ca. 1,2 - 1,5 ms (bei generischen Methoden auch bis zu 1,5 -2 ms) länger dauern. Dies hängt natürlich auch von der Hardware-Ausstattung des Systems ab, auf dem die Assembly ausgeführt wird.

Wenn die Methode nun ein zweites Mal aufgerufen wird, dauert dieser Aufruf ca. 8- 10 µs (bei generischen Methoden ca. 30 - 60 µs) länger. Dies liegt daran, dass erneut der AxProtector-Code angesprungen wird und dieser prüft, ob die Methode bereits entschlüsselt wurde. Wenn ja, wird direkt an die Stelle im Speicher verwiesen, an der der unverschlüsselte Code bereits liegt. Aber selbst diese kurze Umleitung bewirkt einen minimalen, weiteren Performanceverlust.

Der Performance-Verlust kann aber auch maßgeblich über die Anzahl, d.h. wie häufig die einzelnen Methoden aufgerufen werden, beeinflusst werden.Einzelne Methoden können teilweise bis zu 5.000.000 mal aufgerufen werden. Wenn Sie beispielsweise 5.000.000 mal 8 µs rechnen, ergeben sich daraus bereits 40 Sekunden. Und dies nur für eine einzelne Methode.

Häufig enthalten aber die Methoden, die so häufig aufgerufen werden, keinen elementaren Code.Daher kann man an Performance zurückgewinnen, wenn man diese Methoden von der Verschlüsselung ausschließt.

Wir schließen z.B. bereits standardmäßig automatisch alle Methoden von der Verschlüsselung aus, die kleiner als 10 Bytes sind, da wir davon ausgehen, dass eine Methode dieser Größe keinen elementaren Code beinhaltet. Sie können die Größe aber auch selbst festlegen. Die Option dafür ist "-CMLn": es werden dann nur Methoden verschlüsselt, die kleiner n Bytes sind.

Um herauszufinden, welche Methoden bei Ihrer Assembly außergewöhnlich oft aufgerufen werden, empfehlen wir den Einsatz eines .NET Profiling Tools. Diese Profiling Tools zeigen genau an, welche Methoden, wie häufig aufgerufen wurden und wieviel Zeit dafür benötigt wird. Auf Basis dieser Daten kann dann entschieden werden, welche Methoden verschlüsselt werden sollen und welche nicht.

Nach oben