Zurück zur ProduktübersichtCitadelCore

Demo · Version 1.29.0

Sehen Sie selbst, was beim Übersetzen Ihres C/C++-Codes passiert.

Links der Beispielcode, rechts der Ablauf: fünf Schritte, etwa zwanzig Sekunden. Sie starten selbst und können jederzeit anhalten oder einzeln durchgehen. Darunter stehen zwei Schutzprinzipien zum Anfassen — beide rechnen in Ihrem Browser, nichts wird übertragen.

Vorführung

Ein Befehl — und Ihre Logik steht nicht mehr lesbar in der Datei.

Ablauf Schritt für Schritt

Beispielcode · demo.c · 187 Zeilen

/* ===========================================================================
 *  demo.c - Beispielquellcode zur CitadelCore-Vorfuehrung
 *  AetherSec, Stand 14.10.2026
 * ===========================================================================
 *
 *  WAS DIESE DATEI IST
 *  Lehrmaterial. Drei kleine Funktionen, an denen sich zeigen laesst, welche
 *  Programmteile man mit CitadelCore gezielt haerten kann. Die Datei ist
 *  bewusst kurz und uebersetzt sich mit jedem Standard-C-Compiler.
 *
 *  WAS DIESE DATEI NICHT IST
 *  Kein CitadelCore-Produktquellcode. Compiler, LLVM-Passes und Laufzeit-
 *  bibliothek von CitadelCore sind hier nicht enthalten. Auch keine
 *  empfohlene Lizenzarchitektur fuer ein Produkt: eine echte Lizenzpruefung
 *  gehoert nicht so aufgebaut, wie es hier zur Anschauung geschieht.
 *
 *  ALLE WERTE SIND OEFFENTLICHE TESTDATEN
 *  Die Konstanten unten stehen offen in dieser Datei und sind deshalb kein
 *  Geheimnis. Sie dienen nur dazu, dass der Ablauf nachvollziehbar und das
 *  Ergebnis reproduzierbar ist.
 *
 *  REFERENZ-BUILD (ohne Haertung)
 *      clang -O1 -fno-inline -o demo.exe demo.c
 *
 *  BUILD MIT CITADELCORE (Windows)
 *      citadel --compile demo.c -o demo.exe --level max --report
 *
 *  Ohne CitadelCore bleiben die Annotationen unten wirkungslos: der Compiler
 *  ignoriert sie, das Programm verhaelt sich identisch.
 * ======================================================================== */
 
#include <stdio.h>
#include <string.h>
 
/* Die Annotationen sind clang-spezifisch. Mit jedem anderen Compiler
 * entfalten sie keine Wirkung, und die Datei uebersetzt sich unveraendert. */
#if defined(__clang__)
#define CC_VIRTUALIZE __attribute__((annotate("citadel_virtualize")))
#define CC_PROTECT    __attribute__((annotate("citadel_protect")))
#define CC_PUBLIC     __attribute__((annotate("citadel_public")))
#else
#define CC_VIRTUALIZE
#define CC_PROTECT
#define CC_PUBLIC
#endif
 
/* ---------------------------------------------------------------------------
 *  1) check_demo_license - demonstrative Pruefentscheidung
 * ---------------------------------------------------------------------------
 *  Reine Ganzzahlarithmetik, keine Aufrufe, kein Speicherzugriff. Damit
 *  erfuellt die Funktion die dokumentierten Bedingungen des Virtualisierungs-
 *  passes (siehe WINDOWS.md, Abschnitt "Code-Virtualisierung").
 *
 *  Oeffentliche Testdaten:
 *      check_demo_license(4660, 22136, 123)  ->  1   (angenommen)
 *      check_demo_license(4660, 22136, 124)  ->  0   (abgelehnt)
 *      check_demo_license(0, 0, 0)           ->  0   (abgelehnt)
 *
 *  Gerechnet wird in unsigned int. Der Ueberlauf ist dort definiert
 *  (Modulo 2^32), es gibt also kein undefiniertes Verhalten.
 *  Eingaben werden auf 0..65535 begrenzt.
 * ------------------------------------------------------------------------ */
CC_VIRTUALIZE
int check_demo_license(int group_a, int group_b, int group_c)
{
    unsigned a = (unsigned)(group_a & 0xFFFF);
    unsigned b = (unsigned)(group_b & 0xFFFF);
    unsigned c = (unsigned)(group_c & 0xFFFF);
    unsigned state = 0x2F1E3D4Cu;
    int round;
 
    for (round = 0; round < 8; round++) {
        state = state * 16777619u;          /* FNV-Primzahl, oeffentlich */
        state = state ^ a;
        state = (state << 7) | (state >> 25);
        state = state + b;
        state = state ^ (state >> 11);
        state = state + c;
    }
 
    /* 0xB9C1F07E ist der oeffentliche Sollwert dieser Vorfuehrung. */
    return (state == 0xB9C1F07Eu) ? 1 : 0;
}
 
/* ---------------------------------------------------------------------------
 *  2) calculate_quote - kleine deterministische Ganzzahlberechnung
 * ---------------------------------------------------------------------------
 *  Preis einer Bestellung in Cent. Bewusst ohne Gleitkomma, damit das
 *  Ergebnis auf jeder Maschine gleich ist.
 *
 *  Definierte Wertebereiche (ausserhalb wird geklemmt, nie ueberlaufen):
 *      units            1 .. 10000
 *      unit_price_cents 1 .. 1000000
 *      discount_percent 0 .. 90
 *
 *  Groesstmoegliches Zwischenergebnis: 10000 * 1000000 = 10^10. Das passt
 *  nicht in 32 Bit, deshalb rechnet die Funktion in long long und gibt den
 *  auf 2.000.000.000 begrenzten Betrag als int zurueck.
 *
 *  Oeffentliche Testdaten:
 *      calculate_quote(10, 4999, 0)   ->  49990
 *      calculate_quote(10, 4999, 10)  ->  44991
 *      calculate_quote(3, 7499, 25)   ->  16873
 * ------------------------------------------------------------------------ */
CC_PROTECT
int calculate_quote(int units, int unit_price_cents, int discount_percent)
{
    long long gross;
    long long net;
 
    if (units < 1) units = 1;
    if (units > 10000) units = 10000;
    if (unit_price_cents < 1) unit_price_cents = 1;
    if (unit_price_cents > 1000000) unit_price_cents = 1000000;
    if (discount_percent < 0) discount_percent = 0;
    if (discount_percent > 90) discount_percent = 90;
 
    gross = (long long)units * (long long)unit_price_cents;
    net = gross - (gross * (long long)discount_percent) / 100;
 
    if (net > 2000000000LL) net = 2000000000LL;
    return (int)net;
}
 
/* ---------------------------------------------------------------------------
 *  3) get_demo_message - unkritische Beispiel-Zeichenkette
 * ---------------------------------------------------------------------------
 *  Gibt einen von drei festen Texten zurueck. Diese Texte sind mit
 *  citadel_public markiert: sie sollen auch dann lesbar bleiben, wenn mit
 *  einem Freischaltgeheimnis gebaut wurde und dieses noch nicht gesetzt ist.
 *  Ohne die Markierung wuerde CitadelCore auch sie verschluesseln.
 *
 *  Die Funktion gibt einen Zeiger zurueck und wird deshalb nicht
 *  virtualisiert - Speicherzugriffe lehnt der Virtualisierungspass
 *  ausdruecklich ab, statt sie still falsch zu uebersetzen.
 * ------------------------------------------------------------------------ */
static CC_PUBLIC const char k_msg_ok[]      = "Demo-Pruefung angenommen.\n";
static CC_PUBLIC const char k_msg_denied[]  = "Demo-Pruefung abgelehnt.\n";
static CC_PUBLIC const char k_msg_usage[]   =
    "Aufruf: demo GRUPPE_A GRUPPE_B GRUPPE_C\n"
    "Beispiel: demo 4660 22136 123\n";
 
const char *get_demo_message(int code)
{
    if (code == 1) return k_msg_ok;
    if (code == 0) return k_msg_denied;
    return k_msg_usage;
}
 
/* ------------------------------------------------------------------------ */
 
static int parse_int(const char *text, int fallback)
{
    int value = 0;
    int digits = 0;
    size_t i;
 
    if (text == NULL) return fallback;
    for (i = 0; text[i] != '\0' && i < 9; i++) {
        if (text[i] < '0' || text[i] > '9') return fallback;
        value = value * 10 + (text[i] - '0');
        digits++;
    }
    return digits > 0 ? value : fallback;
}
 
int main(int argc, char **argv)
{
    int a, b, c, verdict, quote;
 
    if (argc < 4) {
        fputs(get_demo_message(-1), stdout);
        return 2;
    }
 
    a = parse_int(argv[1], 0);
    b = parse_int(argv[2], 0);
    c = parse_int(argv[3], 0);
 
    verdict = check_demo_license(a, b, c);
    fputs(get_demo_message(verdict), stdout);
 
    quote = calculate_quote(10, 4999, verdict ? 10 : 0);
    printf("Angebot: %d Cent\n", quote);
 
    return verdict ? 0 : 1;
}

SHA-256 dieser Datei: af4ca119b6b9e4df674a625c679012068386f8269477d35bfb81f6347fdb3140 —demo.c herunterladen

Ablauf

  1. Ihr Code

    Drei Funktionen in demo.c: eine Prüfentscheidung, eine Berechnung, ein Text. Die Annotationen darüber bestimmen, was CitadelCore mit ihnen macht.

  2. Ihr bisheriger Build

    Der gewöhnliche Compileraufruf — die Vergleichsgrundlage. Alles, was danach anders ist, geht auf die Härtung zurück.

    vorher · windows
    clang -O1 -fno-inline -o demo.exe demo.c
  3. Ein Befehl mehr

    Derselbe Quellcode, ein Aufruf statt des bisherigen. --report schreibt auf Ihrer Maschine auf, was tatsächlich angewandt wurde.

    nachher · windows
    citadel --compile demo.c -o demo.exe --level max --report
  4. Was sich ändert

    Nachgemessen an einem gehärteten Demo-Programm: die Konstanten der Lizenzprüfung und alle Meldungstexte sind aus der Datei verschwunden.

    Nachgemessen am Demo-Programm — gemessen an den ausgelieferten Artefakten des Demopakets licensing_demo 1.29.
    Gemessenohne Härtungmit Härtung
    Sollwert der Lizenzprüfung in der DateiSuche nach dem 32-Bit-Wert über die gesamte Datei.1 Treffer0 Treffer
    Konstanten der SchlüsselableitungFünf Konstanten, jeweils über die gesamte Datei gesucht.10 Treffer0 Treffer
    Meldungstexte der Lizenzlogik im KlartextBanner und Gebrauchsanweisung bleiben absichtlich lesbar — so markiert.4 von 40 von 4
    Entropie des geschützten CodebereichsShannon-Entropie über die Rohbytes der Sektion.6,333 Bit je Byte7,934 Bit je Byte
  5. Ihr nächster Schritt

    Probieren Sie die Schutzprinzipien im Browser aus oder prüfen Sie in zwei Minuten, ob CitadelCore zu Ihrem Projekt passt.

Fünf Schritte, etwa zwanzig Sekunden. Alle Schritte stehen vollständig oben — der Ablauf hebt sie nur nacheinander hervor.

Die Vergleichswerte in Schritt 4 stammen aus einem gemessenen Build des Demo-Programms (licensing_demo.exe gegen licensing_demo_protected.exe); die Dateien und ihre Prüfsummen stehen in den technischen Details.

Prinzipien ausprobieren

Zwei Schutzprinzipien zum Anfassen.

Beide laufen direkt in Ihrem Browser — nichts wird übertragen, nichts gespeichert. Was sie zeigen

So ordnen Sie diese Demo einZwei Schutzprinzipien, nachgebaut mit öffentlichen Beispieldaten, damit Sie sie selbst anfassen können. Ihre volle Wirkung entfaltet CitadelCore auf Windows an Ihrem eigenen Code — mit neun Ebenen statt zweier Prinzipien.

Die beiden Module laufen vollständig in Ihrem Browser. Es werden keine Eingaben übertragen, nichts gespeichert und keine E-Mail-Adresse verlangt. Der Rechenteil wird erst geladen, wenn Sie ihn anfordern.

A · Dieselbe Rechnung, zwei Darstellungsformen

Ein festgelegter kleiner Ausdruck läuft einmal direkt in JavaScript und einmal über eine eigene Lehr-VM mit acht Ganzzahl-Befehlen. Gerechnet wird ((a · 3 + b) ^ (a >> 2)) + ((b · 5) & 255) in 32 Bit. Eingaben nur über die beiden Zahlenfelder; beliebiger Quellcode wird nicht ausgeführt.

Direkt in JavaScript—
Über die Lehr-VM—
Vergleich—
Aufwand der VM—
Stichprobenoch nicht geprüft

Bytecode der Lehr-VM

wird beim Laden angezeigt

Was Sie hier sehenDieselbe Rechnung, zwei Darstellungen — im Abzug erscheint bei der zweiten Bytecode statt Maschinencode. Das Lehrmodell hat acht Befehle und eine offen lesbare Opcode-Tabelle; CitadelCore würfelt die Zuordnung je Build neu, arbeitet auf 1 bis 64 Bit und prüft jede Übersetzung gegen die native Ausführung, bevor es sie einsetzt.

B · Öffentliche Nutzlast und Manipulationserkennung

Ein öffentlicher Demotext wird mit AES-GCM über die Web-Crypto-Schnittstelle des Browsers authentifiziert verschlüsselt, danach wieder entschlüsselt. Kippt ein Byte der Nutzlast, lehnt die Entschlüsselung ab — Sie sehen die echte Fehlermeldung des Browsers, nicht eine nachgebaute.

Klartext (öffentlich)—
Schlüssel (öffentlich)—
Startwert (öffentlich)—
Nutzlast—
Länge—
Entschlüsselt—

Noch nicht geladen.

Was das Produkt anders machtDieses Modul zeigt das Prinzip mit AES-GCM, weil der Browser das mitbringt. CitadelCore selbst nutzt ChaCha20 und koppelt einen Hash über den Chiffretext direkt in den Schlüssel — eine Konstruktion, die dieselbe Wirkung ohne separates Tag-Feld erreicht. Schlüssel und Startwert hier sind offene Demowerte; in echter Software gehört ein Startwert je Nachricht neu gezogen.

Nachgemessen

Und so sieht das Ergebnis von außen aus.

Die Vorführung oben zeigt den Weg. Was am Ende in der fertigen Datei steht, hat ein Prüfer mit nichts als dieser Datei untersucht.

Blackbox-Analyse eines gehärteten Demo-Programms · 27.09.2026

Was ein Prüfer an der fertigen Datei vorgefunden hat

Geprüft wurde licensing_demo_protected.exe — statisch und dynamisch, mit IDA Pro und eigenen Werkzeugen. Die Informationsquelle war ausschließlich die fertige geschützte Datei: dieselbe Ausgangslage wie bei jemandem, der Ihre Quellen nicht hat.

  • 2 von 188Zeichenketten lagen im Klartext — Banner und Gebrauchsanweisung. Lizenzregel, Meldungstexte und Schlüsselmaterial blieben statisch vollständig verschlossen.
  • 0 Trefferbei der Signatursuche nach der Chiffre. Keine Packer-Signatur, keine Krypto-Importe, keine Produktspuren in der Datei.
  • 12 von 12Läufen erkannten eine Änderung am verschlüsselten Bereich — sofort und ohne dass ein Prüfmechanismus nötig wäre.
  • 99,6 %der Prozesslaufzeit lag der geschützte Bereich verschlüsselt vor. Das Klartextfenster betrug im Median 0,089 ms.
  • 0 von 11 094Stichproben erfassten entschlüsselte Zeichenketten oder Bytecode im Speicher.
  • kein Zielfür den klassischen Patch-Angriff: fünf gezielt geänderte Bytes brachten das Programm stabil in den Erfolgspfad — und die Ausgabe blieb unlesbar. Der Erfolgstext existiert nicht als Datum, das sich freischalten ließe.

Geprüft wurde CitadelCore 1.29 an einem gehärteten Demo-Programm. Methodik, Messwerte und Fundstellen stehen vollständig im Bericht.

Überzeugt? Dann sind Sie zwei Minuten vom ersten gehärteten Build entfernt.Windows-Edition 1.29.0, einmalig 74,99 € — sofort nach der Zahlung einsatzbereit.

Wie die neun Schutzebenen im Einzelnen arbeiten und woher jede Zahl stammt, steht in dentechnischen Details.

74,99 €einmalig · kein Abo
jetzt kaufen