Im vorherigen Artikel „Praktische Wiederherstellung von PHP-verschlüsselten Dateien“ wurde erwähnt, dass ich die Mängel der PHP-Methode zum Verschlüsseln von Dateien entdeckt habe, also habe ich diesen Artikel geschrieben.
Hintergrundanalyse
Wie wir alle wissen, ist PHP eine Skriptsprache, und Skriptsprachen verwenden hauptsächlich Interpretation statt Kompilierung. Im Vergleich zu kompilierten Sprachen (C, C#, C) ist es daher nicht möglich, ExedLL direkt zu generieren. Daher kann die herkömmliche Verschlüsselungsmethode nicht verwendet werden.
Daher gibt es in PHP im Allgemeinen zwei Verschlüsselungsmethoden: Verschleierung und Verschlüsselung.
Verschleierung ist keine Verschlüsselung im engeren Sinne. Diese Art von Code ähnelt dem Code, der Pinyin-Abkürzungen zur Benennung von Variablen verwendet, sieht jedoch etwas aufwändiger aus. Dies würde den Rahmen unserer Diskussion sprengen.
Die Verschlüsselung erfolgt auf zwei Arten: zum einen mit der Erweiterung (Loader). Das andere ist keine Erweiterung.
Lassen Sie uns zunächst über die Verschlüsselungsmethode ohne Erweiterung sprechen. Diese Verschlüsselungsmethode ist sehr hirnlos, da ihr Entschlüsselungsprozess öffentlich ist und die Verwendung bekannter PHP-Funktionen erfordert. Der verschlüsselte Code sieht im Allgemeinen wie folgt aus:
<?phpeval(base64_decode("cGhwaW5mbygpOw=="));
Auch wenn es sehr kompliziert aussieht:
ist nur eine Variation des oben Gesagten. Dieses Entschlüsselungsformular ist sehr leicht zu knacken, wenn es offengelegt wird. Suchen Sie einfach nach eval und ändern Sie es in echo.
Die andere Erweiterungsmethode ist komplizierter. Die Funktion der Erweiterung besteht hier hauptsächlich darin, den Code zu entschlüsseln und auszuführen. Im Vergleich zur Nicht-Erweiterungsform verbirgt sie den Entschlüsselungs- und Ausführungscode in der Erweiterung, sodass das Knacken komplizierter ist.
Die Erweiterungen werden hier im Allgemeinen in zwei Typen unterteilt: 1. Diejenigen, die Entschlüsselungsausführungsfunktionen bereitstellen. 2. Überschreiben Sie zend_compile_file direkt, um die Funktion zum Parsen benutzerdefinierter PHP-Dateien zu implementieren.
Das erste und typischste Beispiel ist der in meinem letzten Artikel erwähnte Zoeeyguard, der hauptsächlich die Funktion zend_eval_string zum Ausführen von PHP-Code verwendet.
Zur zweiten Art von Vertretern gehören: Zend Guard und Song Ge’s PHP-Beast.
Man kann sagen, dass die beiden Crack-Ideen ähnlich sind. Sie können dem Ausprobieren der Ideen in meinem vorherigen Artikel Vorrang einräumen.
Was wäre natürlich, wenn ich das Problem in meinem vorherigen Artikel nicht gelöst hätte?
Zu diesem Zeitpunkt müssen Sie eine große Killerwaffe verwenden.
Sie werden feststellen, dass ich im vorherigen Artikel über die beiden Funktionen zend_compile_file und zend_eval_string gesprochen habe. Einige kluge PHPer haben bereits darüber nachgedacht, ja! Die Idee besteht immer noch darin, eval zu finden und in echo zu ändern.
Praxisbeispiele
Wir können nicht einfach reden, ohne etwas zu tun. Nehmen wir ein Beispiel:
Dieses Mal beginnen wir mit dem PHP-Beast von Brother Song. Der Code von Bruder Song ist sehr schön geschrieben. Da er wusste, dass die AES-DES-Entschlüsselung Zeit braucht, hat er einen Cache geschrieben.
1. Laden Sie das PHP-Quellcodepaket für Linux herunter (am besten wählen Sie eines zwischen 5.6 und 5.5. 7 wird nicht unterstützt. Übrigens: Die Änderungen in 7 sind ziemlich groß. Viele Dinge sind nicht kompatibel. Zend Guard ist auch 7 wird hier nicht unterstützt.)
2. Finden Sie die Funktion in der Datei Zendzend_lingual_scanner.c: zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC). Folgendes: Fügen Sie den Code vor (der Code ist schlecht geschrieben, beschweren Sie sich nicht):
ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) { zend_lex_state original_lex_state; zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); zend_op_array *original_active_op_array = CG(active_op_array); zend_op_array *retval=NULL; int compiler_result; zend_bool compilation_successful=0; znode retval_znode; zend_bool original_in_compilation = CG(in_compilation); /** BEGIN **/ //加在这里的含义就是每次php编译php源码的时候都把这份源码打印一份 char *buf; size_t size; zend_stream_fixup(file_handle, &buf, &size); printf("\n#######\nFILE TYPE: %d FILE NAME: %s CONTENT: %s\n#######\n", (*file_handle).type, (*file_handle).filename, buf); /** END **/
Im PHP-Ordner ausführen:
//节省点时间 ./configure --disable-ipv6 --disable-all make make install
4 , PHP wurde erfolgreich installiert.
5. Wir schreiben zwei Testdateien: Die Funktion lautet: test.php führt sie aus, um before.php zu verschlüsseln und after.php zu generieren.
//test.php <?php $path = __DIR__ . '/before.php'; $newPath = __DIR__ . '/after.php'; $result = beast_encode_file($path, $newPath, 0, BEAST_ENCRYPT_TYPE_DES); var_dump($result);
//before.php <?php print 'http://wx-app.com.cn/' . PHP_EOL;
7. Führen Sie die folgende PHP-Datei test.php und dann php after.php aus.
Sehen Sie sich die Screenshots unten an:
Zusammenfassung
1. Es gibt kein Passwort, das nicht gebrochen werden kann. Wir können lediglich die Crackzeit verlängern. Wenn die Knackzeit größer ist als die Lebensspanne eines Menschen, dann ist diese Verschlüsselungsmethode durchaus erfolgreich.
2. So wie der Cracker bei verschlüsselten Programmen das Denken des Autors verstehen und erraten muss, muss der Autor auch die Methoden und Mittel des Crackers verstehen. Nur so können wir Programme schreiben, die schwieriger zu knacken sind.
3. Im Vergleich zur Verschlüsselung ist die Verschleierung meiner Meinung nach besser für die „Verschlüsselung“ des PHP-Quellcodes geeignet.
4. Wenn Sie Ihren PHP-Code verschlüsseln und veröffentlichen möchten, ist es am besten, die Gebühr zu erhöhen und den Quellcode direkt bereitzustellen.