Teknik olarak, olabilir doğrudan anahtar kelimeler için base64 kodlanmış verilere filtre. Ben (yukarıda Esa yanıtında açıklandığı gibi) daha iyi ve daha basit alternatiflerinin bulunması dikkate alındığında, pratik veya yapmak için makul bir şey demiyorum, ama bu olduğunu mümkün.
İşin püf noktası, base64 kodlamasının , 3 baytlık ham kodlanmamış verilerin bloklarının 4 karakterli base64 karakter bloklarına deterministik bir eşlemesi olduğunu fark etmektir. Böylece, kodlanmamış verilerde belirli bir 3 baytlık blok dizisi her göründüğünde, kodlanmış versiyonda aynı 4 karakterlik blok dizisi görünecektir.
Örneğin, dizeyi Quanzhoucooway
bir base64 kodlayıcıya girerseniz, çıktı alırsınız UXVhbnpob3Vjb293YXk=
. Girişin uzunluğu 3 baytın katı olmadığından, çıktı sonunda bir dolgu içerir , ancak son =
işaretleri ve son gerçek base64 karakterini düşürürsek k
(bazı dolgu bitlerini de kodladığı için), dizeyi alırız UXVhbnpob3Vjb293YX
byte, üçlüler her base64 kodlanmış veri görünmesi sağlanır Qua
, nzh
, ouc
, oow
ve kısmi üçlü ay
bu sırayla giriş görünür.
Ancak, elbette, dize Quanzhoucooway
tam olarak üçlü sınırda başlamayabilir. Örneğin, dizeyi XQuanzhoucooway
kodlarsak, WFF1YW56aG91Y29vd2F5
tamamen farklı görünen çıktıyı alırız . Bu kez, giriş uzunluğu üçe bölünebilir, bu nedenle sonunda atılacak dolgu karakteri yoktur, ancak WF
her biri, bitlerin X
baytlarından bazılarını kodlayan ilk iki karakteri ( ) atmamız gerekir. F1YW56aG91Y29vd2F5
.
Son olarak, base64 kodlaması , her iki uçta dolguya sahip XXQuanzhoucooway
çıktıyı verir WFhRdWFuemhvdWNvb3dheQ==
. İlk üç karakteri WFh
( XX
öneki kodlayan ) ve son üç karakteri Q==
(sonunda sıfır bit dolguyu kodlayan ) kaldırarak, dizede kalırız RdWFuemhvdWNvb3dhe
. Böylece, aşağıdaki üç base64 kodlu dizeyi elde ederiz:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
(en azından) kelimesini içeren herhangi bir girdi dizesinin base64 kodlu biçiminde görünmelidir Quanzhoucooway
.
Şüphesiz, şanssızsanız, base64 kodlayıcı, kodlanmış herhangi iki üçlünün arasına bir satır sonu ekleyebilir. (Örneğin, örnek iletinizde F1YW56
ve arasında bir tane vardır aG91Y29vd2F5
.) Bu nedenle, bu dizeleri regexps ile güvenilir bir şekilde eşleştirmek için aşağıdakine benzer bir şeye ihtiyacınız vardır (PCRE sözdizimi kullanarak):
/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
Bu kalıpları elle oluşturmak biraz sıkıcıdır, ancak en azından bir base64 kodlayıcı sağladığı sürece, favori programlama dilinde yapmak için basit bir komut dosyası yazmak zor olmaz.
Gerçekten isterseniz, anahtar kelimenin hem küçük hem de büyük sürümünü kodlayan ve bunları herhangi bir kombinasyonla eşleşen bir normal ifade halinde birleştirerek base64 ile büyük / küçük harfe duyarlı olmayan eşleştirme uygulayabilirsiniz. Örneğin, base64 kodlayan quanzhoucooway
olan cXVhbnpob3Vjb293YXk=
bu ise QUANZHOUCOOWAY
bir UVVBTlpIT1VDT09XQVk=
kural böylece:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
bir üçlü sınırda başlaması koşuluyla, her durumda base64 kodlu kelimesi "Quanzhoucooway" ile eşleşecektir. Değiştirilen sürümler için karşılık gelen diğer iki normal ifadenin oluşturulması bir alıştırma olarak bırakılmıştır. ;)
Ne yazık ki, böyle basit alt dize eşleşmesinden daha karmaşık bir şey yapmak hızlı bir şekilde pratik olmaz. Ama en azından temiz bir numara. Prensip olarak, herhangi bir nedenle SpamAssassin veya base64 kodlamasını filtrelemeden önce kodunu çözebilecek başka bir filtre kullanamazsanız bile yararlı olabilir. Ancak bunu yapabiliyorsanız, bunun gibi hack'leri kullanmak yerine mutlaka yapmalısınız.