Tecnicamente, è possibile filtrare direttamente i dati codificati in base64 per le parole chiave. Non sto dicendo che sia una cosa pratica o ragionevole da fare, data l'esistenza di alternative migliori e più semplici (come descritto ad esempio nella risposta di Esa sopra), ma è possibile.
Il trucco è rendersi conto che la codifica base64 è una mappatura deterministica di blocchi a 3 byte di dati grezzi non codificati in blocchi di 4 caratteri di caratteri base64. Pertanto, ogni volta che una determinata sequenza di blocchi di 3 byte appare nei dati non codificati, la stessa sequenza di blocchi di 4 caratteri apparirà nella versione codificata.
Ad esempio, se inserisci la stringa Quanzhoucooway
in un codificatore base64 , otterrai l'output UXVhbnpob3Vjb293YXk=
. Poiché la lunghezza dell'input non è un multiplo di 3 byte, l'output contiene un po 'di riempimento alla fine, ma se eliminiamo i =
segni finali e l'ultimo carattere base64 effettivok
(poiché codifica anche alcuni bit di riempimento), otteniamo la stringa UXVhbnpob3Vjb293YX
che è garantita a comparire nei dati codificati in base 64 ogniqualvolta le triplette byte Qua
, nzh
, ouc
, oow
e la tripletta parziale ay
appaiono in ingresso in questo ordine.
Ma, naturalmente, la stringa Quanzhoucooway
potrebbe non iniziare esattamente al limite della tripletta. Ad esempio, se XQuanzhoucooway
invece codifichiamo la stringa , otteniamo l'output WFF1YW56aG91Y29vd2F5
, che sembra completamente diverso. Questa volta, la lunghezza dell'input è divisibile per tre, quindi non ci sono caratteri di riempimento da scartare alla fine, ma dobbiamo scartare i primi due caratteri ( WF
) che codificano ciascuno dei bit dal X
byte anteposto , lasciandoci con F1YW56aG91Y29vd2F5
.
Infine, la codifica base64 XXQuanzhoucooway
fornisce l'output WFhRdWFuemhvdWNvb3dheQ==
, che ha il riempimento ad entrambe le estremità. Rimozione dei primi tre caratteri WFh
(che codificano ilXX
prefisso) e gli ultimi tre caratteri Q==
(che codificano il riempimento con bit zero alla fine), restiamo con la stringa RdWFuemhvdWNvb3dhe
. Pertanto, otteniamo le seguenti tre stringhe con codifica base64:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
di cui (almeno) uno deve apparire nella forma codificata in base64 di qualsiasi stringa di input contenente la parola Quanzhoucooway
.
Naturalmente, se sei sfortunato, l'encoder base64 può inserire un'interruzione di linea nel mezzo di essi, tra due triplette codificate. (Il tuo messaggio di esempio, ad esempio, ha uno tra F1YW56
e aG91Y29vd2F5
.) Pertanto, per abbinare in modo affidabile queste stringhe con regexps, avresti bisogno di qualcosa di simile al seguente (usando la sintassi PCRE):
/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
Generare questi schemi a mano è un po 'noioso, ma non sarebbe difficile scrivere un semplice script per farlo nel tuo linguaggio di programmazione preferito, almeno fintanto che fornisce un codificatore base64.
Se lo desideri davvero, potresti persino implementare la corrispondenza senza distinzione tra maiuscole e minuscole mediante la codifica base64 sia della versione minuscola che maiuscola della parola chiave e combinandole in una regexp che corrisponde a qualsiasi combinazione di esse. Ad esempio, la codifica base64 di quanzhoucooway
is cXVhbnpob3Vjb293YXk=
while quella di QUANZHOUCOOWAY
is UVVBTlpIT1VDT09XQVk=
, quindi la regola:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
corrisponderà in ogni caso alla parola codificata in base64 "Quanzhoucooway", a condizione che inizi su un confine di tripletto. Generare gli altri due regexps corrispondenti per le versioni spostate viene lasciato come esercizio. ;)
Purtroppo, fare qualcosa di più complicato del semplice abbinamento di sottostringhe come questo diventa rapidamente poco pratico. Ma almeno è un trucco accurato. In linea di principio, potrebbe anche essere utile, se per qualche motivo non è possibile utilizzare SpamAssassin o qualsiasi altro filtro in grado di decodificare la codifica base64 prima del filtraggio. Ma se riesci a farlo, invece di usare hack come questo, dovresti sicuramente farlo.