From 0b5d4b61e7d132705a5da0705941b4abba2358e1 Mon Sep 17 00:00:00 2001 From: NeroProtagonist Date: Fri, 1 Mar 2024 22:22:38 +0100 Subject: [PATCH] All external binaries/platforms are now compiled with API 21. Added printing of IPv6 TCP/UDP/ICMPv6 packets with nflog. --- app/src/main/res/raw/nflog_arm | Bin 21768 -> 21808 bytes app/src/main/res/raw/nflog_mips | Bin 71268 -> 71260 bytes app/src/main/res/raw/nflog_x86 | Bin 21720 -> 25796 bytes external/Makefile | 10 +-- external/nflog/nflog.c | 138 +++++++++++++++++++++++--------- jni/Application.mk | 2 +- 6 files changed, 104 insertions(+), 46 deletions(-) diff --git a/app/src/main/res/raw/nflog_arm b/app/src/main/res/raw/nflog_arm index 14da9b4b5f499bb8636376ba42cc27ea56f76c61..6e11b6ef8e086588ba6ecf73dc5517a70bbb8630 100644 GIT binary patch literal 21808 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 literal 21768 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 literal 71268 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 P>0CMZ-f}WfhwuLaR--=S diff --git a/app/src/main/res/raw/nflog_x86 b/app/src/main/res/raw/nflog_x86 index 3b677047a4d5975cc3138131f5e07092ab582ca0..ffef8212b3ce773ca6ca78fd7bf979ad91fb8b6f 100644 GIT binary patch literal 25796 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

7caB$g4cbQC5q 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 literal 21720 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 gs`uWYwi5Wf_cY<2Ue7ksRHngqz #include #include +#include +#include +#include #include #include #include -#include +#include +#include #include #include #include @@ -48,6 +52,12 @@ static int parse_attr_cb(const struct nlattr *attr, void *data) return MNL_CB_OK; switch(type) { + case NFULA_HWTYPE: + if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0) { + perror("mnl_attr_validate"); + return MNL_CB_ERROR; + } + break; case NFULA_MARK: case NFULA_IFINDEX_INDEV: case NFULA_IFINDEX_OUTDEV: @@ -72,6 +82,13 @@ static int parse_attr_cb(const struct nlattr *attr, void *data) return MNL_CB_ERROR; } break; + case NFULA_PACKET_HDR: + if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, + sizeof(struct nfulnl_msg_packet_hdr)) < 0) { + perror("mnl_attr_validate"); + return MNL_CB_ERROR; + } + break; case NFULA_PREFIX: if (mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0) { perror("mnl_attr_validate"); @@ -173,48 +190,91 @@ static int log_cb(const struct nlmsghdr *nlh, void *data) printf("OUT= "); } + uint16_t hwProtocol = 0; + if (tb[NFULA_PACKET_HDR]) { + struct nfulnl_msg_packet_hdr* pktHdr = (struct nfulnl_msg_packet_hdr*)mnl_attr_get_payload(tb[NFULA_PACKET_HDR]); + hwProtocol = ntohs(pktHdr->hw_protocol); + } + if (tb[NFULA_PAYLOAD]) { - struct iphdr *iph = (struct iphdr *) mnl_attr_get_payload(tb[NFULA_PAYLOAD]); - - printf("SRC=%u.%u.%u.%u DST=%u.%u.%u.%u ", - ((unsigned char *)&iph->saddr)[0], - ((unsigned char *)&iph->saddr)[1], - ((unsigned char *)&iph->saddr)[2], - ((unsigned char *)&iph->saddr)[3], - ((unsigned char *)&iph->daddr)[0], - ((unsigned char *)&iph->daddr)[1], - ((unsigned char *)&iph->daddr)[2], - ((unsigned char *)&iph->daddr)[3]); - - printf("LEN=%u ", ntohs(iph->tot_len)); - - switch(iph->protocol) - { - case IPPROTO_TCP: - { - struct tcphdr *th = (struct tcphdr *) ((__u32 *) iph + iph->ihl); - printf("PROTO=TCP SPT=%u DPT=%u ", - ntohs(th->source), ntohs(th->dest)); - break; - } - case IPPROTO_UDP: - { - struct udphdr *uh = (struct udphdr *) ((__u32 *) iph + iph->ihl); - printf("PROTO=UDP SPT=%u DPT=%u LEN=%u ", - ntohs(uh->source), ntohs(uh->dest), ntohs(uh->len)); - break; - } - case IPPROTO_ICMP: + + switch (hwProtocol) { + case ETH_P_IP: { + struct iphdr *iph = (struct iphdr *) mnl_attr_get_payload(tb[NFULA_PAYLOAD]); + + char addressStr[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &iph->saddr, addressStr, sizeof(addressStr)); + printf("SRC=%s ", addressStr); + inet_ntop(AF_INET, &iph->daddr, addressStr, sizeof(addressStr)); + printf("DST=%s ", addressStr); + + printf("LEN=%u ", ntohs(iph->tot_len)); + + switch(iph->protocol) { - struct icmphdr *ich = (struct icmphdr *) ((__u32 *) iph + iph->ihl); - printf("PROTO=ICMP TYPE=%u CODE=%u ", - ich->type, ich->code); - break; + case IPPROTO_TCP: + { + struct tcphdr *th = (struct tcphdr *) ((__u32 *) iph + iph->ihl); + printf("PROTO=TCP SPT=%u DPT=%u ", + ntohs(th->source), ntohs(th->dest)); + break; + } + case IPPROTO_UDP: + { + struct udphdr *uh = (struct udphdr *) ((__u32 *) iph + iph->ihl); + printf("PROTO=UDP SPT=%u DPT=%u LEN=%u ", + ntohs(uh->source), ntohs(uh->dest), ntohs(uh->len)); + break; + } + case IPPROTO_ICMP: + { + struct icmphdr *ich = (struct icmphdr *) ((__u32 *) iph + iph->ihl); + printf("PROTO=ICMP TYPE=%u CODE=%u ", + ich->type, ich->code); + break; + } + default: + { + printf("PROTO=%u ", iph->protocol); + } } - default: - { - printf("PROTO=%u ", iph->protocol); + break; + } + case ETH_P_IPV6: { + struct ipv6hdr *iph = (struct ipv6hdr *) mnl_attr_get_payload(tb[NFULA_PAYLOAD]); + + char addressStr[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &iph->saddr, addressStr, sizeof(addressStr)); + printf("SRC=%s ", addressStr); + inet_ntop(AF_INET6, &iph->daddr, addressStr, sizeof(addressStr)); + printf("DST=%s ", addressStr); + + switch (iph->nexthdr) { + case IPPROTO_TCP: { + struct tcphdr *th = (struct tcphdr *) ((uint8_t*) iph + sizeof(*iph)); + printf("PROTO=TCP SPT=%u DPT=%u ", + ntohs(th->source), ntohs(th->dest)); + break; + } + case IPPROTO_UDP: { + struct udphdr *uh = (struct udphdr *) ((uint8_t *) iph + sizeof(*iph)); + printf("PROTO=UDP SPT=%u DPT=%u LEN=%u ", + ntohs(uh->source), ntohs(uh->dest), ntohs(uh->len)); + break; + } + case IPPROTO_ICMPV6: { + struct icmp6hdr *icmpv6h = (struct icmp6hdr *) ((uint8_t *) iph + sizeof(*iph)); + printf("PROTO=ICMP6 TYPE=%u CODE=%u ", icmpv6h->icmp6_type, icmpv6h->icmp6_code); + break; + } + default: { + printf("PROTO=%d ", iph->nexthdr); + break; + } } + } + default: + break; } } diff --git a/jni/Application.mk b/jni/Application.mk index 8746642a8..7d875afc8 100644 --- a/jni/Application.mk +++ b/jni/Application.mk @@ -1,2 +1,2 @@ APP_BUILD_SCRIPT = $(APP_PROJECT_PATH)/external/Android.mk -APP_PLATFORM = android-8 +#APP_PLATFORM = android-21 \ No newline at end of file