@ -124,6 +124,7 @@ static struct option long_options[] = {
{ " dnsv6-port " , required_argument , 0 , ' @ ' } ,
{ " dns-verb " , no_argument , 0 , ' v ' } ,
{ " blacklist " , required_argument , 0 , ' b ' } ,
{ " whitelist " , required_argument , 0 , ' h ' } ,
{ " ip-id " , required_argument , 0 , ' i ' } ,
{ 0 , 0 , 0 , 0 }
} ;
@ -353,7 +354,8 @@ int main(int argc, char *argv[]) {
do_http_allports = 0 ,
do_host_mixedcase = 0 ,
do_dnsv4_redirect = 0 , do_dnsv6_redirect = 0 ,
do_dns_verb = 0 , do_blacklist = 0 ;
do_dns_verb = 0 ,
do_blacklist = 0 , do_whitelist = 0 ;
unsigned int http_fragment_size = 0 ;
unsigned int https_fragment_size = 0 ;
uint32_t dnsv4_addr = 0 ;
@ -567,6 +569,13 @@ int main(int argc, char *argv[]) {
exit ( EXIT_FAILURE ) ;
}
break ;
case ' h ' :
do_whitelist = 1 ;
if ( ! blackwhitelist_load_list ( optarg ) ) {
printf ( " Can't load whitelist from file! \n " ) ;
exit ( EXIT_FAILURE ) ;
}
break ;
default :
puts ( " Usage: goodbyedpi.exe [OPTION...] \n "
" -p block passive DPI \n "
@ -588,6 +597,8 @@ int main(int argc, char *argv[]) {
" --dns-verb print verbose DNS redirection messages \n "
" --blacklist [txtfile] perform HTTP tricks only to host names and subdomains from \n "
" supplied text file. This option can be supplied multiple times. \n "
" --whitelist [txtfile] Do not perform HTTP tricks to host names and subdomains from \n "
" supplied text file. This option can be supplied multiple times. \n "
" \n "
" -1 -p -r -s -f 2 -k 2 -n -e 2 (most compatible mode, default) \n "
" -2 -p -r -s -f 2 -k 2 -n -e 40 (better speed for HTTPS yet still compatible) \n "
@ -597,6 +608,11 @@ int main(int argc, char *argv[]) {
}
}
if ( do_blacklist & & do_whitelist ) {
printf ( " Can't use blacklist and whitelist at the same time! \n " ) ;
exit ( EXIT_FAILURE ) ;
}
if ( ! http_fragment_size )
http_fragment_size = 2 ;
if ( ! https_fragment_size )
@ -741,6 +757,7 @@ int main(int argc, char *argv[]) {
if ( find_header_and_get_info ( packet_data , packet_dataLen ,
http_host_find , & hdr_name_addr , & hdr_value_addr , & hdr_value_len ) & &
hdr_value_len > 0 & & hdr_value_len < = HOST_MAXLEN & &
( do_whitelist ? ! blackwhitelist_check_hostname ( hdr_value_addr , hdr_value_len ) : 1 ) & &
( do_blacklist ? blackwhitelist_check_hostname ( hdr_value_addr , hdr_value_len ) : 1 ) )
{
host_addr = hdr_value_addr ;