diff --git a/main.cpp b/main.cpp index 1a73cdf..2d5926d 100755 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,7 @@ #include "log.h" #include "lib/md5.h" #include "encrypt.h" +#include "git_version.h" #include #include #include @@ -2579,8 +2580,11 @@ int process_lower_level_arg()//handle --lower-level option } void print_help() { + char git_version_buf[100]={0}; + strncpy(git_version_buf,gitversion,10); printf("udp2raw-tunnel\n"); - printf("version: %s %s\n",__DATE__,__TIME__); + printf("build date:%s %s\n",__DATE__,__TIME__); + printf("git version: %s\n",git_version_buf); printf("repository: https://github.com/wangyu-/udp2raw-tunnel\n"); printf("\n"); printf("usage:\n"); @@ -2617,9 +2621,12 @@ void print_help() printf(" --sock-buf buf size for socket,>=10 and <=10240,unit:kbyte,default:1024\n"); printf(" --force-sock-buf bypass system limitation while setting sock-buf\n"); printf(" --seqmode seq increase mode for faketcp:\n"); - printf(" 0:dont increase\n"); - printf(" 1:increase every packet(default)\n"); - printf(" 2:increase randomly, about every 3 packets\n"); + printf(" 0:static header,do not increase seq and ack_seq\n"); + printf(" 1:increase seq for every packet,simply ack last seq\n"); + printf(" 2:increase seq randomly, about every 3 packets,simply ack last seq\n"); + printf(" 3:simulate an almost real seq/ack procedure(default)\n"); + printf(" 4:similiar to 3,but do not consider TCP Option Window_Scale,\n"); + printf(" maybe useful when firewall doesnt support TCP Option \n"); // printf("\n"); printf(" --lower-level send packets at OSI level 2, format:'if_name#dest_mac_adress'\n"); printf(" ie:'eth0#00:23:45:67:89:b9'.or try '--lower-level auto' to obtain\n"); @@ -3063,7 +3070,7 @@ void process_arg(int argc, char *argv[]) //process all options else if(strcmp(long_options[option_index].name,"seq-mode")==0) { sscanf(optarg,"%d",&seq_mode); - if(0<=seq_mode&&seq_mode<=3) + if(0<=seq_mode&&seq_mode<=max_seq_mode) { } else diff --git a/makefile b/makefile index 641c49c..a7e9964 100755 --- a/makefile +++ b/makefile @@ -13,48 +13,48 @@ NAME=udp2raw TARGETS=amd64 mips34kc arm amd64_hw_aes arm_asm_aes mips34kc_asm_aes x86 x86_asm_aes TAR=${NAME}_binaries.tar.gz `echo ${TARGETS}|sed -r 's/([^ ]+)/udp2raw_\1/g'` -all: +all:git_version rm -f ${NAME} ${cc_local} -o ${NAME} -I. ${SOURCES} ${FLAGS} -lrt -ggdb -static -O3 -fast: +fast: git_version rm -f ${NAME} ${cc_local} -o ${NAME} -I. ${SOURCES} ${FLAGS} -lrt -ggdb -debug: +debug: git_version rm -f ${NAME} ${cc_local} -o ${NAME} -I. ${SOURCES} ${FLAGS} -lrt -Wformat-nonliteral -D MY_DEBUG -debug2: +debug2: git_version rm -f ${NAME} ${cc_local} -o ${NAME} -I. ${SOURCES} ${FLAGS} -lrt -Wformat-nonliteral -ggdb -mips34kc: +mips34kc: git_version ${cc_mips34kc} -o ${NAME}_$@ -I. ${SOURCES} ${FLAGS} -lrt -lgcc_eh -static -O3 -mips34kc_asm_aes: +mips34kc_asm_aes: git_version ${cc_mips34kc} -o ${NAME}_$@ -I. ${SOURCES_AES_ACC} ${FLAGS} -lrt -lgcc_eh -static -O3 lib/aes_acc/asm/mips_be.S #bcm2708: # ${cc_bcm2708} -o ${NAME}_bcm2708 -I. ${SOURCES} ${FLAGS} -lrt -static -O3 -amd64: +amd64:git_version ${cc_local} -o ${NAME}_$@ -I. ${SOURCES} ${FLAGS} -lrt -static -O3 -amd64_hw_aes: +amd64_hw_aes:git_version ${cc_local} -o ${NAME}_$@ -I. ${SOURCES_AES_ACC} ${FLAGS} -lrt -static -O3 lib/aes_acc/asm/x64.S -x86: +x86:git_version ${cc_local} -o ${NAME}_$@ -I. ${SOURCES} ${FLAGS} -lrt -static -O3 -m32 -x86_asm_aes: +x86_asm_aes:git_version ${cc_local} -o ${NAME}_$@ -I. ${SOURCES_AES_ACC} ${FLAGS} -lrt -static -O3 -m32 lib/aes_acc/asm/x86.S -arm: +arm:git_version ${cc_arm} -o ${NAME}_$@ -I. ${SOURCES} ${FLAGS} -lrt -static -O3 -arm_asm_aes: +arm_asm_aes:git_version ${cc_arm} -o ${NAME}_$@ -I. ${SOURCES_AES_ACC} ${FLAGS} -lrt -static -O3 lib/aes_acc/asm/arm.S -cross: +cross:git_version ${cc_cross} -o ${NAME}_cross -I. ${SOURCES} ${FLAGS} -lrt -O3 -cross2: +cross2:git_version ${cc_cross} -o ${NAME}_cross -I. ${SOURCES} ${FLAGS} -lrt -static -lgcc_eh -O3 -cross3: +cross3:git_version ${cc_cross} -o ${NAME}_cross -I. ${SOURCES} ${FLAGS} -lrt -static -O3 release: ${TARGETS} @@ -63,4 +63,8 @@ release: ${TARGETS} clean: rm -f ${TAR} rm -f udp2raw udp2raw_cross udp2raw_cmake + rm -f git_version.h + +git_version: + echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > git_version.h diff --git a/network.cpp b/network.cpp index a26e3ab..a8b69ec 100644 --- a/network.cpp +++ b/network.cpp @@ -12,7 +12,8 @@ int raw_recv_fd=-1; int raw_send_fd=-1; u32_t link_level_header_len=0;//set it to 14 if SOCK_RAW is used in socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); -int seq_mode=1; +int seq_mode=3; +int max_seq_mode=4; int filter_port=-1; @@ -31,6 +32,10 @@ unsigned char dest_hw_addr[sizeof(sockaddr_ll::sll_addr)]= {0xff,0xff,0xff,0xff,0xff,0xff,0,0}; //{0x00,0x23,0x45,0x67,0x89,0xb9}; +const u32_t receive_window_lower_bound=40960; +const u32_t receive_window_random_range=512; +const unsigned char wscale=0x05; + struct sock_filter code_tcp_old[] = { { 0x28, 0, 0, 0x0000000c },//0 { 0x15, 0, 10, 0x00000800 },//1 @@ -146,6 +151,7 @@ packet_info_t::packet_info_t() ts_ack=0; syn=0; ack=1; + ack_seq_counter=0; //mylog(log_info,"\n",ts_ack); } @@ -925,7 +931,7 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { send_raw_tcp_buf[i++] = 0x01; send_raw_tcp_buf[i++] = 0x03; send_raw_tcp_buf[i++] = 0x03; - send_raw_tcp_buf[i++] = 0x05; + send_raw_tcp_buf[i++] = wscale; } else { tcph->doff = 8; int i = sizeof(pseudo_header)+sizeof(tcphdr); @@ -954,7 +960,7 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { tcph->urg = 0; //tcph->window = htons((uint16_t)(1024)); - tcph->window = htons((uint16_t) (10240 + random() % 100)); + tcph->window = htons((uint16_t) (receive_window_lower_bound + random() % receive_window_random_range)); tcph->check = 0; //leave checksum 0 now, filled later by pseudo header tcph->urg_ptr = 0; @@ -1413,7 +1419,20 @@ int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen) recv_info.dst_port=ntohs(tcph->dest); recv_info.seq=ntohl(tcph->seq); + + // recv_info.last_last_ack_seq=recv_info.last_ack_seq; + //recv_info.last_ack_seq=recv_info.ack_seq; + u32_t last_ack_seq=recv_info.ack_seq; recv_info.ack_seq=ntohl(tcph->ack_seq); + if(recv_info.ack_seq==last_ack_seq) + { + recv_info.ack_seq_counter++; + } + else + { + recv_info.ack_seq_counter=0; + } + recv_info.psh=tcph->psh; if(tcph->rst==1) @@ -1649,6 +1668,35 @@ int after_send_raw0(raw_info_t &raw_info) if (random() % 5 == 3) send_info.seq += raw_info.send_info.data_len; //////////////////modify } + else if(seq_mode==3||seq_mode==4) + { + send_info.seq += raw_info.send_info.data_len; + + u32_t window_size; + + if(seq_mode==3) + { + window_size=(u32_t)((u32_t)receive_window_lower_bound<<(u32_t)wscale); + } + else//seq_mode==4 + { + window_size=(u32_t)((u32_t)receive_window_lower_bound); + } + + if(larger_than_u32(send_info.seq+max_data_len,recv_info.ack_seq+window_size)) + { + send_info.seq=raw_info.recv_info.ack_seq; + } + if(recv_info.ack_seq_counter>=3) + { + recv_info.ack_seq_counter=0; + send_info.seq=raw_info.recv_info.ack_seq; + } + if(larger_than_u32(raw_info.recv_info.ack_seq,send_info.seq)) //for further use,currently not useful. + { + send_info.seq=raw_info.recv_info.ack_seq; + } + } } } if(raw_mode==mode_icmp) @@ -1676,11 +1724,12 @@ int after_recv_raw0(raw_info_t &raw_info) if(larger_than_u32(recv_info.seq+raw_info.recv_info.data_len,send_info.ack_seq)) send_info.ack_seq = recv_info.seq+raw_info.recv_info.data_len;//TODO only update if its larger } - else if(seq_mode==3) + else if(seq_mode==3||seq_mode==4) { - if(recv_info.seq==send_info.ack_seq+1) + if(recv_info.seq==send_info.ack_seq) { - send_info.ack_seq=recv_info.seq+raw_info.recv_info.data_len; + send_info.ack_seq=recv_info.seq+raw_info.recv_info.data_len;//currently we dont remembr tcp segments,this is the simplest way + //TODO implement tcp segment remembering and SACK. } } } diff --git a/network.h b/network.h index 0417e6f..cf577c2 100644 --- a/network.h +++ b/network.h @@ -11,6 +11,7 @@ extern int raw_recv_fd; extern int raw_send_fd; extern int seq_mode; +extern int max_seq_mode; extern int filter_port; extern u32_t bind_address_uint32; extern int disable_bpf_filter; @@ -54,6 +55,7 @@ struct packet_info_t //todo change this to union u32_t seq,ack_seq; + u32_t ack_seq_counter; u32_t ts,ts_ack;