Hello,
I am working with iptables and libipq in Ubuntu right now and try to modify payload. How can I change some data in payload which I get from buffer? What should I do if I want to modify every 5th bit in payload? Also what should I do if I want to modify bits starting from bit No. 100 or later. Do I need to work not with bits but chars or smth else if I want modify payload of video packets.
Any help will be appreciated.
MC
Code:/* * T.c * * compile: gcc -Wall T.c -o T -lipq */ #include <netinet/in.h> #include <libipq.h> #include <linux/netfilter.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <netinet/ip.h> #include <netinet/udp.h> #include <netinet/tcp.h> #define BUFSIZE 65536 static void die(struct ipq_handle *h) { ipq_perror("passer"); ipq_destroy_handle(h); } void start_packet_engine() { int status; unsigned char buf[BUFSIZE]; struct ipq_handle *h; printf("\nWaiting for packets\n"); h = ipq_create_handle(0, PF_INET); if (!h) die(h); status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE); if (status < 0) die(h); do { status = ipq_read(h, buf, BUFSIZE, 0); if (status < 0) die(h); switch (ipq_message_type(buf)) { case NLMSG_ERROR: { fprintf(stderr, "Received error message %d\n", ipq_get_msgerr(buf)); break; } case IPQM_PACKET: { ipq_packet_msg_t *m = ipq_get_packet(buf); struct iphdr *iph = ((struct iphdr *)m->payload); struct tcphdr *tcp = (struct tcphdr *)(m->payload + (iph->ihl << 2)); struct udphdr *udp = (struct udphdr *) (m->payload + (iph->ihl << 2)); int unsigned payload_offset = ((iph->ihl << 2) + (tcp->doff << 2)); int unsigned payload_length = (unsigned int) ntohs(iph->tot_len) - payload_offset; status = ipq_set_verdict(h, m->packet_id,NF_ACCEPT, 0, NULL); break; } } } while (1); printf("Engine Stopped...\n"); ipq_destroy_handle(h); } int main() { start_packet_engine(); return 0; }



LinkBack URL
About LinkBacks


