Skip to content

Latest commit

 

History

History
140 lines (105 loc) · 8.83 KB

deepsearch-analysis.md

File metadata and controls

140 lines (105 loc) · 8.83 KB

Анализ генератора своих стратегий (deepsearch)

  • Авторских стратегий в рантайме: 22 (ALT, ALT10, ALT11, ALT12, ALT13, ALT2, ALT3, ALT4, ALT5, ALT6, ALT7, ALT8, ALT9, Default, EXP, FAKE TLS AUTO, FAKE TLS AUTO ALT, FAKE TLS AUTO ALT2, FAKE TLS AUTO ALT3, SIMPLE FAKE, SIMPLE FAKE ALT, SIMPLE FAKE ALT2)
  • Баз для мутаций выбрано: 5 (ALT, ALT3, ALT9, SIMPLE FAKE, FAKE TLS AUTO)
  • Сгенерировано кандидатов: 60 (бюджет 60, seed 12345)

1. Ширина перебора

Ручка Значений Значения
method 4 multisplit, multidisorder, fake,multisplit, fake,multidisorder
pos 6 1, 2, 3, host+1, midsld, sniext+2
seqovl 5 1, 336, 568, 652, 681
repeats 5 2, 4, 6, 8, 11
fooling 5 ``, badseq, `badsum`, `md5sig`, `datanoack`
blob 3 tls_clienthello_www_google_com.bin, tls_clienthello_4pda_to.bin, tls_clienthello_max_ru.bin
urepeats 5 2, 4, 6, 8, 11
ufake 3 quic_initial_dbankcloud_ru.bin, quic_initial_www_google_com.bin, stun.bin
  • Одномерных мутаций (координатный проход): 36
  • Полное пространство TCP-комбинаций: 9000, с голосовыми: 135000
  • За один прогон проверяется 60 кандидатов = 0.04% от пространства

2. Пересечение с авторскими стратегиями

Кандидатов, побайтово совпавших с авторской стратегией: 5 из 60

  • Кандидат 3 == ALT (deepsearch(base=ALT))
  • Кандидат 15 == ALT3 (deepsearch(base=ALT3))
  • Кандидат 27 == ALT9 (deepsearch(base=ALT9))
  • Кандидат 39 == SIMPLE FAKE (deepsearch(base=SIMPLE FAKE))
  • Кандидат 51 == FAKE TLS AUTO (deepsearch(base=FAKE TLS AUTO))

Кандидатов, идентичных собственной базе (мутация «в себя»): 5

3. Что именно меняет мутация (значения по ручкам)

Ручка Кандидатов с изменением
repeats 49
urepeats 49
ufake 35
method 30
pos 30
seqovl 30
fooling 30
blob 30

4. Мутации, повторяющие значение базы (пустая работа)

Значения ручек, которые генератор НЕ умеет ставить, но они есть у авторских баз:

Ручка Есть в апстриме, нет в генераторе
method не покрыто: ['fake', 'fake,fakedsplit', 'fake,hostfakesplit', 'hostfakesplit', 'syndata', 'syndata,multidisorder']; наши лишние: ['multidisorder']
pos не покрыто: ['1,midsld', '2,sniext+1']; наши лишние: ['3', 'host+1', 'midsld', 'sniext+2']
seqovl не покрыто: ['480', '664', '679']; наши лишние: ['1', '336']
repeats не покрыто: ['10', '12', '14', '3', '5', '7']; наши лишние: ['2']
fooling не покрыто: ['ts', 'ts,md5sig']; наши лишние: ['', 'badsum', 'datanoack', 'md5sig']
blob не покрыто: ['{BIN}/stun2.bin']; наши лишние: —

5. Структурная независимость

  • Различных структур (каркасов) среди кандидатов: 15
  • Структур, унаследованных от баз: 5
  • Новых структур, которых нет ни у одной базы: 10
  • Структур у всех авторских стратегий: 20
  • Наши каркасы ⊆ авторские: False

6. Достижимость авторских наборов нашими мутациями

Авторские стратегии, до которых генератор дотягивается за ≤3 изменения от базы:

Апстрим Ближайшая база Изменений

7. Зависимость от данных автора

  • .bin, на которые ссылаются авторские стратегии: 10
  • .bin в bin/: 12; отсутствующих: 0
  • Блобы, которые генератор умеет подставлять: 6 (все — авторские файлы)
  • Все наши каркасы используют авторские списки ({LISTS}/list-general.txt и др.) и авторские порты/фильтры: False

8. Что будет, если авторских стратегий нет

Проверка на пустом рантайме (нет runtime/strategies.json):

load_strategies()            -> FileNotFoundError (strategies.py:121)
pick_bases(None)             -> падает на load_strategies() ещё до выбора баз
generate_candidates([], 120) -> 0 кандидатов, исключения нет
app._run_deep -> load_strategies()[0] -> FileNotFoundError / IndexError

В приложении это уйдёт в onError: Ошибка глубокого поиска: .... Своего стартового набора стратегий, независимого от апстрима, у FreeConnect нет.

8.1 Бесполезная работа генератора

  • Кандидаты, байт-в-байт равные своей базе: 5 из 60 (при бюджете приложения 120 — 20).
  • repeats и urepeats пишут один и тот же ключ --dpi-desync-repeats; в случайных комбинациях в голосовой секции побеждает последний в словаре (repeats), поэтому голосовой repeats совпадает с TCP в 10 из 60 кандидатов — независимого варьирования голоса нет.
  • Для 4 из 5 баз ручки pos/seqovl/blob не мутируют существующий параметр, а добавляют новый приём в стратегию, где его не было.

9. Кто и как вызывает генератор

  • freeconnect/app.py:1646: def start_deep_search(self) -> None:
  • freeconnect/app.py:1771: results = deepsearch.deep_search(
  • Бюджет в реальном вызове — 120 кандидатов, min_all=5; база — текущая стратегия → лучшая рабочая → ALT → первая встроенная (app.py:1729-1733).

10. Состав кандидатов при бюджете приложения (120)

Изменено ручек Кандидатов Что это
0 5 кандидат == база, пустая трата прогона
1 35 осмысленная одномерная проба
2 20 случайная комбинация
6 2 случайная комбинация — 6 ручек сразу, «шум»
7 4 случайная комбинация — 7 ручек сразу, «шум»
8 54 случайная комбинация — 8 ручек сразу, «шум»

Итого: одномерных проб — 35 из 120 (29%), комбинаций с 5+ ручками сразу — 60 (50%), пустых (== база) — 5.

Всего ручек у генератора: 8 (6 TCP + 2 голосовые).

11. Координатный проход урезается квотой базы

Код (deepsearch.generate_candidates): per_base = max(6, budget // len(bases)), из них rand_quota = max(2, per_base // 2) уходит под случайные комбинации, остальное — под координатный проход по ручкам. При бюджете приложения 120 и 5 базах это per_base = 24, coord_quota = 12, хотя полный координатный проход требует 36 проб на базу.

Порядок словаря ручек: urepeats, ufake, method, pos, seqovl, repeats, fooling, blob. Первые 12 проб покрывают голос и method/pos/seqovl, а ручки repeats, fooling и blob в координатном проходе не проверяются вообще — только внутри случайных комбинаций, где они меняются одновременно со всеми остальными.