mirror of
https://github.com/h3xduck/TripleCross.git
synced 2026-01-03 23:13:07 +08:00
Arbitrary payload modification fully works now. Absolutely ridicous the time it took me (2 days) to realize I was computing the ip checksum with the old checksum values, which made it not to work. Finally can keep going
This commit is contained in:
@@ -24,7 +24,7 @@ static __always_inline unsigned short checksum(unsigned short *addr, int nbytes)
|
||||
if(nbytes>0){
|
||||
sum +=htons((unsigned char)*addr);
|
||||
}
|
||||
|
||||
|
||||
while (sum>>16){
|
||||
sum = (sum & 0xffff) + (sum >> 16);
|
||||
}
|
||||
@@ -34,30 +34,34 @@ static __always_inline unsigned short checksum(unsigned short *addr, int nbytes)
|
||||
}
|
||||
|
||||
|
||||
static __always_inline uint16_t csum_fold_helper(uint32_t csum)
|
||||
static __always_inline __u16 csum_fold_helper(__u32 csum)
|
||||
{
|
||||
bpf_printk("csumA: %u\n", csum & 0xffff);
|
||||
bpf_printk("csumB: %u\n", csum >> 16);
|
||||
bpf_printk("csumA+B: %u\n", (csum & 0xffff) + (csum >> 16));
|
||||
bpf_printk("csumNEG(A+B): %u\n", ~((csum & 0xffff) + (csum >> 16)));
|
||||
//return ~((csum & 0xffff) + (csum >> 16));
|
||||
//The following solves some errors where the last summatory overflows
|
||||
#pragma unroll
|
||||
for (int ii = 0; ii < 4; ii++) {
|
||||
if (csum >> 16)
|
||||
csum = (csum & 0xffff) + (csum >> 16);
|
||||
for (int i = 0; i < 4; i ++) {
|
||||
if (csum >> 16){
|
||||
csum = (csum & 0xffff) + (csum >> 16);
|
||||
}
|
||||
}
|
||||
return ~csum;
|
||||
return ~csum;
|
||||
}
|
||||
/**
|
||||
* IP checksum calculation.
|
||||
* Following RFC 1071, using BPFs.*
|
||||
*/
|
||||
static __always_inline void ipv4_csum(void *data_start, int data_size, uint32_t *csum)
|
||||
static __always_inline void ipv4_csum(void *data_start, int data_size, __u32 *csum)
|
||||
{
|
||||
bpf_printk("csum: %u\n", *csum);
|
||||
*csum = bpf_csum_diff(0, 0, data_start, data_size, *csum);
|
||||
bpf_printk("csum: %u\n", *csum);
|
||||
//WITH EBPF HELPERS
|
||||
bpf_printk("csum: %u for data_start %u, data_size %i\n", *csum, data_start, data_size);
|
||||
|
||||
unsigned char* p = (unsigned char*) data_start;
|
||||
for(int ii = 0; ii<20; ii++){
|
||||
bpf_printk("B%i: %x\n", ii, p[ii]);
|
||||
}
|
||||
|
||||
*csum = bpf_csum_diff(0, 0, data_start, data_size, *csum);
|
||||
*csum = csum_fold_helper(*csum);
|
||||
bpf_printk("csum: %u\n", *csum);
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user