Технічно ви можете безпосередньо фільтрувати базові кодовані дані за ключовими словами. Я не кажу , що це непрактично або розумне , що потрібно зробити, з огляду на наявність більш досконалих і простих альтернатив (як описано , наприклад , у відповідь ЕКА вище), але це можливо.
Трюк полягає в усвідомленні того, що кодування base64 - це детерміноване відображення 3-байтових блоків необроблених некодованих даних у 4-символьні блоки базових64 символів. Таким чином, щоразу, коли певна послідовність 3-байтових блоків з’являється у незашифрованих даних, однакова послідовність 4-символьних блоків з’явиться у кодованій версії.
Наприклад, якщо ви введете рядок Quanzhoucooway
у базовий кодер64 , ви отримаєте вихід UXVhbnpob3Vjb293YXk=
. Оскільки довжина вводу не кратна 3-х байтам, то висновок містить деяку підкладку в кінці, але якщо ми відкинемо остаточні =
знаки та останній фактичний символ6464 k
(оскільки він також кодує деякі накладки), отримаємо рядок UXVhbnpob3Vjb293YX
який гарантовано з'являються в даних в кодуванні base64 щоразу , коли байт триплети Qua
, nzh
, ouc
, oow
і парціальний триплет ay
з'являються на вході в зазначеному порядку.
Але, звичайно, рядок Quanzhoucooway
може не починатися точно на межі триплетів. Наприклад, якщо XQuanzhoucooway
замість цього зашифрувати рядок , отримаємо результат WFF1YW56aG91Y29vd2F5
, який виглядає зовсім інакше. Цього разу довжина вводу ділиться на три, тому немає вкладених символів, які слід відкинути в кінці, але нам потрібно відкинути перші два символи ( WF
), які кодують кожен з бітів від попередньо заданого X
байта, залишаючи нас F1YW56aG91Y29vd2F5
.
Нарешті, кодування base64 XXQuanzhoucooway
дає вихід WFhRdWFuemhvdWNvb3dheQ==
, який має набивання на обох кінцях. Видаляючи перші три символи WFh
(які кодують XX
префікс) і три останні символи Q==
(які кодують нульовий біт прокладки в кінці), нам залишається рядок RdWFuemhvdWNvb3dhe
. Таким чином, ми отримуємо наступні три рядки, кодовані base64:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
з яких (щонайменше) один повинен з’являтися у закодованій формі base64 будь-якого вхідного рядка, що містить слово Quanzhoucooway
.
Звичайно, якщо вам не пощастить, ендедер base64 може вставити між ними розрив рядка між будь-якими двома кодованими трійками. (Наприклад, у вашому прикладі повідомлення є одне між F1YW56
і aG91Y29vd2F5
.) Таким чином, щоб надійно збігати ці рядки з регулярними виразами, вам знадобиться щось на кшталт наступного (використовуючи синтаксис 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
Створення цих шаблонів вручну - це досить виснажливе, але не важко буде написати простий скрипт, щоб зробити це улюбленою мовою програмування, принаймні до тих пір, поки він пропонує базовий кодер.
Якщо ви дійсно хотіли, ви навіть можете реалізувати збіг, що не враховує регістр, використовуючи base64, кодуючи і малу, і велику версію ключового слова, і комбінуючи їх у регулярний вираз, який відповідає будь-якій їх комбінації. Наприклад, кодування base64 quanzhoucooway
є тим cXVhbnpob3Vjb293YXk=
, що QUANZHOUCOOWAY
є UVVBTlpIT1VDT09XQVk=
, тому правило:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
у будь-якому випадку буде відповідати закодованому слову base64 "Quanzhoucooway", за умови, що воно починається на межі триплетів. Створення інших двох відповідних регулярних виразів для зміщених версій залишається вправою. ;)
На жаль, робити щось складніше, ніж просте узгодження підрядків, як це, швидко стає непрактичним. Але принаймні це акуратний трюк. В принципі, це може бути навіть корисним, якщо ви з якихось причин не зможете використовувати SpamAssassin або будь-який інший фільтр, який може декодувати кодування base64 перед фільтруванням. Але якщо ви можете це зробити, а не використовувати хаки, як це, ви, звичайно, повинні.