1
1
#include <stdio.h>
2
2
#include <stdlib.h>
3
+ #include <stdbool.h>
3
4
#include <ctype.h>
4
5
#include <unistd.h>
5
6
#include <in6addr.h>
6
7
#include <ws2tcpip.h>
7
8
#include "windivert.h"
8
9
#include "goodbyedpi.h"
9
10
11
+ struct fake_t {
12
+ const unsigned char * data ;
13
+ size_t size ;
14
+ };
15
+
16
+ static struct fake_t * fakes [30 ] = {0 };
17
+ int fakes_count = 0 ;
18
+
10
19
static const unsigned char fake_http_request [] = "GET / HTTP/1.1\r\nHost: www.w3.org\r\n"
11
20
"User-Agent: curl/7.65.3\r\nAccept: */*\r\n"
12
21
"Accept-Encoding: deflate, gzip, br\r\n\r\n" ;
@@ -54,7 +63,8 @@ static int send_fake_data(const HANDLE w_filter,
54
63
const BOOL is_https ,
55
64
const BYTE set_ttl ,
56
65
const BYTE set_checksum ,
57
- const BYTE set_seq
66
+ const BYTE set_seq ,
67
+ const struct fake_t * fake_data
58
68
) {
59
69
char packet_fake [MAX_PACKET_SIZE ];
60
70
WINDIVERT_ADDRESS addr_new ;
@@ -66,6 +76,10 @@ static int send_fake_data(const HANDLE w_filter,
66
76
PWINDIVERT_TCPHDR ppTcpHdr ;
67
77
unsigned const char * fake_request_data = is_https ? fake_https_request : fake_http_request ;
68
78
UINT fake_request_size = is_https ? sizeof (fake_https_request ) : sizeof (fake_http_request ) - 1 ;
79
+ if (fake_data ) {
80
+ fake_request_data = fake_data -> data ;
81
+ fake_request_size = fake_data -> size ;
82
+ }
69
83
70
84
memcpy (& addr_new , addr , sizeof (WINDIVERT_ADDRESS ));
71
85
memcpy (packet_fake , pkt , packetLen );
@@ -148,22 +162,26 @@ static int send_fake_request(const HANDLE w_filter,
148
162
const BOOL is_https ,
149
163
const BYTE set_ttl ,
150
164
const BYTE set_checksum ,
151
- const BYTE set_seq
165
+ const BYTE set_seq ,
166
+ const struct fake_t * fake_data
152
167
) {
153
168
if (set_ttl ) {
154
169
send_fake_data (w_filter , addr , pkt , packetLen ,
155
170
is_ipv6 , is_https ,
156
- set_ttl , FALSE, FALSE);
171
+ set_ttl , FALSE, FALSE,
172
+ fake_data );
157
173
}
158
174
if (set_checksum ) {
159
175
send_fake_data (w_filter , addr , pkt , packetLen ,
160
176
is_ipv6 , is_https ,
161
- FALSE, set_checksum , FALSE);
177
+ FALSE, set_checksum , FALSE,
178
+ fake_data );
162
179
}
163
180
if (set_seq ) {
164
181
send_fake_data (w_filter , addr , pkt , packetLen ,
165
182
is_ipv6 , is_https ,
166
- FALSE, FALSE, set_seq );
183
+ FALSE, FALSE, set_seq ,
184
+ fake_data );
167
185
}
168
186
return 0 ;
169
187
}
@@ -177,9 +195,17 @@ int send_fake_http_request(const HANDLE w_filter,
177
195
const BYTE set_checksum ,
178
196
const BYTE set_seq
179
197
) {
180
- return send_fake_request (w_filter , addr , pkt , packetLen ,
181
- is_ipv6 , FALSE,
182
- set_ttl , set_checksum , set_seq );
198
+ int ret = 0 ;
199
+ for (int i = 0 ; i < fakes_count || i == 0 ; i ++ ) {
200
+ if (send_fake_request (w_filter , addr , pkt , packetLen ,
201
+ is_ipv6 , FALSE,
202
+ set_ttl , set_checksum , set_seq ,
203
+ fakes [i ]))
204
+ {
205
+ ret ++ ;
206
+ }
207
+ }
208
+ return ret ;
183
209
}
184
210
185
211
int send_fake_https_request (const HANDLE w_filter ,
@@ -191,7 +217,70 @@ int send_fake_https_request(const HANDLE w_filter,
191
217
const BYTE set_checksum ,
192
218
const BYTE set_seq
193
219
) {
194
- return send_fake_request (w_filter , addr , pkt , packetLen ,
220
+ int ret = 0 ;
221
+ for (int i = 0 ; i < fakes_count || i == 0 ; i ++ ) {
222
+ if (send_fake_request (w_filter , addr , pkt , packetLen ,
195
223
is_ipv6 , TRUE,
196
- set_ttl , set_checksum , set_seq );
224
+ set_ttl , set_checksum , set_seq ,
225
+ fakes [i ]))
226
+ {
227
+ ret ++ ;
228
+ }
229
+ }
230
+ return ret ;
231
+ }
232
+
233
+ static int fake_add (const unsigned char * data , size_t size ) {
234
+ struct fake_t * fake = malloc (sizeof (struct fake_t ));
235
+ fake -> size = size ;
236
+ fake -> data = data ;
237
+
238
+ for (size_t k = 0 ; k <= sizeof (fakes ) / sizeof (* fakes ); k ++ ) {
239
+ if (!fakes [k ]) {
240
+ fakes [k ] = fake ;
241
+ fakes_count ++ ;
242
+ return 0 ;
243
+ }
244
+ }
245
+ return 3 ;
246
+ }
247
+
248
+ int fake_load_from_hex (const char * data ) {
249
+ size_t len = strlen (data );
250
+ if (len < 2 || len % 2 || len > 1420 )
251
+ return 1 ;
252
+
253
+ unsigned char * finaldata = calloc ((len + 2 ) / 2 , 1 );
254
+
255
+ for (size_t i = 0 ; i < len - 1 ; i += 2 ) {
256
+ char num1 = data [i ];
257
+ char num2 = data [i + 1 ];
258
+ debug ("Current num1: %X, num2: %X\n" , num1 , num2 );
259
+ unsigned char finalchar = 0 ;
260
+ char curchar = num1 ;
261
+
262
+ for (int j = 0 ; j <=1 ; j ++ ) {
263
+ if (curchar >= '0' && curchar <= '9' )
264
+ curchar -= '0' ;
265
+ else if (curchar >= 'a' && curchar <= 'f' )
266
+ curchar -= 'a' - 0xA ;
267
+ else if (curchar >= 'A' && curchar <= 'F' )
268
+ curchar -= 'A' - 0xA ;
269
+ else
270
+ return 2 ; // incorrect character, not a hex data
271
+
272
+ if (!j ) {
273
+ num1 = curchar ;
274
+ curchar = num2 ;
275
+ continue ;
276
+ }
277
+ num2 = curchar ;
278
+ }
279
+ debug ("Processed num1: %X, num2: %X\n" , num1 , num2 );
280
+ finalchar = (num1 << 4 ) | num2 ;
281
+ debug ("Final char: %X\n" , finalchar );
282
+ finaldata [i /2 ] = finalchar ;
283
+ }
284
+
285
+ return fake_add (finaldata , len / 2 );
197
286
}
0 commit comments