caseHTTP_TYPE:{snprintf((char*)buff,sizeof(buff),"CONNECT %s:%d HTTP/1.0\r\n",dns_name,ntohs(port));strcat((char*)buff,"\r\n");len=strlen((char*)buff);if(len!=(size_t)send(sock,buff,len,0))gotoerr;len=0;// read header byte by byte.while(len<BUFF_SIZE){if(1==read_n_bytes(sock,(char*)(buff+len),1))len++;elsegotoerr;if(len>4&&buff[len-1]=='\n'&&buff[len-2]=='\r'&&buff[len-3]=='\n'&&buff[len-4]=='\r')break;}// if not ok (200) or response greather than BUFF_SIZE return BLOCKED;if(len==BUFF_SIZE||!(buff[9]=='2'&&buff[10]=='0'&&buff[11]=='0'))returnBLOCKED;returnSUCCESS;}break;
staticONCE:std::sync::Once=std::sync::Once::new();/// This is called when our dynamic library is loaded, so we setup our internals/// here.#[no_mangle]#[link_section = ".init_array"]staticLD_PRELOAD_INIT:extern"C"fn()=self::init;extern"C"fninit(){ONCE.call_once(||{letconfig=&*core::CONFIG;std::env::set_var("RUST_LOG",config.log_level.to_string());pretty_env_logger::init();debug!("init pid: {}",std::process::id());info!("chain_type: {:?}",config.chain_type);info!("proxies:");forpin&config.proxies{info!("\t{}",p);}});}
“.init_array”这个段是 ELF(Executable and Linkable Format)文件格式的一部分,专门用于存放初始化函数。在程序启动时,操作系统会调用这个段中的所有函数,以执行一些初始化操作。
这种模式通常用于实现动态库中的初始化逻辑,在使用 LD_PRELOAD 进行函数钩挂(hooking)时。通过将初始化代码放入 .init_array 中,可以确保在共享库加载时自动调用这些初始化函数,而不需要在主程序中显式地调用它们。
tokio::spawn(asyncmove{letconnection=unsafe{(*CONNECTIONS).get_mut(&fd)}.unwrap();lettarget=connection.target_addr.clone();let(connection_reader,connection_writer)=connection.split();letstream=ProxyChains::connect(target,config()).await;matchstream{Ok(mutstream)=>{let(mutreader,mutwriter)=stream.split();let_=futures::join!(copy(connection_reader,&mutwriter),copy(&mutreader,connection_writer));},Err(e)=>eprintln!("Failed to create proxychains. {}",e.to_string()),}});