mirror of
https://github.com/dovecoteescapee/ByeDPIAndroid.git
synced 2025-07-01 11:03:01 +00:00
Support OOB and add custom fake SNI
This commit is contained in:
parent
fddf0b5c82
commit
52bf3cc272
@ -13,14 +13,22 @@ const enum demode DESYNC_METHODS[] = {
|
|||||||
DESYNC_NONE,
|
DESYNC_NONE,
|
||||||
DESYNC_SPLIT,
|
DESYNC_SPLIT,
|
||||||
DESYNC_DISORDER,
|
DESYNC_DISORDER,
|
||||||
DESYNC_FAKE
|
DESYNC_FAKE,
|
||||||
|
DESYNC_OOB,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int NOT_EXIT;
|
extern int NOT_EXIT;
|
||||||
extern struct packet fake_tls, fake_http;
|
|
||||||
extern int get_default_ttl();
|
extern int get_default_ttl();
|
||||||
|
|
||||||
extern int get_addr(const char *str, struct sockaddr_ina *addr);
|
extern int get_addr(const char *str, struct sockaddr_ina *addr);
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_00024Companion_jniInit(JNIEnv *env, jobject thiz) {
|
||||||
|
oob_data.data = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_jniCreateSocket(
|
Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_jniCreateSocket(
|
||||||
JNIEnv *env,
|
JNIEnv *env,
|
||||||
@ -36,6 +44,8 @@ Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_jniCreateSocket(
|
|||||||
jint split_position,
|
jint split_position,
|
||||||
jboolean split_at_host,
|
jboolean split_at_host,
|
||||||
jint fake_ttl,
|
jint fake_ttl,
|
||||||
|
jstring fake_sni,
|
||||||
|
jstring custom_oob_data,
|
||||||
jboolean host_mixed_case,
|
jboolean host_mixed_case,
|
||||||
jboolean domain_mixed_case,
|
jboolean domain_mixed_case,
|
||||||
jboolean host_remove_spaces,
|
jboolean host_remove_spaces,
|
||||||
@ -52,6 +62,8 @@ Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_jniCreateSocket(
|
|||||||
if (get_addr(address, &s) < 0) {
|
if (get_addr(address, &s) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
(*env)->ReleaseStringUTFChars(env, ip, address);
|
||||||
|
|
||||||
s.in.sin_port = htons(port);
|
s.in.sin_port = htons(port);
|
||||||
|
|
||||||
params.max_open = max_connections;
|
params.max_open = max_connections;
|
||||||
@ -83,6 +95,34 @@ Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_jniCreateSocket(
|
|||||||
return get_e();
|
return get_e();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params.attack == DESYNC_FAKE) {
|
||||||
|
const char *sni = (*env)->GetStringUTFChars(env, fake_sni, 0);
|
||||||
|
LOG(LOG_S, "fake_sni: %s", sni);
|
||||||
|
int res = change_tls_sni(sni, fake_tls.data, fake_tls.size);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, fake_sni, sni);
|
||||||
|
if (res) {
|
||||||
|
fprintf(stderr, "error chsni\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.attack == DESYNC_OOB) {
|
||||||
|
const char *oob = (*env)->GetStringUTFChars(env, custom_oob_data, 0);
|
||||||
|
const size_t oob_len = strlen(oob);
|
||||||
|
LOG(LOG_L, "custom_oob_data: %s", oob);
|
||||||
|
oob_data.size = oob_len;
|
||||||
|
LOG(LOG_L, "before free");
|
||||||
|
free(oob_data.data);
|
||||||
|
LOG(LOG_L, "after free");
|
||||||
|
oob_data.data = malloc(oob_len);
|
||||||
|
if (oob_data.data == NULL) {
|
||||||
|
uniperror("malloc");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy(oob_data.data, oob, oob_len);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, custom_oob_data, oob);
|
||||||
|
}
|
||||||
|
|
||||||
LOG(LOG_S, "listen_socket, fd: %d", fd);
|
LOG(LOG_S, "listen_socket, fd: %d", fd);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
@ -106,4 +146,4 @@ Java_io_github_dovecoteescapee_byedpi_core_ByeDpiProxy_jniStopProxy(JNIEnv *env,
|
|||||||
return get_e();
|
return get_e();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,10 @@ class ByeDpiProxy {
|
|||||||
companion object {
|
companion object {
|
||||||
init {
|
init {
|
||||||
System.loadLibrary("byedpi")
|
System.loadLibrary("byedpi")
|
||||||
|
jniInit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private external fun jniInit(): Int
|
||||||
}
|
}
|
||||||
|
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
@ -49,6 +52,8 @@ class ByeDpiProxy {
|
|||||||
splitPosition = preferences.splitPosition,
|
splitPosition = preferences.splitPosition,
|
||||||
splitAtHost = preferences.splitAtHost,
|
splitAtHost = preferences.splitAtHost,
|
||||||
fakeTtl = preferences.fakeTtl,
|
fakeTtl = preferences.fakeTtl,
|
||||||
|
fakeSni = preferences.fakeSni,
|
||||||
|
oobData = preferences.oobData,
|
||||||
hostMixedCase = preferences.hostMixedCase,
|
hostMixedCase = preferences.hostMixedCase,
|
||||||
domainMixedCase = preferences.domainMixedCase,
|
domainMixedCase = preferences.domainMixedCase,
|
||||||
hostRemoveSpaces = preferences.hostRemoveSpaces,
|
hostRemoveSpaces = preferences.hostRemoveSpaces,
|
||||||
@ -77,6 +82,8 @@ class ByeDpiProxy {
|
|||||||
splitPosition: Int,
|
splitPosition: Int,
|
||||||
splitAtHost: Boolean,
|
splitAtHost: Boolean,
|
||||||
fakeTtl: Int,
|
fakeTtl: Int,
|
||||||
|
fakeSni: String,
|
||||||
|
oobData: String,
|
||||||
hostMixedCase: Boolean,
|
hostMixedCase: Boolean,
|
||||||
domainMixedCase: Boolean,
|
domainMixedCase: Boolean,
|
||||||
hostRemoveSpaces: Boolean,
|
hostRemoveSpaces: Boolean,
|
||||||
|
@ -14,6 +14,8 @@ class ByeDpiProxyPreferences(
|
|||||||
splitPosition: Int? = null,
|
splitPosition: Int? = null,
|
||||||
splitAtHost: Boolean? = null,
|
splitAtHost: Boolean? = null,
|
||||||
fakeTtl: Int? = null,
|
fakeTtl: Int? = null,
|
||||||
|
fakeSni: String? = null,
|
||||||
|
oobData: String? = null,
|
||||||
hostMixedCase: Boolean? = null,
|
hostMixedCase: Boolean? = null,
|
||||||
domainMixedCase: Boolean? = null,
|
domainMixedCase: Boolean? = null,
|
||||||
hostRemoveSpaces: Boolean? = null,
|
hostRemoveSpaces: Boolean? = null,
|
||||||
@ -32,6 +34,8 @@ class ByeDpiProxyPreferences(
|
|||||||
val splitPosition: Int = splitPosition ?: 3
|
val splitPosition: Int = splitPosition ?: 3
|
||||||
val splitAtHost: Boolean = splitAtHost ?: false
|
val splitAtHost: Boolean = splitAtHost ?: false
|
||||||
val fakeTtl: Int = fakeTtl ?: 8
|
val fakeTtl: Int = fakeTtl ?: 8
|
||||||
|
val fakeSni: String = fakeSni ?: "www.w3c.org"
|
||||||
|
val oobData: String = oobData ?: "a"
|
||||||
val hostMixedCase: Boolean = hostMixedCase ?: false
|
val hostMixedCase: Boolean = hostMixedCase ?: false
|
||||||
val domainMixedCase: Boolean = domainMixedCase ?: false
|
val domainMixedCase: Boolean = domainMixedCase ?: false
|
||||||
val hostRemoveSpaces: Boolean = hostRemoveSpaces ?: false
|
val hostRemoveSpaces: Boolean = hostRemoveSpaces ?: false
|
||||||
@ -52,6 +56,8 @@ class ByeDpiProxyPreferences(
|
|||||||
splitPosition = preferences.getString("byedpi_split_position", null)?.toIntOrNull(),
|
splitPosition = preferences.getString("byedpi_split_position", null)?.toIntOrNull(),
|
||||||
splitAtHost = preferences.getBoolean("byedpi_split_at_host", false),
|
splitAtHost = preferences.getBoolean("byedpi_split_at_host", false),
|
||||||
fakeTtl = preferences.getString("byedpi_fake_ttl", null)?.toIntOrNull(),
|
fakeTtl = preferences.getString("byedpi_fake_ttl", null)?.toIntOrNull(),
|
||||||
|
fakeSni = preferences.getString("byedpi_fake_sni", null),
|
||||||
|
oobData = preferences.getString("byedpi_oob_data", null),
|
||||||
hostMixedCase = preferences.getBoolean("byedpi_host_mixed_case", false),
|
hostMixedCase = preferences.getBoolean("byedpi_host_mixed_case", false),
|
||||||
domainMixedCase = preferences.getBoolean("byedpi_domain_mixed_case", false),
|
domainMixedCase = preferences.getBoolean("byedpi_domain_mixed_case", false),
|
||||||
hostRemoveSpaces = preferences.getBoolean("byedpi_host_remove_spaces", false),
|
hostRemoveSpaces = preferences.getBoolean("byedpi_host_remove_spaces", false),
|
||||||
@ -64,7 +70,8 @@ class ByeDpiProxyPreferences(
|
|||||||
None,
|
None,
|
||||||
Split,
|
Split,
|
||||||
Disorder,
|
Disorder,
|
||||||
Fake;
|
Fake,
|
||||||
|
OOB;
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun fromName(name: String): DesyncMethod {
|
fun fromName(name: String): DesyncMethod {
|
||||||
@ -73,6 +80,7 @@ class ByeDpiProxyPreferences(
|
|||||||
"split" -> Split
|
"split" -> Split
|
||||||
"disorder" -> Disorder
|
"disorder" -> Disorder
|
||||||
"fake" -> Fake
|
"fake" -> Fake
|
||||||
|
"oob" -> OOB
|
||||||
else -> throw IllegalArgumentException("Unknown desync method: $name")
|
else -> throw IllegalArgumentException("Unknown desync method: $name")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,11 +25,13 @@
|
|||||||
<item name="split">Split</item>
|
<item name="split">Split</item>
|
||||||
<item name="disorder">Disorder</item>
|
<item name="disorder">Disorder</item>
|
||||||
<item name="fake">Fake</item>
|
<item name="fake">Fake</item>
|
||||||
|
<item name="oob">Out-of-band</item>
|
||||||
</array>
|
</array>
|
||||||
<array name="byedpi_desync_methods_entries">
|
<array name="byedpi_desync_methods_entries">
|
||||||
<item name="none">none</item>
|
<item name="none">none</item>
|
||||||
<item name="split">split</item>
|
<item name="split">split</item>
|
||||||
<item name="disorder">disorder</item>
|
<item name="disorder">disorder</item>
|
||||||
<item name="fake">fake</item>
|
<item name="fake">fake</item>
|
||||||
|
<item name="oob">oob</item>
|
||||||
</array>
|
</array>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -49,4 +49,7 @@
|
|||||||
<string name="notification_title">ByeDPI</string>
|
<string name="notification_title">ByeDPI</string>
|
||||||
<string name="vpn_notification_content">VPN is running</string>
|
<string name="vpn_notification_content">VPN is running</string>
|
||||||
<string name="proxy_notification_content">Proxy is running</string>
|
<string name="proxy_notification_content">Proxy is running</string>
|
||||||
|
<string name="general_category">General</string>
|
||||||
|
<string name="byedpi_category">ByeDPI</string>
|
||||||
|
<string name="about_category">About</string>
|
||||||
</resources>
|
</resources>
|
@ -4,8 +4,8 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:tag="settings_screen">
|
android:tag="settings_screen">
|
||||||
|
|
||||||
<PreferenceCategory
|
<androidx.preference.PreferenceCategory
|
||||||
android:title="General">
|
android:title="@string/general_category">
|
||||||
|
|
||||||
<DropDownPreference
|
<DropDownPreference
|
||||||
android:key="app_theme"
|
android:key="app_theme"
|
||||||
@ -23,10 +23,10 @@
|
|||||||
android:defaultValue="vpn"
|
android:defaultValue="vpn"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
</PreferenceCategory>
|
</androidx.preference.PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory
|
<androidx.preference.PreferenceCategory
|
||||||
android:title="ByeDPI">
|
android:title="@string/byedpi_category">
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="byedpi_readme"
|
android:key="byedpi_readme"
|
||||||
@ -115,6 +115,18 @@
|
|||||||
android:defaultValue="8"
|
android:defaultValue="8"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
|
<com.takisoft.preferencex.EditTextPreference
|
||||||
|
android:key="byedpi_fake_sni"
|
||||||
|
android:title="SNI of fake packet"
|
||||||
|
android:defaultValue="www.w3c.org"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
|
<com.takisoft.preferencex.EditTextPreference
|
||||||
|
android:key="byedpi_oob_data"
|
||||||
|
android:title="OOB Data"
|
||||||
|
android:defaultValue="a"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="byedpi_host_mixed_case"
|
android:key="byedpi_host_mixed_case"
|
||||||
android:title="@string/byedpi_host_mixed_case_setting"
|
android:title="@string/byedpi_host_mixed_case_setting"
|
||||||
@ -147,10 +159,10 @@
|
|||||||
android:title="@string/byedpi_tlsrec_at_sni_setting"
|
android:title="@string/byedpi_tlsrec_at_sni_setting"
|
||||||
android:defaultValue="false" />
|
android:defaultValue="false" />
|
||||||
|
|
||||||
</PreferenceCategory>
|
</androidx.preference.PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory
|
<androidx.preference.PreferenceCategory
|
||||||
android:title="About">
|
android:title="@string/about_category">
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="version"
|
android:key="version"
|
||||||
@ -167,6 +179,6 @@
|
|||||||
android:data="https://github.com/dovecoteescapee/ByeDPIAndroid" />
|
android:data="https://github.com/dovecoteescapee/ByeDPIAndroid" />
|
||||||
</Preference>
|
</Preference>
|
||||||
|
|
||||||
</PreferenceCategory>
|
</androidx.preference.PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
Loading…
Reference in New Issue
Block a user