diff options
| author | Mosder <xmosder12@gmail.com> | 2026-06-17 23:01:28 +0200 |
|---|---|---|
| committer | Mosder <xmosder12@gmail.com> | 2026-06-17 23:01:28 +0200 |
| commit | cc903a47e45daa3499d652944665419eeadd74be (patch) | |
| tree | 2ab15188499eb5c0d7f9c36d1b2c63c92c31a602 /analyzer/utils/pcap.c | |
| parent | 2e3f7fe39791cd671a68330f7ba7a5bb5fc6f9ae (diff) | |
| parent | d62be280a151883866554e9ea00a5efed2fa593a (diff) | |
Merge the branch with master, because i forgor to create it from newest
commit
Diffstat (limited to 'analyzer/utils/pcap.c')
| -rw-r--r-- | analyzer/utils/pcap.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/analyzer/utils/pcap.c b/analyzer/utils/pcap.c new file mode 100644 index 0000000..cdefba7 --- /dev/null +++ b/analyzer/utils/pcap.c @@ -0,0 +1,36 @@ +#include "pcap.h" + +#include <netinet/if_ether.h> +#include <netinet/ip.h> +#include <netinet/tcp.h> + +const unsigned char *get_payload_from_packet(const unsigned char *packet, const struct pcap_pkthdr *packet_data, int *payload_len) { + // get Ethernet header + const struct ether_header *eth_header = (const struct ether_header *)packet; + int eth_header_len = sizeof(struct ether_header); + + // check if it's IP + if (ntohs(eth_header->ether_type) != ETHERTYPE_IP) { + *payload_len = -1; + return NULL; + } + + // get IP header + const struct ip *ip_header = (const struct ip *)(packet + eth_header_len); + int ip_header_len = ip_header->ip_hl * 4; + + // check if it's TCP + if (ip_header->ip_p != IPPROTO_TCP) { + *payload_len = -1; + return NULL; + } + + // get TCP header + const struct tcphdr *tcp_header = (const struct tcphdr *)(packet + eth_header_len + ip_header_len); + int tcp_header_len = tcp_header->th_off * 4; + + // get payload + int total_header_len = eth_header_len + ip_header_len + tcp_header_len; + *payload_len = packet_data->caplen - total_header_len; + return packet + total_header_len; +} |
