Technisch gesehen , Sie könnten direkt die Base64 - codierte Daten nach Schlüsselwörtern filtern. Ich sage nicht, dass es eine praktische oder vernünftige Sache ist, angesichts der Existenz besserer und einfacherer Alternativen (wie z. B. in Esas Antwort oben beschrieben), aber es ist möglich.
Der Trick besteht darin, zu erkennen, dass die Base64-Codierung eine deterministische Zuordnung von 3-Byte-Blöcken nicht codierter Rohdaten zu 4-Zeichen-Blöcken mit Base64-Zeichen ist. Jedes Mal, wenn eine bestimmte Folge von 3-Byte-Blöcken in den unverschlüsselten Daten erscheint, erscheint dieselbe Folge von 4-Zeichen-Blöcken in der verschlüsselten Version.
Wenn Sie beispielsweise die Zeichenfolge Quanzhoucooway
in einen Base64-Encoder eingeben , erhalten Sie die Ausgabe UXVhbnpob3Vjb293YXk=
. Da die Länge der Eingabe nicht ein Vielfaches von 3 Bytes ist, enthält die Ausgabe am Ende eine Auffüllung. Wenn wir jedoch die letzten =
Zeichen und das letzte tatsächliche base64-Zeichen löschen k
(da es auch einige Auffüllbits codiert), erhalten wir die Zeichenfolge UXVhbnpob3Vjb293YX
das ist gewährleistet in den Base64-kodierten Daten angezeigt werden, wenn das Byte - Tripletts Qua
, nzh
, ouc
, oow
und das teilweise Triplett ay
im Eingang in dieser Reihenfolge angezeigt.
Natürlich Quanzhoucooway
beginnt die Saite möglicherweise nicht genau an der Triplettgrenze. Wenn wir beispielsweise XQuanzhoucooway
stattdessen den String codieren , erhalten wir die Ausgabe WFF1YW56aG91Y29vd2F5
, die völlig anders aussieht. Diesmal ist die Eingabelänge durch drei teilbar, sodass am Ende keine Füllzeichen zu verwerfen sind. Wir müssen jedoch die ersten beiden Zeichen ( WF
) verwerfen, die jeweils einige der Bits aus dem vorangestellten X
Byte codieren , und uns dabei belassen F1YW56aG91Y29vd2F5
.
Schließlich XXQuanzhoucooway
liefert die Base64-Codierung die Ausgabe WFhRdWFuemhvdWNvb3dheQ==
, die an beiden Enden mit Padding versehen ist. Wenn wir die ersten drei Zeichen WFh
(die das XX
Präfix codieren ) und die letzten drei Zeichen Q==
(die das Null-Bit-Auffüllen am Ende codieren ) entfernen , bleibt die Zeichenfolge übrig RdWFuemhvdWNvb3dhe
. Somit erhalten wir die folgenden drei base64-codierten Zeichenfolgen:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
von denen (mindestens) einer in der base64-codierten Form einer Eingabezeichenfolge erscheinen muss, die das Wort enthält Quanzhoucooway
.
Wenn Sie Pech haben, kann der base64-Encoder natürlich einen Zeilenumbruch zwischen zwei codierten Triplets einfügen. (In Ihrer Beispielnachricht steht beispielsweise eine zwischen F1YW56
und aG91Y29vd2F5
.) Um diese Zeichenfolgen zuverlässig mit regulären Ausdrücken abzugleichen, benötigen Sie beispielsweise Folgendes (mithilfe der PCRE-Syntax):
/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD
Das Erzeugen dieser Muster von Hand ist etwas mühsam, aber es wäre nicht schwer, ein einfaches Skript zu schreiben, um dies in Ihrer bevorzugten Programmiersprache zu tun, zumindest solange es einen Base64-Encoder bietet.
Wenn Sie es wirklich wollten, können Sie sogar eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung implementieren, indem Sie das Schlüsselwort mit base64 sowohl in Klein- als auch in Großbuchstaben codieren und sie zu einem regulären Ausdruck kombinieren, der einer beliebigen Kombination von beiden entspricht. Beispielsweise ist die Base64-Codierung von " quanzhoucooway
is" cXVhbnpob3Vjb293YXk=
und die von " QUANZHOUCOOWAY
is". Daher gilt folgende UVVBTlpIT1VDT09XQVk=
Regel:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
wird auf jeden Fall mit dem base64-codierten Wort "Quanzhoucooway" übereinstimmen, vorausgesetzt, es beginnt an einer Triplettgrenze. Die anderen beiden entsprechenden regulären Ausdrücke für die verschobenen Versionen zu generieren, bleibt als Übung. ;)
Leider wird es schnell unpraktisch, etwas Komplizierteres zu tun als einen einfachen Teilstringabgleich wie diesen. Aber zumindest ist es ein ordentlicher Trick. Im Prinzip kann es sogar nützlich sein, wenn Sie aus irgendeinem Grund SpamAssassin oder einen anderen Filter nicht verwenden können, der die Base64-Codierung vor dem Filtern decodieren kann. Aber wenn Sie das können, anstatt solche Hacks zu verwenden, sollten Sie es auf jeden Fall tun.