Christian Seiler: Quelltext richtig verschlüsseln

Beitrag lesen

Hallo,

Wenn du den Sourcecode, z.B. PHP verschlüsseln möchtest, brauchst du ein professionelles Tool. Diese sind häufig ab 200€ zu haben.

Sorry, aber die verschlüsseln auch nicht. Was hier im Thread für Vorstellungen von Verschlüsselung aufgekommen sind, ist irgendwie extrem abenteuerlich.

Es gibt zwei Arten von Tools für PHP, die den Code verbergen:

* Tools, die obfuscating betreiben: Diese benennen Bezeichner in ganz
   komische Namen um, ändern die Struktur des Codes ohne die Funktionalität
   zu ändern, so dass ein normaler Mensch es schwer hat, den Code noch zu
   lesen. Nützt aber nur bei kompletten Scripten etwas - auf Klassen-
   sammlungen angewendet ist der Nutzen nämlich extrem gering, da
   öffentliche Klasseneigenschaften und -Methoden natürlich weiterhin so
   heißen müssen, wie sie heißen - und somit ein Großteil des Effekts
   verloren geht. Außerdem gibt es inzwischen mit Sicherheit Tools, mit
   denen man sowas rückgängig machen kann - man muss ja nur aufspüren, wo
   ein bestimmter Bezeichner überall verwendet wird um zu sehen, wofür er in
   etwa gut ist, und kann ihn dann global umbennnen in etwas sinnvolles. Ist
   zwar etwas Arbeit, aber mit vertretbaren Aufwand kommt man wieder an
   lesbaren Code. Nützt also nicht wirklich etwas.

* Tools, die nur Opcodes speichern: Dazu muss man wissen, wie PHP Dateien
   denn tatsächlich verarbeitet. PHP hat nämlich 2 Durchgänge, um Dateien
   auszuführen: Zuerst werden sie "kompiliert", d.h. in sogenannte "Opcodes"
   gewandelt, danach werden die Opcodes ausgeführt. Im folgenden mal ein
   Beispiel, wie so etwas aussieht:

Betrachten wir folgende PHP-Datei:

<?php  
  
function ersetzeEuro ($arg) {  
  return str_replace ('€', 'EUR', $arg);  
}  
  
$betraege = array ('4 €', '5 €', '6 €');  
$ausgabe = array_map ('ersetzeEuro', $betraege);  
var_dump ($ausgabe);  
  
?>

Mit geeigneten Extensions kann man sich nun ansehen, welche Opcodes PHP aus dieser Datei generiert:

Branch analysis from position: 0
filename:       - schnipp -
function name:  (null)
number of ops:  12
compiled vars:  !0 = $betraege, !1 = $ausgabe
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   3     0  NOP
   7     1  INIT_ARRAY                                       ~0      '4 €'
         2  ADD_ARRAY_ELEMENT                                ~0      '5 €'
         3  ADD_ARRAY_ELEMENT                                ~0      '6 €'
         4  ASSIGN                                                   !0, ~0
   8     5  SEND_VAL                                                 'ersetzeEuro'
         6  SEND_VAR                                                 !0
         7  DO_FCALL                                      2          'array_map'
         8  ASSIGN                                                   !1, $2
   9     9  SEND_VAR                                                 !1
        10  DO_FCALL                                      1          'var_dump'
  12    11  RETURN                                                   1

Function ersetzeeuro%00:
Branch analysis from position: 0
Return found
filename:       - schnipp -
function name:  ersetzeEuro
number of ops:  7
compiled vars:  !0 = $arg
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   3     0  RECV                                                     1
   4     1  SEND_VAL                                                 '€'
         2  SEND_VAL                                                 'EUR'
         3  SEND_VAR                                                 !0
         4  DO_FCALL                                      3          'str_replace'
         5  RETURN                                                   $0
   5     6* RETURN                                                   null

End of function ersetzeeuro%00.

Wenn jetzt eine Software diese Opcodes in einer Datei in Binärform speichert, dann kommt einem die Datei auch unleserlich vor. Es ist allerdings relativ leicht, aus den generierten Opcodes wieder PHP-Code zu erzeugen, der zu genau diesen Opcodes führt (sogar die Variablennamen bleiben erhalten - müssen sie übrigens auch, weil PHP es ja anbietet über $$name, über variable Variablennamen auf Variablen zuzugreifen) - ich weiß zwar nicht, ob es fertige Tools für sowas gibt (d.h. Opcodes wieder zu PHP-Code zurückwandeln), aber sowas wäre definitiv nicht allzu schwierig zu schreiben.

Insofern: Wirklich schützen kann man seine PHP-Scripte nie, man kann nur den Aufwand erhöhen, an den Source heranzukommen.

Viele Grüße,
Christian