Commit Graph

66 Commits

Author SHA1 Message Date
ValdikSS
ecc681a60b OpenVPN detection & fragmentation/fake packet support 2022-07-21 15:16:29 +03:00
ValdikSS
4f18a73239 Print correct set-ttl/auto-ttl mode in the status 2022-03-31 12:15:40 +03:00
ValdikSS
67629fb6ef Disable auto-ttl if set-ttl has been used after auto-ttl 2022-03-31 12:14:03 +03:00
ValdikSS
27a6d256f0 Handle HTTP GET and POST in packets larger than --max-payload
If --max-payload 1200 is used and there's HTTP request with lots of cookies
which exceed 1200 bytes in size, this packet would have been skipped as
'too large', and the circumvention won't be applied.
Fix this by checking for "GET " or "POST" in the beginning of the packet
regardless of its size.
2022-03-21 15:17:27 +03:00
ValdikSS
938dce7333 Merge branch 'windivert2' 2022-03-21 15:06:15 +03:00
ValdikSS
99c403ca62 GoodbyeDPI v0.2.2 2022-03-21 14:12:36 +03:00
ValdikSS
6ee4101f58 Fix --set-ttl when used with --min-ttl 2022-03-21 14:08:02 +03:00
ValdikSS
55a3a94065 Handle "0" in domain names 2022-03-06 00:22:22 +03:00
ValdikSS
8383ecaadf Change argument order for calloc() 2022-02-18 11:05:44 +07:00
ValdikSS
8deacbc438 Allocate (argc + 1) for the service arguments, with calloc
It was assumed that getopt checks argc count and does not require
null-terminated argv pointer to determine argv end for optional
parameter.
That is wrong.
Add null-terminated latest argv.

Fixes #246
2022-02-18 02:41:03 +07:00
ValdikSS
1cfd2b1b9f Allow to set --max-payload to zero 2022-01-10 08:32:10 +03:00
ValdikSS
871670845f Document forgotten --max-payload in -5 and -6 modes (v0.2.0+) 2022-01-04 15:40:21 +03:00
ValdikSS
4a8f7ac4fb Call WinDivertShutdown on shutdown 2022-01-04 03:14:47 +03:00
ValdikSS
ee4ce8893c Initial support for WinDivert 2.0+
This patch adds WinDivert 2.0+ support in a backward-incompatible way.
WinDivert 1.4 won't work after this commit anymore.
2022-01-03 21:23:40 +03:00
ValdikSS
406cf2ca68 GoodbyeDPI v0.2.1 2021-12-30 21:14:23 +03:00
ValdikSS
277b1fb4ef SNI extraction bugfix: add forgotten hyphen as an allowed domain character
This fixes --allow-no-sni option for domains with hyphen.
2021-12-30 19:16:43 +03:00
ValdikSS
5494be72ba GoodbyeDPI v0.2.0 2021-12-30 03:46:51 +03:00
ValdikSS
c92cd77c51 Ensure the resource file to be compiled before linking 2021-12-30 03:45:20 +03:00
ValdikSS
f97a2d04f0 Use --max-payload-size=1200 for -5 and -6 modes. 2021-12-30 03:44:37 +03:00
ValdikSS
d7c681d1a2 Add Max Payload Size limit option (--max-payload-size)
This option excludes TCP packets with the data payload larger than
defined value from being copied by WinDivert driver to GoodbyeDPI.

As most of HTTP and TLS ClientHello packets are repatively small,
and file transfers are usually big and are sent/received using
the whole available MTU/MSS, we can just exclude them from
being processed by our userspace program to reduce unnecessary
CPU load.
2021-12-30 03:41:12 +03:00
ValdikSS
cc1676ad92 --allow-no-sni option. Useful with --blacklist and undetectable SNI.
This option is added specially for protonmail.com, as it sends
low Window Size in SYN-ACK for requests from Russia, to force
the client to fragment the packet. GoodbyeDPI doesn't do reassembling
and can't extract SNI in this case, thus won't circumvent the
censorship if --blacklist option is used.
2021-12-29 16:18:56 +03:00
ValdikSS
7f59593a28 Check TLS Handshake ClientHello byte if packet length is enough 2021-12-29 16:14:12 +03:00
ValdikSS
372cc6a45d Properly handle Native Fragmentation packet of bigger or equal size than the fragment size 2021-12-29 16:10:18 +03:00
ValdikSS
46c4f36de8 Add Fake Packet maximum TTL limit to Auto TTL mode
This patchset adds maximum TTL size of the fake packet to be sent,
to further  improve compatibility with asymmertic routing and
non-standard TTL value set on servers.
2021-12-29 02:05:39 +03:00
ValdikSS
8911e459d8 Exit when native fragmentation is enabled but http/https values are not set 2021-12-28 23:48:57 +03:00
ValdikSS
f4edcf7b4f Small text output enhancements 2021-12-28 23:48:57 +03:00
ValdikSS
bb8bafb663 Add Auto TTL range adjustment, introduce min-ttl and use it for --set-ttl as well. 2021-12-28 23:48:57 +03:00
ValdikSS
e25d7432de Better Auto TTL adjusting algorithm which honors short distance
Say you set --auto-ttl to 4.
If the TTL distance to the destination host is too short, say 6, auto-ttl
would decrease it by 4 and send a fake packet with TTL 2, which is too low
for the packet to travel via DPI system.
But if you set --auto-ttl to a lower value such as 2, that may introduce
issues over long lines where outgoing-path TTL and incoming-path TTL may have
difference more than 2 hops due to higher chance of assymetric routing along
the path.

To solve this issue, this commit introduce auto-ttl range of two values.
If the incoming TTL distance is more than autottl2, it is subtracted by
autottl2 value.
If the distance is less than autottl2, the distance value is used as a
normalized weigth of [autottl1; autottl2] scale.

The simplified formula is as follows:

    128 > extracted_ttl > 98: // Server is running Windows
      nhops = 128 - extracted_ttl
    64 > extracted_ttl > 34: // Server is running Linux/FreeBSD/other
      nhops = 64 - extracted_ttl

    if (nhops - autottl2 < autottl2)
        ttl_of_fake_packet = nhops - autottl1 - trunc((autottl2 - autottl1) * ((float)nhops/10));
    else
        ttl_of_fake_packet = nhops - autottl2
2021-12-28 22:28:55 +03:00
ValdikSS
b1273c8e10 Update Makefile, add more warning options 2021-12-28 00:31:54 +03:00
ValdikSS
67c226dc7c Fix all types and warnings 2021-12-28 00:31:47 +03:00
ValdikSS
46219e95e7 Update uthash to 2.3.0 2021-12-27 06:58:20 +03:00
ValdikSS
6eec99e874 GoodbyeDPI v0.1.8 2021-12-26 20:29:24 +03:00
ValdikSS
d61a9f8022 Handle only (default_ttl - 30) range in Auto TTL 2021-12-26 19:05:03 +03:00
ValdikSS
fc15088c33 Fix spelling 2021-12-26 18:42:26 +03:00
ValdikSS
1ea70f9bc9 Do not print "Error receiving packet!" upon exiting 2021-12-26 18:39:44 +03:00
ValdikSS
ed42c5d627 Fix all the warnings and notes 2021-12-26 17:45:37 +03:00
ValdikSS
9fcf097cb7 Use Auto TTL = 4 by default
Previous value of 2 caused issues with the services connected via
very different uplink/downlink routing links.
2021-12-25 20:43:56 +03:00
ValdikSS
e1e09f9103 Add safekeeping TTL value for Auto TTL 2021-12-25 13:56:57 +03:00
ValdikSS
a5c2f9fac9 Introduce -5 and -6 modes and make -5 default
Modern modesets (more stable, more compatible, faster):
 -5          -f 2 -e 2 --auto-ttl --reverse-frag (this is the default now)
 -6          -f 2 -e 2 --wrong-seq --reverse-frag
2021-12-25 13:56:57 +03:00
ValdikSS
11c322aaed Show fragmentation value issues only when Window Size is used 2021-12-25 13:07:39 +03:00
ValdikSS
88d4a60cdf Merge branch 'badseq_for_master' into master 2021-12-25 12:30:08 +03:00
ValdikSS
b45b463d51 Update readme 2021-12-25 12:24:25 +03:00
ValdikSS
80fcd9c5cf Replace required/optional brackets in the readme 2021-12-25 12:24:25 +03:00
ValdikSS
21ff80b43c Automatic TTL value picker for --set-ttl Fake Packet mode
This is a per-connection (per-destination) automatic TTL adjusting feature.
Basically a --set-ttl mode where you don't need to set specific TTL value.

It works as follows:
 1. All incoming SYN/ACKs (the response to client's SYN) are intercepted
 2. TTL value is extracted from SYN/ACK
 3. New TTL is calculated with the simple formula:
    128 > extracted_ttl > 64: // Server is running Windows
      fakepacket_ttl = 128 - extracted_ttl - decrement
    64 > extracted_ttl > 34: // Server is running Linux/FreeBSD/other
      fakepacket_ttl = 64 - extracted_ttl - decrement
 4. Fake packet is sent

To comply with the multi-path multi-hop server connections
where 1 hop dispersion is not rare, decrement should be at least of
value "2", which is the default.

The patch does not process "too strange" TTL values (bigger than 128,
less than 34).
2021-12-25 12:24:25 +03:00
ValdikSS
bbb6af89fe New Fake Packet circumvention method: wrong SEQ/ACK numbers
This method sends Fake Packet with the TCP SEQ/ACK numbers "in the past":
-66000 is used for ACK (right out of the ACK permissive window in Linux stack),
-10000 is used for SEQ (without any reasoning).

This method is pretty effective in Russia.
It also could be handy in a networks which prohibit changing TTL values
(mobile networks with tethering block/premium feature).
2021-12-25 11:55:26 +03:00
ValdikSS
b57a204d96 Apply each Fake Packet method to each packet separately
Before: --set-ttl and --wrong-chksum generated single Fake Packet with both low TTL and incorrect checksum.
Now:    --set-ttl and --wrong-chksum generate two packets: one with low TTL, another with incorrect checksum.
2021-12-25 10:49:26 +03:00
ValdikSS
3899a719c1 Update Makefile, make fortify work on modern mingw compilers 2021-12-25 10:24:43 +03:00
ValdikSS
b9682ac222 Print parsed hostnames in DEBUG mode 2021-12-25 10:24:43 +03:00
ValdikSS
35c6e401db Handle TLS SNI in blacklist option
Now blacklist applies not only to HTTP websites, but also to HTTPS.

Fixes #213
2021-12-25 10:23:43 +03:00
ValdikSS
cf7d1c69e0 Add TLS Server Name Indication (SNI) extractor 2021-12-25 10:09:37 +03:00