| Entropie des geschützten Codebereichs | 5,45 | 7,89 | Produktdokumentation 1.29 | 1.29 | geschützter Codebereich laut Produktdokumentation | — | — | Angabe aus der Produktdokumentation, übliche Einheit Bit je Byte. Eigene Messung am Demopaket siehe nächste Zeile. |
|---|
| Entropie des geschützten Codebereichs | 6,333 Bit je Byte (.text, 28 392 Byte) | 7,934 Bit je Byte (.crt2, 4 047 Byte) | Eigene Messung an den ausgelieferten Artefakten | 1.29.0 | Sektion .text der Referenz gegen Sektion .crt2 der geschützten Fassung | Shannon-Entropie über die Rohbytes der Sektion | 1 Artefaktpaar | Vergleicht zwei unterschiedlich große Bereiche: die gesamte Codesektion der Referenz gegen die verschlüsselte Schutzsektion. Die Werte decken sich mit der Sektionstabelle der Analyse. |
|---|
| Entropie der gesamten Datei | 5,913 Bit je Byte | 6,856 Bit je Byte | Eigene Messung an den ausgelieferten Artefakten | 1.29.0 | gesamte Datei | Shannon-Entropie über alle Bytes der Datei | 1 Artefaktpaar | Die geschützte Fassung enthält zusätzlich die Laufzeitbibliothek und die verschlüsselten Bereiche. |
|---|
| Konstanten der Prüf- und Ableitungsfunktionen im Dateiabbild | 11 Treffer über sechs Konstanten | 0 Treffer | Eigene Messung an den ausgelieferten Artefakten | 1.29.0 | vier mit citadel_virtualize markierte Funktionen | Suche nach jedem 32-Bit-Wert in Little-Endian-Darstellung über die gesamte Datei | 6 Konstanten, 1 Artefaktpaar | Gilt für Funktionen, die der Virtualisierungspass annimmt; dort entsteht der Maschinencode gar nicht erst. |
|---|
| Konstanten der Lizenzprüfung im Disassembler | 3 | 0 | Produktdokumentation 1.29 | 1.29 | Testprogramm mit Schlüsselkonstanten 0x1F2E3D4C, 0x5B6A7988 und 0x4D2 | Sichtprüfung im Disassembler | 3 Konstanten | Gilt für virtualisierte Funktionen. |
|---|
| Meldungstexte der Lizenzlogik im Klartext | 4 von 4 lesbar | 0 von 4 lesbar | Eigene Messung an den ausgelieferten Artefakten | 1.29.0 | Texte ACCESS GRANTED, Invalid licence., Malformed serial., Flag: | Suche nach der Zeichenfolge über die gesamte Datei | 4 Texte, 1 Artefaktpaar | Banner und Gebrauchsanweisung bleiben absichtlich lesbar — so markiert. Ohne Markierung wird verschlüsselt. |
|---|
| Zeichenketten im Abbild, davon Anwendungstexte im Klartext | — | 2 von 188 | Blackbox-Analyse | 1.29 | gesamtes Dateiabbild der geschützten Fassung | Zeichenkettenextraktion in IDA Pro | 188 Zeichenketten | Die zwei lesbaren Texte sind Banner und Gebrauchsanweisung. |
|---|
| Zeichenketten nach Gebrauch im eigenen Datensegment | 1 Treffer | 0 Treffer | Produktdokumentation 1.29 | 1.29 | Testprogramm, das nach der Ausgabe sein eigenes Datensegment durchsucht | Suche im eigenen Datensegment zur Laufzeit | — | Gemessen aus dem eigenen Prozess nach der Ausgabe. |
|---|
| Wirkung einer Ein-Byte-Änderung am Chiffrat | 1 von 8 160 Klartextbytes verändert | 8 130 von 8 160 Klartextbytes verändert | Produktdokumentation 1.29 | 1.28 gegen 1.29 | verschlüsselte Schutzsektion | ein einzelnes Chiffratbyte kippen, entschlüsselten Block vergleichen | 1 Byte | Die Wirkung entsteht durch die Kopplung von Schlüssel und Chiffretext. |
|---|
| Erkennung gezielter Manipulation | 5 von 5 Patch-Versuchen erfolgreich (frühere Fassung) | 0 von 5 Patch-Versuchen erfolgreich | Produktdokumentation 1.29 | frühere Fassung gegen 1.29 | Integritätsprüfung | gezielte Patch-Versuche an der Integritätsprüfung; in einer früheren Fassung genügte dafür ein einzelnes Byte | 5 Versuche | Fünf definierte Versuche an einem Artefakt; die Blackbox-Analyse unten nennt sieben weitere. |
|---|
| Manipulationsversuche der Analyse | — | 7 Versuche, kein einziger führte zu lesbarem Klartext; 5 davon wurden sofort erkannt | Blackbox-Analyse | 1.29 | Erfolgsweiche, Chiffrat der Schutzsektion, verschlüsselter Datenblock, Prüfmechanik, Abbruchmechanik und Kombinationen daraus | Bytes im Disassembler ändern, Datei je Versuch 8 bis 12 mal starten, Rückgabewert und Ausgabe vergleichen | 7 Versuche, je 8 bis 12 Läufe | Zwei Versuche blieben unerkannt, verschafften dem Angreifer aber keinen Klartext: mit fünf geänderten Bytes lief das Programm stabil in den Erfolgspfad und gab weiterhin unlesbaren Text aus. |
|---|
| Fremder Speicherzugriff über OpenProcess | 64 Byte gelesen | OpenProcess verweigert, Fehler 5 | Produktdokumentation 1.29 | 1.27 | Prozess auf Schutzstufe max | eigenes Leseprogramm mit OpenProcess und ReadProcessMemory gegen denselben Prozess | — | Eine leere Zugriffsliste, nicht eine NULL-Zugriffsliste. Sie wirkt im getesteten Rechtekontext; ein Administrator kann sich das Recht nehmen. |
|---|
| Klartextfenster des geschützten Bereichs im laufenden Prozess | — | 28 735 von 28 854 Stichproben verschlüsselt (99,6 %); die wenigen Fenster dauerten im Median 0,089 ms | Blackbox-Analyse | 1.29 | Schutzsektion, 4 096 Byte | Abtastung aus einem Beobachterprozess mit ReadProcessMemory und VirtualQueryEx | 28 854 Stichproben über 10 Läufe | In 9 von 10 Läufen blieb der Bereich dem Beobachter durchgehend verschlossen. |
|---|
| Entschlüsselte Zeichenketten und Bytecode im Speicher | — | 0 Treffer bei 11 094 Stichproben | Blackbox-Analyse | 1.29 | Datensegment .bss des laufenden Prozesses | Abtastung aus einem Beobachterprozess, Abstand etwa 70 µs | 11 094 Stichproben | Entschlüsselung, Nutzung und Löschung liegen so dicht beieinander, dass der Sampler bei etwa 70 µs Abstand kein einziges Fenster traf. |
|---|
| Zeitverhalten als Seitenkanal | — | Median 12,8 ms, Standardabweichung 1,5 ms | Blackbox-Analyse | 1.29 | gesamter Programmlauf, verschiedene Eingaben | Laufzeitmessung einschließlich Prozessstart | 60 Läufe | Kein messbarer Unterschied zwischen richtigen und falschen Eingaben. |
|---|
| Funktionale Stabilität | — | 60 von 60 Läufen identisch, 0 Abstürze | Blackbox-Analyse | 1.29 | gesamtes Programm, Eingaben bis 8 000 Zeichen | wiederholte Ausführung mit gleicher und mit wechselnder Eingabe | 60 Läufe | Gemessen an diesem Demoprogramm. |
|---|
| Virtualisierung gegen native Ausführung | — | 150 676 plus 120 042 plus 26 698 Vergleiche, null Abweichungen | Produktdokumentation 1.29 | 1.29 | Selbsttests width_selftest.c für alle Bitbreiten, mem_selftest.c für Speicherzugriffe, vm_selftest.c für kleine Wertebereiche | Jede Funktion wird auf der Zwischendarstellung und als Bytecode durchgerechnet und verglichen | 297 416 Vergleiche in drei Selbsttests | Belegt die Korrektheit der Übersetzung. Fälle mit undefiniertem Verhalten sind ausgenommen, weil die native Referenz dort selbst ungültig ist. |
|---|
| Laufzeit im ungünstigsten Fall | etwa 1 ms | fast 6 ms, balanced 99 ms, max 108 ms, balanced mit citadel_hot etwa 1 ms | Produktdokumentation 1.29 | 1.29 | eine kleine Funktion, zwei Millionen Aufrufe in einer engen Schleife, ohne Annotation | Laufzeitmessung über zwei Millionen Aufrufe | 2 000 000 Aufrufe | Der ungünstigste denkbare Fall: eine winzige Funktion, millionenfach aufgerufen, ohne jede Annotation. Mit citadel_hot fällt derselbe Testfall auf die Ausgangszeit zurück. |
|---|
| Optionale Obergrenze für gleichzeitig offene Seiten | 13 offene Seiten, 332 ms | 7 offene Seiten, 5 873 ms bei Grenze 6 | Produktdokumentation 1.29 | 1.29 | 160 Funktionen in einer engen Schleife | Laufzeitmessung mit und ohne Obergrenze | — | Deshalb standardmäßig aus, zuschaltbar über CITADEL_MAX_OPEN. |
|---|