Tecnicamente, você poderia filtrar diretamente os dados codificados em base64 para 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 de Esa acima), mas é possível.
O truque é perceber que codificação base64 é um mapeamento determinístico de blocos de 3 bytes de dados brutos não codificados em 4 - blocos de caracteres de base64. Assim, sempre que uma certa seqüência de blocos de 3 bytes aparecer nos dados não codificados, a mesma seqüência de blocos de 4 caracteres aparecerá na versão codificada.
Por exemplo, se você inserir a string Quanzhoucooway
em um codificador base64 , você obtenha a saída UXVhbnpob3Vjb293YXk=
. Como o comprimento da entrada não é um múltiplo de 3 bytes, a saída contém algum preenchimento no final, mas se eliminarmos os sinais =
finais e o último caractere base64 real k
(pois também codifica alguns bits de preenchimento), obtemos a string UXVhbnpob3Vjb293YX
que é garantida para aparecer nos dados codificados em base64 sempre que os trios de bytes Qua
, nzh
, ouc
, oow
e o trio parcial ay
aparecem na entrada nessa ordem.
Mas, é claro, a string Quanzhoucooway
pode não iniciar exatamente no limite do triplet. Por exemplo, se codificarmos a string XQuanzhoucooway
, obteremos a saída WFF1YW56aG91Y29vd2F5
, que parece completamente diferente. Desta vez, o comprimento de entrada é divisível por três, então não há caracteres de preenchimento para descartar no final, mas precisamos descartar os dois primeiros caracteres ( WF
), que codificam alguns dos bits do prefended X
byte, deixando-nos com F1YW56aG91Y29vd2F5
.
Por fim, a codificação base64 XXQuanzhoucooway
fornece a saída WFhRdWFuemhvdWNvb3dheQ==
, que tem preenchimento nas duas extremidades. Removendo os três primeiros caracteres WFh
(que codificam o prefixo XX
) e os últimos três caracteres Q==
(que codificam o preenchimento de bit zero no final), ficamos com a string RdWFuemhvdWNvb3dhe
. Assim, obtemos as seguintes três strings codificadas em base64:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
dos quais (pelo menos) um deve aparecer na forma codificada na base64 de qualquer string de entrada contendo a palavra Quanzhoucooway
.
É claro que, se você tiver azar, o codificador base64 pode inserir uma quebra de linha no meio deles, entre duas trincas codificadas. (Sua mensagem de exemplo, por exemplo, tem um entre F1YW56
e aG91Y29vd2F5
.) Assim, para corresponder essas sequências de forma confiável com regexps, você precisaria 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 entediante, mas não seria difícil escrever um script simples para fazer isso em sua linguagem de programação favorita, pelo menos enquanto ele fornecer um codificador de base64.
Se você realmente quisesse, poderia até mesmo implementar a correspondência sem distinção entre maiúsculas e minúsculas codificando a base64 da versão em minúscula e maiúscula da palavra-chave e combinando-as em uma expressão regular que corresponda a qualquer combinação delas. Por exemplo, a codificação base64 de quanzhoucooway
é cXVhbnpob3Vjb293YXk=
, enquanto que a de QUANZHOUCOOWAY
é 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
corresponderá à palavra codificada em base64 "Quanzhoucooway" em qualquer caso, desde que comece em um limite de trinca. Gerar os outros dois regexps correspondentes para as versões deslocadas é deixado como um exercício. ;)
Ai, fazer qualquer coisa mais complicada do que uma correspondência simples de substring assim rapidamente se torna impraticável. Mas pelo menos é um truque legal. Em princípio, 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 de filtrar. Mas se você puder fazer isso, ao invés de usar hacks como esse, você certamente deveria.