mirror of
https://github.com/ValdikSS/GoodbyeDPI.git
synced 2025-12-17 12:54:36 +03:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
754ff6ff06 | ||
|
|
3114036d09 | ||
|
|
ae7398035a | ||
|
|
ee009cf107 | ||
|
|
810aef6aed | ||
|
|
c0f43a293e | ||
|
|
03cb084f10 | ||
|
|
abd2e77ca4 | ||
|
|
d2265d3167 | ||
|
|
4fbfeb8956 | ||
|
|
207a2f7004 | ||
|
|
311b26e744 | ||
|
|
e344f5711c | ||
|
|
14fb025468 | ||
|
|
a95fe3ebff | ||
|
|
8a0bef08bf | ||
|
|
cb9cc82fde |
41
.github/ISSUE_TEMPLATE/bug.yml
vendored
41
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -1,28 +1,17 @@
|
|||||||
name: Bug Report / Сообщение об ошибке
|
name: The program crashes, hangs, certain function does not work / Программа падает, зависает, отдельная функция не работает
|
||||||
description: File a bug report / Сообщить об ошибке в программе
|
description: File a bug report / Сообщить об ошибке в программе
|
||||||
|
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
### USE THIS FORM ONLY FOR BUGS! The webside does not open? That's likely NOT a bug, do NOT report it here!
|
### Carefully read all the text IN FULL. Take this seriously.
|
||||||
### USE THIS FORM ONLY FOR BUGS! The webside does not open? That's likely NOT a bug, do NOT report it here!
|
### Use this form only for software bug reports! The website does not open? That's likely NOT a bug, do NOT report it here! You have a question regarding the program? That's not a bug either!
|
||||||
### USE THIS FORM ONLY FOR BUGS! The webside does not open? That's likely NOT a bug, do NOT report it here!
|
#### If in doubt, [use NTC.party forum](https://ntc.party/c/community-software/goodbyedpi).
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
### Внимательно прочитайте ВЕСЬ текст ниже. Отнеситесь к этому со всей ответственностью.
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
### Используйте эту форму только для сообщений об ошибках в программе! Неоткрывающиеся сайты таковыми не являются, вопросы по программе к ошибкам не относятся.
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
#### Если у вас есть сомнения, [воспользуйтесь форумом NTC.party](https://ntc.party/c/community-software/goodbyedpi).
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
### ИСПОЛЬЗУЙТЕ ЭТУ ФОРМУ ТОЛЬКО ДЛЯ БАГОВ! Веб-сайт не открывается? Это, скорее всего, не баг, не сообщайте сюда, ВЫ БУДЕТЕ ЗАБАНЕНЫ!
|
|
||||||
|
|
||||||
GoodbyeDPI does not guarantee to work with your ISP for every blocked website or at all. If GoodbyeDPI can't unblock some or any websites, this is most likely not a software bug, and you should not report it here.
|
GoodbyeDPI does not guarantee to work with your ISP for every blocked website or at all. If GoodbyeDPI can't unblock some or any websites, this is most likely not a software bug, and you should not report it here.
|
||||||
|
|
||||||
Please only report software bugs, such as:
|
Please only report software bugs, such as:
|
||||||
@@ -30,7 +19,8 @@ body:
|
|||||||
* incorrect network packet handling
|
* incorrect network packet handling
|
||||||
* antivirus incompatibility
|
* antivirus incompatibility
|
||||||
* DNS redirection problems
|
* DNS redirection problems
|
||||||
* other software
|
* memory leaks
|
||||||
|
* other software issues
|
||||||
|
|
||||||
Please make sure to check other opened and closed issues, it could be your bug has been reported already.
|
Please make sure to check other opened and closed issues, it could be your bug has been reported already.
|
||||||
For questions, or if in doubt, [use NTC.party forum](https://ntc.party/c/community-software/goodbyedpi).
|
For questions, or if in doubt, [use NTC.party forum](https://ntc.party/c/community-software/goodbyedpi).
|
||||||
@@ -43,10 +33,21 @@ body:
|
|||||||
* некорректная обработка сетевых пакетов
|
* некорректная обработка сетевых пакетов
|
||||||
* несовместимость с антивирусами
|
* несовместимость с антивирусами
|
||||||
* проблемы с перенаправлением DNS
|
* проблемы с перенаправлением DNS
|
||||||
|
* утечки памяти
|
||||||
* другие ошибки в программе
|
* другие ошибки в программе
|
||||||
|
|
||||||
Также посмотрите другие открытые и закрытые баги. Возможно, ошибка уже обсуждалась или исправлена.
|
Также посмотрите другие открытые и закрытые баги. Возможно, ошибка уже обсуждалась или исправлена.
|
||||||
Для вопросов, а также в случае сомнений в определении бага, обращайтесь [на форум NTC.party](https://ntc.party/c/community-software/goodbyedpi).
|
Для вопросов, а также в случае сомнений в определении бага, обращайтесь [на форум NTC.party](https://ntc.party/c/community-software/goodbyedpi).
|
||||||
|
- type: checkboxes
|
||||||
|
id: terms
|
||||||
|
attributes:
|
||||||
|
label: CAPTCHA
|
||||||
|
description: Confirm that you have read the text above / Подтвердите, что вы прочитали текст выше
|
||||||
|
options:
|
||||||
|
- label: I understand I could be banned from the repository if I misusing issue section not for posting bugs, but for question or 'broken website' report. / Я понимаю, что меня могут заблокировать в репозитории, если я буду использовать раздел issue не для сообщений об ошибках, а для вопросов или сообщении о «неработающем веб-сайте».
|
||||||
|
required: true
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: os
|
id: os
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/config.yml
vendored
8
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,13 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
|
- name: The program worked yesterday but not today / Программа работала вчера, но перестала работать сегодня
|
||||||
|
url: https://ntc.party/c/community-software/goodbyedpi/8
|
||||||
|
about: Visit support community forum, people will certainly help you! / Посетите форум поддержки, где сообщество вам поможет!
|
||||||
|
|
||||||
|
- name: Сertain website is still unreachable / Отдельный веб-сайт всё ещё недоступен
|
||||||
|
url: https://ntc.party/c/community-software/goodbyedpi/8
|
||||||
|
about: That could be solved with community support! / Проблема будет решена силами сообщества!
|
||||||
|
|
||||||
- name: Questions about the program / Вопросы по програме
|
- name: Questions about the program / Вопросы по програме
|
||||||
url: https://ntc.party/c/community-software/goodbyedpi/8
|
url: https://ntc.party/c/community-software/goodbyedpi/8
|
||||||
about: Please ask and answer questions on forum / Пожалуйста, задавайте вопросы только на форуме
|
about: Please ask and answer questions on forum / Пожалуйста, задавайте вопросы только на форуме
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/feature.yml
vendored
2
.github/ISSUE_TEMPLATE/feature.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Feature request / Предложить новую функциональность
|
name: Feature request / Предложить новую функциональность
|
||||||
description: Suggest an idea or function for this project / Предложить новую идею или функциональность в программе
|
description: Suggest an idea or function for this project / Предложить новую идею или функциональность в программе
|
||||||
|
|
||||||
body:
|
body:
|
||||||
|
|||||||
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.o
|
||||||
|
*.exe
|
||||||
14
README.md
14
README.md
@@ -19,6 +19,8 @@ If it works — congratulations! You can use it as-is or configure further.
|
|||||||
|
|
||||||
Download [latest version from Releases page](https://github.com/ValdikSS/GoodbyeDPI/releases) and run.
|
Download [latest version from Releases page](https://github.com/ValdikSS/GoodbyeDPI/releases) and run.
|
||||||
|
|
||||||
|
## Supported arguments
|
||||||
|
To get relevant information about your version of the program, use the -h (--help) argument at startup.
|
||||||
```
|
```
|
||||||
Usage: goodbyedpi.exe [OPTION...]
|
Usage: goodbyedpi.exe [OPTION...]
|
||||||
-p block passive DPI
|
-p block passive DPI
|
||||||
@@ -67,6 +69,10 @@ Usage: goodbyedpi.exe [OPTION...]
|
|||||||
--fake-from-hex <value> Load fake packets for Fake Request Mode from HEX values (like 1234abcDEF).
|
--fake-from-hex <value> Load fake packets for Fake Request Mode from HEX values (like 1234abcDEF).
|
||||||
This option can be supplied multiple times, in this case each fake packet
|
This option can be supplied multiple times, in this case each fake packet
|
||||||
would be sent on every request in the command line argument order.
|
would be sent on every request in the command line argument order.
|
||||||
|
--fake-with-sni <value> Generate fake packets for Fake Request Mode with given SNI domain name.
|
||||||
|
The packets mimic Mozilla Firefox 130 TLS ClientHello packet
|
||||||
|
(with random generated fake SessionID, key shares and ECH grease).
|
||||||
|
Can be supplied multiple times for multiple fake packets.
|
||||||
--fake-gen <value> Generate random-filled fake packets for Fake Request Mode, value of them
|
--fake-gen <value> Generate random-filled fake packets for Fake Request Mode, value of them
|
||||||
(up to 30).
|
(up to 30).
|
||||||
--fake-resend <value> Send each fake packet value number of times.
|
--fake-resend <value> Send each fake packet value number of times.
|
||||||
@@ -93,7 +99,7 @@ Modern modesets (more stable, more compatible, faster):
|
|||||||
|
|
||||||
Note: combination of --wrong-seq and --wrong-chksum generates two different fake packets.
|
Note: combination of --wrong-seq and --wrong-chksum generates two different fake packets.
|
||||||
```
|
```
|
||||||
|
## How to check
|
||||||
To check if your ISP's DPI could be circumvented, first make sure that your provider does not poison DNS answers by enabling "Secure DNS (DNS over HTTPS)" option in your browser.
|
To check if your ISP's DPI could be circumvented, first make sure that your provider does not poison DNS answers by enabling "Secure DNS (DNS over HTTPS)" option in your browser.
|
||||||
|
|
||||||
* **Chrome**: Settings → [Privacy and security](chrome://settings/security) → Use secure DNS → With: NextDNS
|
* **Chrome**: Settings → [Privacy and security](chrome://settings/security) → Use secure DNS → With: NextDNS
|
||||||
@@ -148,7 +154,8 @@ Modify them according to your own needs.
|
|||||||
# Known issues
|
# Known issues
|
||||||
|
|
||||||
* Horribly outdated Windows 7 installations are not able to load WinDivert driver due to missing support for SHA256 digital signatures. Install KB3033929 [x86](https://www.microsoft.com/en-us/download/details.aspx?id=46078)/[x64](https://www.microsoft.com/en-us/download/details.aspx?id=46148), or better, update the whole system using Windows Update.
|
* Horribly outdated Windows 7 installations are not able to load WinDivert driver due to missing support for SHA256 digital signatures. Install KB3033929 [x86](https://www.microsoft.com/en-us/download/details.aspx?id=46078)/[x64](https://www.microsoft.com/en-us/download/details.aspx?id=46148), or better, update the whole system using Windows Update.
|
||||||
* Intel/Qualcomm Killer network cards: `Advanced Stream Detect` in Killer Control Center is incompabitle with GoodbyeDPI, [disable it](https://github.com/ValdikSS/GoodbyeDPI/issues/541#issuecomment-2296038239).
|
* Intel/Qualcomm Killer network cards: `Advanced Stream Detect` in Killer Control Center is incompatible with GoodbyeDPI, [disable it](https://github.com/ValdikSS/GoodbyeDPI/issues/541#issuecomment-2296038239).
|
||||||
|
* QUIK trading software [may interfere with GoodbyeDPI](https://github.com/ValdikSS/GoodbyeDPI/issues/677#issuecomment-2390595606). First start QUIK, then GoodbyeDPI.
|
||||||
* ~~Some SSL/TLS stacks unable to process fragmented ClientHello packets, and HTTPS websites won't open. Bug: [#4](https://github.com/ValdikSS/GoodbyeDPI/issues/4), [#64](https://github.com/ValdikSS/GoodbyeDPI/issues/64).~~ Fragmentation issues are fixed in v0.1.7.
|
* ~~Some SSL/TLS stacks unable to process fragmented ClientHello packets, and HTTPS websites won't open. Bug: [#4](https://github.com/ValdikSS/GoodbyeDPI/issues/4), [#64](https://github.com/ValdikSS/GoodbyeDPI/issues/64).~~ Fragmentation issues are fixed in v0.1.7.
|
||||||
* ~~ESET Antivirus is incompatible with WinDivert driver [#91](https://github.com/ValdikSS/GoodbyeDPI/issues/91). This is most probably antivirus bug, not WinDivert.~~
|
* ~~ESET Antivirus is incompatible with WinDivert driver [#91](https://github.com/ValdikSS/GoodbyeDPI/issues/91). This is most probably antivirus bug, not WinDivert.~~
|
||||||
|
|
||||||
@@ -162,8 +169,9 @@ Modify them according to your own needs.
|
|||||||
- **[PowerTunnel](https://github.com/krlvm/PowerTunnel)** by @krlvm (for Windows, MacOS and Linux)
|
- **[PowerTunnel](https://github.com/krlvm/PowerTunnel)** by @krlvm (for Windows, MacOS and Linux)
|
||||||
- **[PowerTunnel for Android](https://github.com/krlvm/PowerTunnel-Android)** by @krlvm (for Android)
|
- **[PowerTunnel for Android](https://github.com/krlvm/PowerTunnel-Android)** by @krlvm (for Android)
|
||||||
- **[SpoofDPI](https://github.com/xvzc/SpoofDPI)** by @xvzc (for macOS and Linux)
|
- **[SpoofDPI](https://github.com/xvzc/SpoofDPI)** by @xvzc (for macOS and Linux)
|
||||||
|
- **[SpoofDPI-Platform](https://github.com/r3pr3ss10n/SpoofDPI-Platform)** by @r3pr3ss10n (for Android, macOS, Windows)
|
||||||
- **[GhosTCP](https://github.com/macronut/ghostcp)** by @macronut (for Windows)
|
- **[GhosTCP](https://github.com/macronut/ghostcp)** by @macronut (for Windows)
|
||||||
- **[ByeDPI](https://github.com/hufrea/byedpi)** for Linux/Windows + **[ByeDPIAndroid](https://github.com/dovecoteescapee/ByeDPIAndroid/)** for Android (no root)
|
- **[ByeDPI](https://github.com/hufrea/byedpi)** for Linux/Windows + **[ByeDPIAndroid](https://github.com/dovecoteescapee/ByeDPIAndroid/)** / **[ByeByeDPI](https://github.com/romanvht/ByeByeDPI/)** for Android (no root)
|
||||||
- **[youtubeUnblock](https://github.com/Waujito/youtubeUnblock/)** by @Waujito (for OpenWRT/Entware routers and Linux)
|
- **[youtubeUnblock](https://github.com/Waujito/youtubeUnblock/)** by @Waujito (for OpenWRT/Entware routers and Linux)
|
||||||
|
|
||||||
# Kudos
|
# Kudos
|
||||||
|
|||||||
@@ -57,6 +57,91 @@ static const unsigned char fake_https_request[] = {
|
|||||||
0x00, 0x00, 0x00, 0x00, 0x00
|
0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Captured from Firefox 130.0.1
|
||||||
|
static const unsigned char fake_clienthello_part0[] = { // 116 bytes
|
||||||
|
// TLS 1.2 ClientHello header (DD for length placeholder)
|
||||||
|
0x16, 0x03, 0x01, 0xDD, 0xDD, 0x01, 0x00, 0xDD, 0xDD, 0x03, 0x03,
|
||||||
|
// Random bytes (AA for placeholder)
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
// Random Session ID
|
||||||
|
0x20,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
// Cipher Suites
|
||||||
|
0x00, 0x22, 0x13, 0x01, 0x13, 0x03, 0x13, 0x02, 0xC0, 0x2B, 0xC0, 0x2F, 0xCC, 0xA9, 0xCC, 0xA8,
|
||||||
|
0xC0, 0x2C, 0xC0, 0x30, 0xC0, 0x0A, 0xC0, 0x09, 0xC0, 0x13, 0xC0, 0x14, 0x00, 0x9C, 0x00, 0x9D,
|
||||||
|
0x00, 0x2F, 0x00, 0x35,
|
||||||
|
// Compression Methods
|
||||||
|
0x01, 0x00,
|
||||||
|
// Extensions Length
|
||||||
|
0xDD, 0xDD,
|
||||||
|
};
|
||||||
|
// SNI: 00 00 L1 L1 L2 L2 00 L3 L3 (sni)
|
||||||
|
// L1 = L+5, L2 = L+3, L3 = L // 9 + L bytes
|
||||||
|
static const unsigned char fake_clienthello_part1[] = { // 523 bytes
|
||||||
|
// extended_master_secret
|
||||||
|
0x00, 0x17, 0x00, 0x00,
|
||||||
|
// renegotiation_info
|
||||||
|
0xFF, 0x01, 0x00, 0x01, 0x00,
|
||||||
|
// supported_groups
|
||||||
|
0x00, 0x0A, 0x00, 0x0E,
|
||||||
|
0x00, 0x0C, 0x00, 0x1D, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x01, 0x00, 0x01, 0x01,
|
||||||
|
// ex_point_formats
|
||||||
|
0x00, 0x0B, 0x00, 0x02, 0x01, 0x00,
|
||||||
|
// session_ticket
|
||||||
|
0x00, 0x23, 0x00, 0x00,
|
||||||
|
// ALPN
|
||||||
|
0x00, 0x10, 0x00, 0x0E,
|
||||||
|
0x00, 0x0C, 0x02, 0x68, 0x32, 0x08, 0x68, 0x74, 0x74, 0x70, 0x2F, 0x31, 0x2E, 0x31,
|
||||||
|
// status_request
|
||||||
|
0x00, 0x05, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
// delegated_credentials
|
||||||
|
0x00, 0x22, 0x00, 0x0A, 0x00, 0x08, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x02, 0x03,
|
||||||
|
// key_share
|
||||||
|
0x00, 0x33, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x1D, 0x00, 0x20,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0x00, 0x17, 0x00, 0x41, 0x04,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
// supported_versions
|
||||||
|
0x00, 0x2B, 0x00, 0x05, 0x04, 0x03, 0x04, 0x03, 0x03,
|
||||||
|
// signature_algorithms
|
||||||
|
0x00, 0x0D, 0x00, 0x18, 0x00, 0x16, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x08, 0x04, 0x08, 0x05,
|
||||||
|
0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x02, 0x03, 0x02, 0x01,
|
||||||
|
// psk_key_exchange_modes
|
||||||
|
0x00, 0x2D, 0x00, 0x02, 0x01, 0x01,
|
||||||
|
// record_size_limit
|
||||||
|
0x00, 0x1C, 0x00, 0x02, 0x40, 0x01,
|
||||||
|
// encrypted_client_hello
|
||||||
|
0xFE, 0x0D, 0x01, 0x19, 0x00, 0x00, 0x01, 0x00, 0x01, 0xAA, 0x00, 0x20,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0x00, 0xEF,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
|
||||||
|
};
|
||||||
|
// JA4: t13d1715h2_5b57614c22b0_5c2c66f702b0
|
||||||
|
// JA4_r: t13d1715h2_002f,0035,009c,009d,1301,1302,1303,c009,c00a,c013,c014,c02b,c02c,c02f,c030,cca8,cca9_0005,000a,000b,000d,0017,001c,0022,0023,002b,002d,0033,fe0d,ff01_0403,0503,0603,0804,0805,0806,0401,0501,0601,0203,0201
|
||||||
|
// JA3 Fullstring: 771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-34-51-43-13-45-28-65037,29-23-24-25-256-257,0
|
||||||
|
// JA3: b5001237acdf006056b409cc433726b0
|
||||||
|
|
||||||
static int send_fake_data(const HANDLE w_filter,
|
static int send_fake_data(const HANDLE w_filter,
|
||||||
const PWINDIVERT_ADDRESS addr,
|
const PWINDIVERT_ADDRESS addr,
|
||||||
const char *pkt,
|
const char *pkt,
|
||||||
@@ -251,7 +336,7 @@ static int fake_add(const unsigned char *data, size_t size) {
|
|||||||
|
|
||||||
int fake_load_from_hex(const char *data) {
|
int fake_load_from_hex(const char *data) {
|
||||||
size_t len = strlen(data);
|
size_t len = strlen(data);
|
||||||
if (len < 2 || len % 2 || len > 1420)
|
if (len < 2 || len % 2 || len > (1420 * 2))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
unsigned char *finaldata = calloc((len + 2) / 2, 1);
|
unsigned char *finaldata = calloc((len + 2) / 2, 1);
|
||||||
@@ -311,3 +396,46 @@ int fake_load_random(unsigned int count, unsigned int maxsize) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_uint16be(unsigned char *buffer, int offset, int value) {
|
||||||
|
buffer[offset] = (value >> 8) & 0xFF;
|
||||||
|
buffer[offset + 1] = value & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fake_load_from_sni(const char *domain_name) {
|
||||||
|
if (!domain_name) {
|
||||||
|
return 1; // just extra safeguard against NPE
|
||||||
|
}
|
||||||
|
// calculate sizes
|
||||||
|
const int name_size = strlen(domain_name);
|
||||||
|
const int part0_size = sizeof(fake_clienthello_part0);
|
||||||
|
const int part1_size = sizeof(fake_clienthello_part1);
|
||||||
|
const int sni_head_size = 9;
|
||||||
|
const int packet_size = part0_size + part1_size + sni_head_size + name_size;
|
||||||
|
// allocate memory
|
||||||
|
unsigned char *packet = malloc(packet_size);
|
||||||
|
// copy major parts of packet
|
||||||
|
memcpy(packet, fake_clienthello_part0, part0_size);
|
||||||
|
memcpy(&packet[part0_size + sni_head_size + name_size], fake_clienthello_part1, part1_size);
|
||||||
|
// replace placeholders with random generated values
|
||||||
|
unsigned int random = 0;
|
||||||
|
for (int i = 0; i < packet_size; i++) {
|
||||||
|
if (packet[i] == 0xAA) {
|
||||||
|
rand_s(&random);
|
||||||
|
packet[i] = random & 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// write size fields into packet
|
||||||
|
set_uint16be(packet, 0x0003, packet_size - 5);
|
||||||
|
set_uint16be(packet, 0x0007, packet_size - 9);
|
||||||
|
set_uint16be(packet, 0x0072, packet_size - 116);
|
||||||
|
// write SNI extension
|
||||||
|
set_uint16be(packet, part0_size + 0, 0x0000);
|
||||||
|
set_uint16be(packet, part0_size + 2, name_size + 5);
|
||||||
|
set_uint16be(packet, part0_size + 4, name_size + 3);
|
||||||
|
packet[part0_size + 6] = 0x00;
|
||||||
|
set_uint16be(packet, part0_size + 7, name_size);
|
||||||
|
memcpy(&packet[part0_size + sni_head_size], domain_name, name_size);
|
||||||
|
// add packet to fakes
|
||||||
|
return fake_add(packet, packet_size);
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,3 +18,6 @@ int send_fake_https_request(const HANDLE w_filter,
|
|||||||
const BYTE set_checksum,
|
const BYTE set_checksum,
|
||||||
const BYTE set_seq
|
const BYTE set_seq
|
||||||
);
|
);
|
||||||
|
int fake_load_from_hex(const char *data);
|
||||||
|
int fake_load_from_sni(const char *domain_name);
|
||||||
|
int fake_load_random(unsigned int count, unsigned int maxsize);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
// My mingw installation does not load inet_pton definition for some reason
|
// My mingw installation does not load inet_pton definition for some reason
|
||||||
WINSOCK_API_LINKAGE INT WSAAPI inet_pton(INT Family, LPCSTR pStringBuf, PVOID pAddr);
|
WINSOCK_API_LINKAGE INT WSAAPI inet_pton(INT Family, LPCSTR pStringBuf, PVOID pAddr);
|
||||||
|
|
||||||
#define GOODBYEDPI_VERSION "v0.2.3rc2"
|
#define GOODBYEDPI_VERSION "v0.2.3rc3"
|
||||||
|
|
||||||
#define die() do { sleep(20); exit(EXIT_FAILURE); } while (0)
|
#define die() do { sleep(20); exit(EXIT_FAILURE); } while (0)
|
||||||
|
|
||||||
@@ -189,6 +189,7 @@ static struct option long_options[] = {
|
|||||||
{"reverse-frag",no_argument, 0, '(' },
|
{"reverse-frag",no_argument, 0, '(' },
|
||||||
{"max-payload", optional_argument, 0, '|' },
|
{"max-payload", optional_argument, 0, '|' },
|
||||||
{"fake-from-hex", required_argument, 0, 'u' },
|
{"fake-from-hex", required_argument, 0, 'u' },
|
||||||
|
{"fake-with-sni", required_argument, 0, '}' },
|
||||||
{"fake-gen", required_argument, 0, 'j' },
|
{"fake-gen", required_argument, 0, 'j' },
|
||||||
{"fake-resend", required_argument, 0, 't' },
|
{"fake-resend", required_argument, 0, 't' },
|
||||||
{"debug-exit", optional_argument, 0, 'x' },
|
{"debug-exit", optional_argument, 0, 'x' },
|
||||||
@@ -326,7 +327,7 @@ static HANDLE init(char *filter, UINT64 flags) {
|
|||||||
"Please unload it with the following commands ran as administrator:\n\n"
|
"Please unload it with the following commands ran as administrator:\n\n"
|
||||||
"sc stop windivert\n"
|
"sc stop windivert\n"
|
||||||
"sc delete windivert\n"
|
"sc delete windivert\n"
|
||||||
"sc stop windivert14"
|
"sc stop windivert14\n"
|
||||||
"sc delete windivert14\n");
|
"sc delete windivert14\n");
|
||||||
else if (errorcode == 1275)
|
else if (errorcode == 1275)
|
||||||
printf("This error occurs for various reasons, including:\n"
|
printf("This error occurs for various reasons, including:\n"
|
||||||
@@ -948,8 +949,13 @@ int main(int argc, char *argv[]) {
|
|||||||
printf("WARNING: bad fake HEX value %s\n", optarg);
|
printf("WARNING: bad fake HEX value %s\n", optarg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case '}': // --fake-with-sni
|
||||||
|
if (fake_load_from_sni(optarg)) {
|
||||||
|
printf("WARNING: bad domain name for SNI: %s\n", optarg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'j': // --fake-gen
|
case 'j': // --fake-gen
|
||||||
if (fake_load_random(atoub(optarg, "Fake generator parameter error!"))) {
|
if (fake_load_random(atoub(optarg, "Fake generator parameter error!"), 200)) {
|
||||||
puts("WARNING: fake generator has failed!");
|
puts("WARNING: fake generator has failed!");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1013,6 +1019,10 @@ int main(int argc, char *argv[]) {
|
|||||||
" --fake-from-hex <value> Load fake packets for Fake Request Mode from HEX values (like 1234abcDEF).\n"
|
" --fake-from-hex <value> Load fake packets for Fake Request Mode from HEX values (like 1234abcDEF).\n"
|
||||||
" This option can be supplied multiple times, in this case each fake packet\n"
|
" This option can be supplied multiple times, in this case each fake packet\n"
|
||||||
" would be sent on every request in the command line argument order.\n"
|
" would be sent on every request in the command line argument order.\n"
|
||||||
|
" --fake-with-sni <value> Generate fake packets for Fake Request Mode with given SNI domain name.\n"
|
||||||
|
" The packets mimic Mozilla Firefox 130 TLS ClientHello packet\n"
|
||||||
|
" (with random generated fake SessionID, key shares and ECH grease).\n"
|
||||||
|
" Can be supplied multiple times for multiple fake packets.\n"
|
||||||
" --fake-gen <value> Generate random-filled fake packets for Fake Request Mode, value of them\n"
|
" --fake-gen <value> Generate random-filled fake packets for Fake Request Mode, value of them\n"
|
||||||
" (up to 30).\n"
|
" (up to 30).\n"
|
||||||
" --fake-resend <value> Send each fake packet value number of times.\n"
|
" --fake-resend <value> Send each fake packet value number of times.\n"
|
||||||
|
|||||||
Reference in New Issue
Block a user