You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.1 KiB
96 lines
2.1 KiB
Patch by Gleb Paharenko <gpaharenko@gmail.com> for dsniff >= 2.4b1, which |
|
adds checksum for libnids. For further information, please have a look to |
|
Debian bug ID #420129. |
|
|
|
--- dsniff-2.4b1/dsniff.c 2007-08-11 01:37:33.000000000 -0300 |
|
+++ dsniff-2.4b1/dsniff.c.checksum 2007-08-11 01:38:55.000000000 -0300 |
|
@@ -70,6 +70,80 @@ |
|
{ |
|
} |
|
|
|
+ |
|
+static int get_all_ifaces(struct ifreq **, int *); |
|
+static unsigned int get_addr_from_ifreq(struct ifreq *); |
|
+ |
|
+int all_local_ipaddrs_chksum_disable() |
|
+{ |
|
+ struct ifreq *ifaces; |
|
+ int ifaces_count; |
|
+ int i, ind = 0; |
|
+ struct nids_chksum_ctl *ctlp; |
|
+ unsigned int tmp; |
|
+ |
|
+ if (!get_all_ifaces(&ifaces, &ifaces_count)) |
|
+ return -1; |
|
+ ctlp = |
|
+ (struct nids_chksum_ctl *) malloc(ifaces_count * |
|
+ sizeof(struct |
|
+ nids_chksum_ctl)); |
|
+ if (!ctlp) |
|
+ return -1; |
|
+ for (i = 0; i < ifaces_count; i++) { |
|
+ tmp = get_addr_from_ifreq(ifaces + i); |
|
+ if (tmp) { |
|
+ ctlp[ind].netaddr = tmp; |
|
+ ctlp[ind].mask = inet_addr("255.255.255.255"); |
|
+ ctlp[ind].action = NIDS_DONT_CHKSUM; |
|
+ ind++; |
|
+ } |
|
+ } |
|
+ free(ifaces); |
|
+ nids_register_chksum_ctl(ctlp, ind); |
|
+} |
|
+ |
|
+/* helper functions for Example 2 */ |
|
+unsigned int get_addr_from_ifreq(struct ifreq *iface) |
|
+{ |
|
+ if (iface->ifr_addr.sa_family == AF_INET) |
|
+ return ((struct sockaddr_in *) &(iface->ifr_addr))-> |
|
+ sin_addr.s_addr; |
|
+ return 0; |
|
+} |
|
+ |
|
+static int get_all_ifaces(struct ifreq **ifaces, int *count) |
|
+{ |
|
+ int ifaces_size = 8 * sizeof(struct ifreq); |
|
+ struct ifconf param; |
|
+ int sock; |
|
+ unsigned int i; |
|
+ |
|
+ *ifaces = malloc(ifaces_size); |
|
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); |
|
+ if (sock <= 0) |
|
+ return 0; |
|
+ for (;;) { |
|
+ param.ifc_len = ifaces_size; |
|
+ param.ifc_req = *ifaces; |
|
+ if (ioctl(sock, SIOCGIFCONF, ¶m)) |
|
+ goto err; |
|
+ if (param.ifc_len < ifaces_size) |
|
+ break; |
|
+ free(*ifaces); |
|
+ ifaces_size *= 2; |
|
+ ifaces = malloc(ifaces_size); |
|
+ } |
|
+ *count = param.ifc_len / sizeof(struct ifreq); |
|
+ close(sock); |
|
+ return 1; |
|
+ err: |
|
+ close(sock); |
|
+ return 0; |
|
+} |
|
+ |
|
+ |
|
+ |
|
int |
|
main(int argc, char *argv[]) |
|
{ |
|
@@ -189,6 +263,8 @@ |
|
warnx("using %s", nids_params.filename); |
|
} |
|
} |
|
+ |
|
+ all_local_ipaddrs_chksum_disable(); |
|
|
|
nids_run(); |
|
|
|
|