Vladimir Prus wrote:
Мне почему-то кажется, что задача не разрешима в принципе. Если у тебя есть критерий сравнения двух строк на похожесть, то с большой вероятностью этот критерий использует все символы исходных строк. Ты пытаешься заменить строку на хеш ограниченного размера, и при этом теряешь часть данных. Если изменение в одной букве может изменить результат исходного алгоритма с "похоже" на "не похоже", то сравнение хешей уже не даст правильный результат.
От алгоритма не требуется дать бинарный результат "похоже"/"непохоже". Допустим, хэшем будет некоторый числовой вектор. Я тогда смогу ввести эффективно вычислимую меру и вычислять расстояние между конечными векторами, а не по исходным строкам (очень медленно). Вопрос похожести будет зависеть от внешнего критерия.
Идея вот в чём: в проекте "Невод" мы строили параметрическое пространство, в которое проецировали сетевые сессии. При этом пространство строилось на основе довольно грубых статистик типа количества переданных байт в сессии на текущий момент. Были и более точные - перечислимые типы для полей сетевых пакетов фиксированного размера (флаги). Но сегмент данных фактически никак не учитывался, кроме как в статистике объёмов трафика. Хочется эти данные научиться скармливать нейросети. Сегмент данных можно представить в виде байтовой строки и сравнивать два сегмента между собой как строки. При этом если в данных содержится ассемблерный код использования какого-нибудь переполнения буффера, этот код для каждой уязвимости будет содержать похожие участки (шеллкод + заполнитель). Таким образом, если две сессии "похожи" в смысле уже используемых статистик трафика, то наличие общих подстрок в сегменте данных только увеличит похожесть. Естественно, всякие вещи типа кодирования на уровне представления (тот же BASE64) портят исходные данные приложений, поэтому перед сравнением данные нужно нормализовать - привести в тот вид, в каком они попадают в целевое приложение.
Может, кто-нибудь слышал об использовании нейросетей для распознавания/анализа текстов?
Денис.