Skip to content

Commit 895af0f

Browse files
author
bol-van
committed
nfqws: allow to decrease udp length
1 parent 2d22170 commit 895af0f

File tree

16 files changed

+36
-14
lines changed

16 files changed

+36
-14
lines changed

binaries/aarch64/nfqws

-236 Bytes
Binary file not shown.

binaries/arm/nfqws

168 Bytes
Binary file not shown.

binaries/freebsd-x64/dvtws

432 Bytes
Binary file not shown.

binaries/mips32r1-lsb/nfqws

92 Bytes
Binary file not shown.

binaries/mips32r1-msb/nfqws

664 Bytes
Binary file not shown.

binaries/mips64r2-msb/nfqws

400 Bytes
Binary file not shown.

binaries/ppc/nfqws

96 Bytes
Binary file not shown.

binaries/x86/nfqws

216 Bytes
Binary file not shown.

binaries/x86_64/nfqws

-284 Bytes
Binary file not shown.

nfq/darkmagic.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,15 +294,23 @@ bool prepare_tcp_segment(
294294
}
295295

296296

297+
// padlen<0 means payload shrinking
297298
bool prepare_udp_segment4(
298299
const struct sockaddr_in *src, const struct sockaddr_in *dst,
299300
uint8_t ttl,
300301
uint8_t fooling,
301-
uint16_t padlen,
302+
int padlen,
302303
const void *data, uint16_t len,
303304
uint8_t *buf, size_t *buflen)
304305
{
305-
uint16_t datalen = len + padlen;
306+
if ((len+padlen)<=0) padlen=-(int)len+1; // do not allow payload to be less that 1 byte
307+
if ((len+padlen)>0xFFFF) padlen=0xFFFF-len; // do not allow payload size to exceed u16 range
308+
if (padlen<0)
309+
{
310+
len+=padlen;
311+
padlen=0;
312+
}
313+
uint16_t datalen = (uint16_t)(len + padlen);
306314
uint16_t ip_payload_len = sizeof(struct udphdr) + datalen;
307315
uint16_t pktlen = sizeof(struct ip) + ip_payload_len;
308316
if (pktlen>*buflen) return false;
@@ -327,11 +335,18 @@ bool prepare_udp_segment6(
327335
const struct sockaddr_in6 *src, const struct sockaddr_in6 *dst,
328336
uint8_t ttl,
329337
uint8_t fooling,
330-
uint16_t padlen,
338+
int padlen,
331339
const void *data, uint16_t len,
332340
uint8_t *buf, size_t *buflen)
333341
{
334-
uint16_t datalen = len + padlen;
342+
if ((len+padlen)<=0) padlen=-(int)len+1; // do not allow payload to be less that 1 byte
343+
if ((len+padlen)>0xFFFF) padlen=0xFFFF-len; // do not allow payload size to exceed u16 range
344+
if (padlen<0)
345+
{
346+
len+=padlen;
347+
padlen=0;
348+
}
349+
uint16_t datalen = (uint16_t)(len + padlen);
335350
uint16_t transport_payload_len = sizeof(struct udphdr) + datalen;
336351
uint16_t ip_payload_len = transport_payload_len +
337352
8*!!((fooling & (FOOL_HOPBYHOP|FOOL_HOPBYHOP2))==FOOL_HOPBYHOP) +
@@ -404,7 +419,7 @@ bool prepare_udp_segment(
404419
const struct sockaddr *src, const struct sockaddr *dst,
405420
uint8_t ttl,
406421
uint8_t fooling,
407-
uint16_t padlen,
422+
int padlen,
408423
const void *data, uint16_t len,
409424
uint8_t *buf, size_t *buflen)
410425
{

0 commit comments

Comments
 (0)