Implementation of some DPI bypass methods. The program is a local SOCKS proxy server.
Go to file
2024-04-04 23:23:46 +03:00
conev.c Auto mode 2024-03-08 03:37:02 +03:00
conev.h Remove --redirect, fix mem_delete 2024-03-12 02:53:57 +03:00
desync.c get addr for md5sig with getpeername 2024-03-28 23:28:09 +03:00
desync.h wait_send after split, oob, etc; handle different send ret 2024-03-21 21:44:17 +03:00
error.h Handle only conn reset 2024-03-08 04:48:35 +03:00
main.c move detect to auto 2024-04-04 04:19:40 +03:00
Makefile --fake on Windows 2024-03-18 02:23:10 +03:00
mpool.c fix mem_destroy 2024-03-26 23:49:52 +03:00
mpool.h clear params before exit, update readme.txt 2024-03-26 22:43:41 +03:00
packets.c replace --tr with --detect 2024-04-03 22:51:02 +03:00
packets.h replace --tr with --detect 2024-04-03 22:51:02 +03:00
params.h move detect to auto 2024-04-04 04:19:40 +03:00
proxy.c move detect to auto 2024-04-04 04:19:40 +03:00
proxy.h replace --tr with --detect 2024-04-03 22:51:02 +03:00
readme.txt Update readme.txt 2024-04-04 23:23:46 +03:00

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Реализация некоторых способов запутывания DPI.
Программа представляет собой локальный SOCKS прокси сервер.

--------------
Использование:
$ ./ciadpi --disorder 3 -A --tlsrec 1+s

Описание аргументов:
-i, --ip <ip>
    Прослушиваемый IP, по умолчанию 0.0.0.0

-p, --port <num>
    Прослушиваемый порт, по умолчанию 1080

-c, --max-conn <count>
    Максимальное количество клиентских подключений, по умолчанию 512

-I  --conn-ip <ip>
    Адрес, к которому будут привязаны исходящие соединения, по умолчанию ::
    При указании IPv4 адреса запросы на IPv6 будут отклоняться

-b, --buf-size <size>
    Максимальный размер данных, получаемых и отправляемых за один вызов recv/send
    Размер указывается в байтах, по умолчанию равен 16384

-g, --def-ttl <num>
    Значение TTL для всех исходящий соединений
    Может быть полезен для обхода обнаружения нестандартного/уменьшенного TTL

-N, --no-domain
    Отбрасывать запросы, если в качестве адреса указан домен
    Т.к. резолвинг выполняется синхронно, то он может замедлить или даже заморозить работу

-K, --desync-known
    Отключить запутывание для нераспознанных протоколов
    Распознаваемые протоколы: HTTP и TLS с SNI

-F, --tfo
    Включает TCP Fast Open
    Если сервер его поддерживает, то первый пакет будет отправлен сразу вместе с SYN
    Поддерживается только в Linux (4.11+)
    
-A, --auto[=t,r,c,s,a]
    Автоматический режим
    Если произошло событие, похожее на блокировку или поломку,
    то будут применены параметры обхода, следующие за данной опцией
    Возможные события:
        torst   : Вышло время ожидания или сервер сбросил подключение после первого запроса
        redirect: HTTP Redirect с Location, домен которого не совпадает с исходящим
        cl_err  : HTTP ответ, код которого равен 40x, но не 429
        sid_inv : session_id в TLS ServerHello и ClientHello не совпадают
        alert   : TLS Error Alert в ответе
    По умолчанию обрабатывается только torst
    Можно указывать несколько групп опций, раделяя их данным параметром
    Если соединение успешно прошло, то параметры для данного IP будут закешированны
    Параметры, которые можно вынести в отдельную группу: 
    split, disorder, oob, fake, ttl, ip-opt, md5sig, mod-http, tlsrec
    Пример: 
    --auto=redirect --split=1+h --auto=torst --fake -1 --auto=sid_inv,alert --tlsrec 1+s
    
-u, --cache-ttl <sec>
    Время жизни значения в кеше, по умолчанию 100800 (28 часов)
    
-T, --timeout <sec>
    Таймаут ожидания первого ответа от сервера в секундах
    В Linux переводится в миллисекунды, поэтому можно указать дробное число
    Истечение таймаута будет обработано --auto
    
-s, --split <n[+s]>
    Разбить запрос по указанному смещению
    После числа можно добавить флаг:
        +s: добавить смещение SNI
        +h: добавить смещение Host
    Можно указывать несколько раз, чтобы разбить запрос по нескольким позициям
    При указании отрицательного значения к нему прибавляется размер пакета
    
-d, --disorder <n[+s]>
    Подобен --split, но части отправляются в обратном порядке
    ! Поведение в Windows отлично: сначала отправляется лишь часть, но затем целый запрос
    
-o, --oob <n[+s]>
    Подобен --split, но после части отсылается один или несколько байт OOB данных
    
-f, --fake <n[+s]>
    Подобен --disorder, только перед отправкой первого куска отправляется часть поддельного
    Количество байт отправляемого из фейка равно рамеру разбиваемой части
 
-t, --ttl <num>
    TTL для поддельного пакета, по умолчанию 8
    Необходимо подобрать такое значение, чтобы пакет не дошел до сервера, но был обработан DPI

-k, --ip-opt [file|:str]
    Установить опции для фейкового IP пакета
    Существенно снизит вероятность, что пакет дойдет до сервера
    Стоит учесть, что до DPI он также может не дойти
    В Windows поддержка может быть отключена
    
-S, --md5sig
    Установить опцию TCP MD5 Signature для фейкового пакета
    Большинство серверов (в основном на Linux) отбрасывают пакеты с данной опцией
    Поддерживается только в Linux, может быть выключен в некоторых сборках ядра (< 3.9, Android)
    
-l, --fake-tls <file|:str>
-j, --fake-http <file|:str>
    Указать свои поддельные пакеты, вместо дефолтных

-e, --oob-data <file|:str>
    Данные, отсылаемые вне основного потока, по умолчанию один байт 'a'
    ! При размере более одного байта может работать нестабильно
    
-n, --tls-sni <str>
    Изменить SNI в fake пакете на указанный

-M, --mod-http <h[,d,r]>
    Всякие манипуляции с HTTP пакетом, можно комбинировать
    hcsmix:
        "Host: name" -> "hOsT: name"
    dcsmix:
        "Host: name" -> "Host: NaMe"
    rmspace:
        "Host: name" -> "Host:name\t"

-r, --tlsrec <n[+s]>
    Разделить ClientHello на отдельные записи по указанному смещению
    Можно указывать несколько раз
    
-------
Сборка:
Для сборки понадобится: 
make, gcc/clang для Linux, mingw для Windows

# Linux
$ make
# Windows
$ make windows CC=x86_64-w64-mingw32-gcc

-----------------
Как это работает?
Подробно описано тут:
https://github.com/bol-van/zapret/blob/master/docs/readme.txt
https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf
https://habr.com/ru/post/335436