mirror of
https://github.com/ValdikSS/GoodbyeDPI.git
synced 2025-12-17 21:04:36 +03:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30fd25bc24 | ||
|
|
9fea771d2c | ||
|
|
bb05d357a7 |
28
goodbyedpi.c
28
goodbyedpi.c
@@ -23,18 +23,19 @@
|
||||
|
||||
static HANDLE filters[MAX_FILTERS];
|
||||
static int filter_num = 0;
|
||||
static const char *http_redirect_10 = "HTTP/1.0 30";
|
||||
static const char *http_redirect_11 = "HTTP/1.1 30";
|
||||
static const char *http10_redirect_302 = "HTTP/1.0 302 ";
|
||||
static const char *http11_redirect_302 = "HTTP/1.1 302 ";
|
||||
static const char *http_host_find = "\r\nHost: ";
|
||||
static const char *http_host_replace = "\r\nhoSt: ";
|
||||
static const char *location_http = "\r\nLocation: http://";
|
||||
|
||||
static char* dumb_memmem(char* haystack, int hlen, char* needle, int nlen) {
|
||||
static char* dumb_memmem(const char* haystack, int hlen, const char* needle, int nlen) {
|
||||
// naive implementation
|
||||
if (nlen > hlen) return 0;
|
||||
int i;
|
||||
for (i=0; i<hlen-nlen+1; i++) {
|
||||
if (memcmp(haystack+i,needle,nlen)==0) {
|
||||
return haystack+i;
|
||||
return (char*)(haystack+i);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
@@ -66,18 +67,23 @@ static void sigint_handler(int sig) {
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static int find_passivedpi_redirect(char *pktdata) {
|
||||
if (memcmp(pktdata, http_redirect_11, strlen(http_redirect_11)) == 0
|
||||
|| memcmp(pktdata, http_redirect_10, strlen(http_redirect_10)) == 0) {
|
||||
static int is_passivedpi_redirect(const char *pktdata, int pktlen) {
|
||||
/* First check if this is HTTP 302 redirect */
|
||||
if (memcmp(pktdata, http11_redirect_302, strlen(http11_redirect_302)) == 0 ||
|
||||
memcmp(pktdata, http10_redirect_302, strlen(http10_redirect_302)) == 0)
|
||||
{
|
||||
/* Then check if this is a redirect to new http site */
|
||||
if (dumb_memmem(pktdata, pktlen, location_http, strlen(location_http))) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Finds Host header with \r\n before it */
|
||||
static PVOID find_host_header(char *pktdata, int pktlen) {
|
||||
static PVOID find_host_header(const char *pktdata, int pktlen) {
|
||||
return dumb_memmem(pktdata, pktlen,
|
||||
(char*)http_host_find, strlen(http_host_find));
|
||||
http_host_find, strlen(http_host_find));
|
||||
}
|
||||
|
||||
static void change_window_size(char *pkt, int size) {
|
||||
@@ -114,7 +120,7 @@ int main(int argc, char *argv[]) {
|
||||
= do_fragment_http = do_fragment_https = 1;
|
||||
}
|
||||
|
||||
while ((opt = getopt(argc, argv, "123prsf:e:")) != -1) {
|
||||
while ((opt = getopt(argc, argv, "1234prsf:e:")) != -1) {
|
||||
switch (opt) {
|
||||
case '1':
|
||||
do_passivedpi = do_host = do_host_removespace \
|
||||
@@ -226,7 +232,7 @@ int main(int argc, char *argv[]) {
|
||||
/* If INBOUND packet with DATA (tcp.Ack) */
|
||||
|
||||
/* Drop packets from filter with HTTP 30x Redirect */
|
||||
if (do_passivedpi && find_passivedpi_redirect(packet_data)) {
|
||||
if (do_passivedpi && is_passivedpi_redirect(packet_data, packet_dataLen)) {
|
||||
//printf("Dropping HTTP Redirect packet!\n");
|
||||
should_reinject = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user