Die vier Schutzstufen im Detail
Jede Stufe baut auf der vorherigen auf. Wähle nach Bedarf — höhere Stufen erzeugen größere Dateien und sind aufwändiger rückzubauen, aber niemals echte Verschlüsselung.
Stufe 1 — Basic
Die schnellste und am einfachsten reversible Stufe. Geeignet als erste Hürde gegen flüchtige Blicke in den Code.
Was passiert
- Alle Kommentare (
//,#,/* */) werden entfernt - Überflüssige Leerzeichen und Leerzeilen werden zusammengefasst
- Variablen erhalten generische Namen (
$_a1,$_a2, ...) - Superglobals (
$_GET,$_POSTusw.) bleiben unverändert
Vorher
<?php // Login prüfen function checkLogin($user, $pass) { return $user === 'admin'; }
Nachher
<?php function checkLogin($_a1,$_a2){return $_a1==='admin';}
Stufe 2 — Medium
Der gesamte Code wird komprimiert, base64-codiert und zur Laufzeit per eval() ausgeführt. Beim Öffnen sieht man nur einen Decoder.
Was passiert
- Code wird mit
gzdeflate()komprimiert - Komprimierter Code wird mit
base64_encode()verpackt - Decoder lädt mit
eval(gzinflate(base64_decode($payload))) - Funktionsnamen sind gestückelt (
"base"."64_de"."code")
Nachher (Auszug)
<?php $_0xa1b2c3='eJxLy8svykktUtA3MtA0sLPQNDAyAACFlAQq'; $_0xd4e5f6="base"."64_de"."code"; $_0x789012="gz"."inflate"; eval($_0x789012($_0xd4e5f6($_0xa1b2c3)));
Stufe 3 — Advanced
Mehrfach geschachtelte Encoder, hex-codierte Funktionsnamen und Decoy-Code, der nie ausgeführt wird.
Was passiert
- Encoding-Kette:
gzdeflate → base64 → str_rot13 → base64 - Funktionsnamen werden als Hex-Escape-Sequenzen geschrieben (
"\x65\x76\x61\x6c"="eval") - Variablen bekommen zufällige Hex-Namen (
$_0xa1b2c3) - Ein unerreichbarer
if(0){...}-Block mit plausibel aussehendem Code wird eingestreut
Nachher (Auszug)
<?php if(0){$_a4f3e1="\x70\x68\x70\x76\x65\x72\x73\x69\x6f\x6e";} $_0xb7c2d9='aGVsbG8gd29ybGQ='; $_0x33ab1f="\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65"; $_0x9e8d44="\x73\x74\x72\x5f\x72\x6f\x74\x31\x33"; eval($_0x9e8d44($_0x33ab1f($_0x33ab1f($_0xb7c2d9))));
Stufe 4 — Pro
Die maximale Hürde: XOR-Verschlüsselung mit zufälligem Schlüssel, der Payload in Chunks aufgeteilt, Funktionsnamen zur Laufzeit aus chr()-Konstruktionen zusammengebaut.
Was passiert
- Code wird komprimiert und XOR-verschlüsselt mit zufälligem 16-Byte-Schlüssel
- Schlüssel wird als
chr(78).chr(15).chr(220)...rekonstruiert - Payload wird in 64-Byte-Chunks aufgeteilt und in einem Array gespeichert
- Funktionsnamen entstehen erst zur Laufzeit aus
chr()-Verkettung - Mehrere
if(false){...}-Junk-Blöcke verstreut - Ausgabe als eine einzige lange Zeile (Anti-Beautify)
Wann welche Stufe?
Du willst Lizenzlogik kaschieren
Stufe 3 oder 4. Verhindert, dass jemand schnell mal die Schlüsselprüfung umschreibt.
Du gibst Code an Kunden weiter
Stufe 2 oder 3. Reicht, damit der Quellcode nicht trivial geklaut oder verändert wird.
Du willst nur API-Keys verstecken
Stufe 1 reicht nicht. Nimm mindestens Stufe 3 — oder besser: Keys in .env-Datei auslagern.
Du willst kleine Skript-Größe
Stufe 1. Alle höheren Stufen vergrößern die Datei deutlich (200–400 %).