Técnicamente, puede filtrar directamente los datos codificados en base64 para palabras clave. No digo que sea algo práctico o razonable, dada la existencia de alternativas mejores y más simples (como se describe, por ejemplo, en la respuesta de Esa), pero es posible.
El truco consiste en darse cuenta de que la codificación base64 es una asignación determinista de bloques de 3 bytes de datos sin codificar sin procesar en bloques de 4 caracteres de caracteres base64. Por lo tanto, cada vez que aparece una cierta secuencia de bloques de 3 bytes en los datos no codificados, la misma secuencia de bloques de 4 caracteres aparecerá en la versión codificada.
Por ejemplo, si ingresa la cadena Quanzhoucooway
en un codificador base64 , obtendrá la salida UXVhbnpob3Vjb293YXk=
. Como la longitud de la entrada no es un múltiplo de 3 bytes, la salida contiene algo de relleno al final, pero si omitimos los =
signos finales y el último carácter base64 real k
(ya que también codifica algunos bits de relleno), obtenemos la cadena UXVhbnpob3Vjb293YX
que está garantizado para aparecer en los datos codificados en base64 siempre que los tripletes de bytes Qua
, nzh
, ouc
, oow
y el triplete parcial ay
aparecen en la entrada en ese orden.
Pero, por supuesto, la cadena Quanzhoucooway
podría no comenzar exactamente en el límite del triplete. Por ejemplo, si codificamos la cadena en su XQuanzhoucooway
lugar, obtenemos la salida WFF1YW56aG91Y29vd2F5
, que se ve completamente diferente. Esta vez, la longitud de entrada es divisible por tres, por lo que no hay caracteres de relleno para descartar al final, pero necesitamos descartar los dos primeros caracteres ( WF
) que codifican cada uno de los bits del X
byte antepuesto , dejándonos con F1YW56aG91Y29vd2F5
.
Finalmente, la codificación base64 XXQuanzhoucooway
proporciona la salida WFhRdWFuemhvdWNvb3dheQ==
, que tiene relleno en ambos extremos. Eliminando los primeros tres caracteres WFh
(que codifican el XX
prefijo) y los últimos tres caracteres Q==
(que codifican el relleno de bit cero al final), nos queda la cadena RdWFuemhvdWNvb3dhe
. Por lo tanto, obtenemos las siguientes tres cadenas codificadas en base64:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
de los cuales (al menos) uno debe aparecer en la forma codificada en base64 de cualquier cadena de entrada que contenga la palabra Quanzhoucooway
.
Por supuesto, si no tiene suerte, el codificador base64 puede insertar un salto de línea en el medio de ellos, entre dos tripletes codificados. (Su mensaje de ejemplo, por ejemplo, tiene uno entre F1YW56
y aG91Y29vd2F5
.) Por lo tanto, para hacer coincidir de manera confiable estas cadenas con expresiones regulares, necesitaría algo como lo siguiente (usando la sintaxis 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
Generar estos patrones a mano es algo tedioso, pero no sería difícil escribir un script simple para hacerlo en su lenguaje de programación favorito, al menos siempre que proporcione un codificador base64.
Si realmente quisiera, incluso podría implementar una coincidencia que no distinga entre mayúsculas y minúsculas al codificar en base64 tanto la versión en minúsculas como en mayúsculas de la palabra clave y combinarlas en una expresión regular que coincida con cualquier combinación de ellas. Por ejemplo, la codificación base64 de quanzhoucooway
es cXVhbnpob3Vjb293YXk=
mientras que la de QUANZHOUCOOWAY
es UVVBTlpIT1VDT09XQVk=
, por lo que la regla:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
coincidirá con la palabra codificada en base64 "Quanzhoucooway" en cualquier caso, siempre que comience en un límite de triplete. La generación de las otras dos expresiones regulares correspondientes para las versiones modificadas se deja como ejercicio. ;)
Por desgracia, hacer algo más complicado que una simple coincidencia de subcadenas como esta rápidamente se vuelve poco práctico. Pero al menos es un buen truco. En principio, incluso podría ser útil, si por alguna razón no pudieras usar SpamAssassin o cualquier otro filtro que pueda decodificar la codificación base64 antes de filtrar. Pero si puedes hacer eso, en lugar de usar hacks como este, ciertamente deberías hacerlo.