⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.c

📁 openswan
💻 C
字号:
#include "ipsec_hack.h"int read_hex_int(char *c) {	unsigned int result = 0;	while (*c != '\0') {				if (*c >= '0' && *c <= '9')			result = (result<<4)|(*c - '0');		if (*c >= 'a' && *c <= 'f')			result = (result<<4)|(*c - 'a' + 10);		c++;	}	return result;}u8 read_nyble(FILE *fp, int *err) {	u8 result;	int temp;	u8 flag = 0;	while ((temp = fgetc(fp)) != EOF) {		if ((temp == ' ' || temp == '\n') && flag == 0) 			continue;		else if ((temp == ' ' || temp == '\n') && flag != 0)			break;		else			flag++;		if (temp >= '0' && temp <= '9') 			result = (result<<4)|(temp - '0');		else if (temp >= 'a' && temp <= 'f') 			result = (result<<4)|(temp - 'a' + 10);		else if (temp >= 'F' && temp <= 'F') 			result = (result<<4)|(temp - 'a' + 10);		if (flag > 1)			break;	}		if (temp == EOF)	        *err = EOF;	return result;}u8 read_byte(u8 *c, u8 endmark) {	u8 result = 0;	while (*c != endmark && *c != '\0') {				if (*c >= '0' && *c <= '9')			result = (result<<4)|(*c - '0');		if (*c >= 'a' && *c <= 'f')			result = (result<<4)|(*c - 'a' + 10);		c++;	}	return result;	}void read_mac(u8 *c, u8 *mac) {	/* This function assumes that mac is format xx:xx:xx:xx:xx:xx */	int i;	for (i = 0; i < 6; i++) {		mac[i] = read_byte(c + (i * 3), ':');	}} void read_block(u8 *c, u8 *block) {	/* This function assumes that block is format xx:xx:xx:xx:xx:xx:xx:xx */	int i;	for (i = 0; i < 8; i++) {		block[i] = read_byte(c + (i * 3), ':');	}} u32 read_dotted_ipv4_address(u8 *str) {	u32 result = 0;	u8 temp = 0;	while (*str != '\0') {		if (*str >= '0' && *str <= '9') {			temp *= 10;			temp += *str - '0';		} else if (*str == '.') {			result = (result<<8)|temp;			temp = 0;		}		str++;	}       	result = (result<<8)|temp;	return result;}u16 ipheader_checksum(u16 *buffer, u16 len) {        u32 check=0;        while(len-->0)                check+=(u32)(*buffer++);        while(check>>16)                check=(check&0x0000ffff)+(check>>16);        return((u16)(check==0?0:~check));}/* * Not limited to even length as in ipheader_checksum().. */u16 compute_checksum(u8 *b, u32 len){    u32 csum = 0;    u32 overf;    while (len > 1) {	csum += (u32)*((u16 *)b)++;	len -= 2;    }    if (len)	csum += (u32)htons((u16)(*b << 8));    while (overf = csum >> 16)	csum = (csum & 0xFFFF) + overf;    return (u16)~csum;}u16 compute_tcpudp_checksum(u32 sourceip,			     u32 destip,			     u8 protocol,			     u16 datalen,			     u8 *data){    u32 pseudohdr[3];    u32 csum;    pseudohdr[0] = htonl(sourceip);    pseudohdr[1] = htonl(destip);    ((u8 *)&pseudohdr[2])[0] = 0;    ((u8 *)&pseudohdr[2])[1] = protocol;    ((u16 *)&pseudohdr[2])[1] = htons(datalen);    csum = (~compute_checksum((u8 *)pseudohdr, 12) & 0xFFFF) +	(~compute_checksum(data, datalen) & 0xFFFF);    if (csum & 0xFFFF0000)	csum = (csum + 1) & 0xFFFF;    return (u16)~csum;}void ipv4_print_address(u32 address){        printf("%ld.%ld.%ld.%ld",	       ((address & 0x000000ff) >> 0),               ((address & 0x0000ff00) >> 8),               ((address & 0x00ff0000) >> 16),               ((address & 0xff000000) >> 24));}void parse_option(char *arg, option_data *opt) {	if (strncmp("file=", arg, 5) == 0) {		read_arguments_from_file((arg+5), opt);	}	if (strncmp("src=", arg, 4) == 0) {		opt->src_address = read_dotted_ipv4_address(arg+4);	}	if (strncmp("dst=", arg, 4) == 0) {		opt->dst_address = read_dotted_ipv4_address(arg+4);	}	if (strncmp("fake_src=", arg, 9) == 0) {		opt->fake_src_address = read_dotted_ipv4_address(arg+9);	}	if (strncmp("gw=", arg, 3) == 0) {		opt->gw = read_dotted_ipv4_address(arg+3);	}	if (strncmp("fake_dst=", arg, 9) == 0) {		opt->fake_dst_address = read_dotted_ipv4_address(arg+9);	}	if (strncmp("spi=", arg, 4) == 0) {		opt->spi = read_hex_int(arg+4);	}	if (strncmp("lif=", arg, 4) == 0) {		strcpy(opt->listen_if, (arg+4));	}	if (strncmp("sif=", arg, 4) == 0) {		strcpy(opt->send_if, (arg+4));	}	if (strncmp("guess=", arg, 6) == 0) {		read_block((arg+6), opt->guess);	}	if (strncmp("block=", arg, 6) == 0) {		read_block((arg+6), opt->block_to_crack);	}	if (strncmp("oiv=", arg, 4) == 0) {		read_block((arg+4), opt->original_iv);	}	if (strncmp("dmac=", arg, 5) == 0) {		read_mac((arg+5), opt->dmac);	}	if (strncmp("-h", arg, 2) == 0) {		printf("Usage: ipsec_hack [options]\n");		printf("Options:\n");		printf("\tfile={filename}\t\t\t read options from file\n");		printf("\tsrc={dotted IPv4 address}\t source address of the IPsec connection\n");		printf("\tdst={dotted IPv4 address}\t destination address of the IPsec connection\n");		printf("\tfake_src={dotted IPv4 address}\t source address of the attack packet\n");		printf("\tfake_dst={dotted IPv4 address}\t destination address of the attack packet\n");		printf("\tspi={hex int}\t\t\t SPI of the IPsec connection\n");		printf("\tlif={interface name}\t\t name of the listening interface\n"); 		printf("\tsif={interface name}\t\t name of the interface where the attack packets are sent\n"); 		printf("\tguess={xx:xx:xx:xx:xx:xx:xx:xx}\t first guess of the plaintext block\n");		printf("\tblock={xx:xx:xx:xx:xx:xx:xx:xx}\t block to crack\n");		printf("\toiv={xx:xx:xx:xx:xx:xx:xx:xx}\t IV used to enrypt the block\n");		printf("\tdmac={xx:xx:xx:xx:xx:xx}\t MAC address of the gateway\n");		printf("\t\t\t\t\t used to send attack packets\n");		printf("\t-v\t\t\t\t verbose mode\n");		printf("\t-vv\t\t\t\t more verbose mode\n");		printf("\t-s\t\t\t\t exit if SPI between src and dst not seen for n seconds\n");		printf("\t-i{int}\t\t\t\t packet counter reporting interval (default is 1000)\n");		printf("\t-w{int}\t\t\t\t seconds to wait before existing if SPI not seen\n");		printf("\t-cd\t\t\t\t allow random reserved bit in IP header (default is NO)\n");		exit(1);	}	if (strncmp("-v", arg, 2) == 0) {		opt->verbose = 1;	}	if (strncmp("-vv", arg, 3) == 0) {		opt->verbose = 2;	}	if (strncmp("-s", arg, 2) == 0) {		opt->spi_change_detection = 1;	}	if (strncmp("-i", arg, 2) == 0) {		opt->packet_print_intervall = atoi(arg+2);	}	if (strncmp("-w", arg, 2) == 0) {		opt->spi_wait_time = atoi(arg+2);	}	if (strncmp("-ch", arg, 3) == 0) {		opt->rsv_bit = 0;	}		}int read_arguments_from_file(char *fname, option_data *opt) {	char line_buf[100];	char *bp;	char c;	FILE *fp;	fp = fopen(fname,"r");	if (fp == NULL) {		printf("Error opening file %s\n",fname);		return -1;	}	bp = line_buf;	while ((c = fgetc(fp)) != EOF) {		if (c == '\n') {			*bp = '\0';			parse_option(line_buf, opt);			bp = line_buf;			continue;		}		*bp = c;		bp++;			}	fclose(fp);	return 1;}int read_arguments(int argc, char *argv[], option_data *opt) {	for (; argc > 1; argc--) {		parse_option(argv[argc-1], opt);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -