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 Quanzhoucoowayin 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 UXVhbnpob3Vjb293YXdas ist gewährleistet in den Base64-kodierten Daten angezeigt werden, wenn das Byte - Tripletts Qua, nzh, ouc, oowund das teilweise Triplett ayim Eingang in dieser Reihenfolge angezeigt.
Natürlich Quanzhoucoowaybeginnt die Saite möglicherweise nicht genau an der Triplettgrenze. Wenn wir beispielsweise XQuanzhoucoowaystattdessen 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 XByte codieren , und uns dabei belassen F1YW56aG91Y29vd2F5.
Schließlich XXQuanzhoucoowayliefert die Base64-Codierung die Ausgabe WFhRdWFuemhvdWNvb3dheQ==, die an beiden Enden mit Padding versehen ist. Wenn wir die ersten drei Zeichen WFh(die das XXPrä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 F1YW56und 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 " quanzhoucoowayis" cXVhbnpob3Vjb293YXk=und die von " QUANZHOUCOOWAYis". 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.