diff --git a/docs/manual.md b/docs/manual.md index 027a88f..305e190 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1683,3 +1683,41 @@ function rawsend_dissect(dissect, rawsend_opts, reconstruct_opts) * rawsend работает с raw строкой, содержащий полностью собранный ipv4 или ipv6 пакет * rawsend_dissect собирает пакет из диссекта и отправляет * dissect представляет собой таблицу, описанную в соответствующем разделе + + +### Работа с пейлоадами + +Следующие функции позволяют искать по маркерам байтовые позиции внутри пейлоадов. + +* **Абсолютный положительный маркер** - числовое смещение внутри пейлоада. +* **Абсолютный отрицательный маркер** - числовое смещение внутри пейлоада от следующего за концом байта. -1 указывает на последний байт. +* **Относительный маркер** - положительное или отрицательное смещение относительно логической позиции внутри пейлоада. + +Относительные позиции : + +* **method** - начало метода HTTP ('GET', 'POST', 'HEAD', ...). Метод обычно всегда находится на позиции 0, но может сместиться из-за methodeol. Тогда позиция может стать 1 или 2. +* **host** - начало имени хоста +* **endhost** - байт, следующий за последним байтом имени хоста +* **sld** - начало домена 2 уровня в имени хоста +* **endsld** - байт, следующий за последним байтом домена 2 уровня в имени хоста +* **midsld** - середина домена 2 уровня в имени хоста +* **sniext** - начало поля данных SNI extension в TLS. Любой extension состоит из 2-байтовых полей type и length, за ними идет поле данных. +* **extlen** - поле длины TLS extensions + +Относительные маркеры работают с логическими элементами отдельных известных пейлоадов, поэтому они не будут работать с чем попало. + +Пример списка маркеров : `100,midsld,sniext+1,endhost-2,-10`. + +Задача следующих функций - преобразовать маркеры в абсолютные позиции. + +``` +function resolve_pos(blob,l7payload_type,marker[,zero_based_pos]) +function resolve_multi_pos(blob,l7payload_type,marker_list[,zero_based_pos]) +function resolve_range(blob,l7payload_type,marker_list[,strict,zero_based_pos]) +``` + +* resolve_pos работает с единственным маркером. если маркер не ресолвится, возвращается nil. +* resolve_multi_pos работает со списком маркеров через запятую. возвращает массив уникальных абсолютных позиций. если некоторые маркеры не ресолвятся - их не будет в результате. +* resolve_range ресолвит список из ровно 2 маркеров, представляющих собой диапазон внутри пейлоада. Если strict = true, и любой маркер не ресолвится, возвращается nil. Иначе если первый маркер не ресолвится - он заменяется на 0. Если не ресолвится второй маркер - он заменяется на длину пейлоада. Если не ресолвятся оба - возвращается nil. +* если задано zero_based_pos=true, все позиции начинаются с 0, иначе с 1, как это принято в LUA. +* при невалидных значениях l7payload_type, marker, marker_list, если количество маркеров не равно 2 для resolve_range - вызывается error