Tecnicamente, você pode filtrar diretamente os dados codificados em base64 por palavras-chave. Não estou dizendo que é uma coisa prática ou razoável, dada a existência de alternativas melhores e mais simples (como descrito, por exemplo, na resposta da Esa acima), mas é possível.
O truque é perceber que a codificação base64 é um mapeamento determinístico de blocos de 3 bytes de dados não codificados brutos em blocos de 4 caracteres de caracteres base64. Assim, sempre que uma determinada sequência de blocos de 3 bytes aparecer nos dados não codificados, a mesma sequência de blocos de 4 caracteres aparecerá na versão codificada.
Por exemplo, se você digitar a string Quanzhoucooway
em um codificador base64 , obterá a saída UXVhbnpob3Vjb293YXk=
. Como o comprimento da entrada não é múltiplo de 3 bytes, a saída contém algum preenchimento no final, mas se soltarmos os =
sinais finais e o último caractere base64 real k
(já que ele também codifica alguns bits de preenchimento), obtemos a sequência UXVhbnpob3Vjb293YX
que seja garantida a aparecer nos dados codificados-base64 sempre que os tripletos de byte Qua
, nzh
, ouc
, oow
e o tripleto parcial ay
aparecem na entrada em que ordem.
Mas, é claro, a sequência Quanzhoucooway
pode não começar exatamente no limite dos trigêmeos. Por exemplo, se codificarmos a string XQuanzhoucooway
, obteremos a saída WFF1YW56aG91Y29vd2F5
, que parece completamente diferente. Desta vez, o comprimento da entrada é divisível por três; portanto, não há caracteres de preenchimento para descartar no final, mas precisamos descartar os dois primeiros caracteres ( WF
) que codificam alguns bits do X
byte precedido , deixando-nos com F1YW56aG91Y29vd2F5
.
Finalmente, a codificação base64 XXQuanzhoucooway
fornece a saída WFhRdWFuemhvdWNvb3dheQ==
, que possui preenchimento nas duas extremidades. Removendo os três primeiros caracteres WFh
(que codificam o XX
prefixo) e os três últimos Q==
(que codificam o preenchimento de zero bits no final), ficamos com a string RdWFuemhvdWNvb3dhe
. Assim, obtemos as seguintes três cadeias codificadas em base64:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
dos quais (pelo menos) um deve aparecer na forma codificada em base64 de qualquer sequência de entrada que contenha a palavra Quanzhoucooway
.
Obviamente, se você não tiver sorte, o codificador base64 pode inserir uma quebra de linha no meio deles, entre dois trigêmeos codificados. (Sua mensagem de exemplo, por exemplo, tem uma entre F1YW56
e aG91Y29vd2F5
.) Portanto, para corresponder essas strings com regexps, você precisa de algo como o seguinte (usando a sintaxe 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
Gerar esses padrões manualmente é meio tedioso, mas não seria difícil escrever um script simples para fazê-lo na sua linguagem de programação favorita, pelo menos desde que ele forneça um codificador base64.
Se você realmente quisesse, poderia implementar a correspondência sem distinção entre maiúsculas e minúsculas, codificando base64 tanto a versão em minúscula quanto a maiúscula da palavra-chave e combinando-as em uma regexp que corresponda a qualquer combinação delas. Por exemplo, a codificação base64 de quanzhoucooway
é cXVhbnpob3Vjb293YXk=
enquanto QUANZHOUCOOWAY
é de UVVBTlpIT1VDT09XQVk=
, portanto, a regra:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
em qualquer caso, corresponderá à palavra codificada em base64 "Quanzhoucooway", desde que comece em um limite de trigêmeo. A geração dos outros dois regexps correspondentes para as versões deslocadas é deixada como um exercício. ;)
Infelizmente, fazer algo mais complicado do que uma simples correspondência de substring como essa rapidamente se torna impraticável. Mas pelo menos é um truque legal. Em princípio, isso pode até ser útil se, por algum motivo, você não puder usar o SpamAssassin ou qualquer outro filtro que possa decodificar a codificação base64 antes da filtragem. Mas se você pode fazer isso, em vez de usar hacks como esse, certamente deveria.