From d95ef42d487c7d972729abbfd393e0e3bd243e65 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 00:16:00 +0200 Subject: [PATCH 01/21] externalize some variables, which are used from both C files --- src/core.h | 48 ++++++++++++++++++++------------------------ src/libproxychains.c | 7 +++++++ 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/core.h b/src/core.h index 2a1d49d..57d9290 100644 --- a/src/core.h +++ b/src/core.h @@ -4,10 +4,8 @@ begin : Tue May 14 2002 copyright : netcreature (C) 2002 email : netcreature@users.sourceforge.net - ***************************************************************************/ -#include - /* GPL */ -/*************************************************************************** + *************************************************************************** + *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -15,6 +13,9 @@ * (at your option) any later version. * * * ***************************************************************************/ + +#include + #ifndef __CORE_HEADER #define __CORE_HEADER #define BUFF_SIZE 8*1024 // used to read responses from proxies. @@ -104,34 +105,29 @@ int connect_proxy_chain (int sock, ip_type target_ip, unsigned short target_port int proxychains_write_log(char *str,...); typedef int (*connect_t)(int, const struct sockaddr *, socklen_t); -connect_t true_connect; - typedef struct hostent* (*gethostbyname_t)(const char *); -gethostbyname_t true_gethostbyname; - -typedef int (*getaddrinfo_t)(const char *, const char *, - const struct addrinfo *, - struct addrinfo **); -getaddrinfo_t true_getaddrinfo; - typedef int (*freeaddrinfo_t)(struct addrinfo *); -freeaddrinfo_t true_freeaddrinfo; - -typedef int (*getnameinfo_t) (const struct sockaddr *, - socklen_t, char *, - socklen_t, char *, - socklen_t, int); -getnameinfo_t true_getnameinfo; - typedef struct hostent *(*gethostbyaddr_t) (const void *, socklen_t, int); -gethostbyaddr_t true_gethostbyaddr; + +typedef int (*getaddrinfo_t)(const char *, const char *, const struct addrinfo *, + struct addrinfo **); + +typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *, + socklen_t, char *, socklen_t, int); + + +extern connect_t true_connect; +extern gethostbyname_t true_gethostbyname; +extern getaddrinfo_t true_getaddrinfo; +extern freeaddrinfo_t true_freeaddrinfo; +extern getnameinfo_t true_getnameinfo; +extern gethostbyaddr_t true_gethostbyaddr; + struct hostent* proxy_gethostbyname(const char *name); -int proxy_getaddrinfo(const char *node, const char *service, - const struct addrinfo *hints, - struct addrinfo **res); - +int proxy_getaddrinfo(const char *node, const char *service, + const struct addrinfo *hints, struct addrinfo **res); void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes); diff --git a/src/libproxychains.c b/src/libproxychains.c index 3c4d7a2..d255952 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -43,6 +43,13 @@ #define SOCKFAMILY(x) (satosin(x)->sin_family) #define MAX_CHAIN 512 +connect_t true_connect; +gethostbyname_t true_gethostbyname; +getaddrinfo_t true_getaddrinfo; +freeaddrinfo_t true_freeaddrinfo; +getnameinfo_t true_getnameinfo; +gethostbyaddr_t true_gethostbyaddr; + int tcp_read_time_out; int tcp_connect_time_out; chain_type proxychains_ct; From 2c9c4d9da71af2b47882c2a020afcfc469d664d8 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 00:27:46 +0200 Subject: [PATCH 02/21] simplify load_sym code and remove potential aliasing violation. --- src/libproxychains.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index d255952..88d74c7 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -70,49 +70,41 @@ static int init_l = 0; static inline void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_type * ct); -static void load_sym(void** funcptr, char* symname, void* proxyfunc) { +static void* load_sym(char* symname, void* proxyfunc) { - *funcptr = dlsym(RTLD_NEXT, symname); + void *funcptr = dlsym(RTLD_NEXT, symname); - if(!(*funcptr)) { + if(!funcptr) { fprintf(stderr, "Cannot load symbol '%s' %s\n", symname, dlerror()); exit(1); } else { PDEBUG("loaded symbol '%s'" " real addr %p wrapped addr %p\n", symname, (*funcptr), proxyfunc); } - if((*funcptr) == proxyfunc) { + if(funcptr == proxyfunc) { PDEBUG("circular reference detected, aborting!\n"); abort(); } + return funcptr; } #define INIT() init_lib_wrapper(__FUNCTION__) +#define SETUP_SYM(X) do { true_ ## X = load_sym( # X, X ); } while(0) + static void do_init(void) { - static const struct override_info { - void* funcptr; - char* symname; - void* proxyfunc; - } override_symbols[] = { - #define SYM_ENTRY(X) { .funcptr = &true_ ## X, .symname = # X, .proxyfunc = X,} - SYM_ENTRY(connect), - SYM_ENTRY(gethostbyname), - SYM_ENTRY(getaddrinfo), - SYM_ENTRY(freeaddrinfo), - SYM_ENTRY(gethostbyaddr), - SYM_ENTRY(getnameinfo), - #undef SYM_ENTRY - }; - unsigned i; MUTEX_INIT(&internal_ips_lock, NULL); /* read the config file */ get_chain_data(proxychains_pd, &proxychains_proxy_count, &proxychains_ct); proxychains_write_log(LOG_PREFIX "DLL init\n"); - - for (i = 0; i < (sizeof(override_symbols) / sizeof(override_symbols[0])); i++) { - load_sym(override_symbols[i].funcptr, override_symbols[i].symname, override_symbols[i].proxyfunc); - } + + SETUP_SYM(connect); + SETUP_SYM(gethostbyname); + SETUP_SYM(getaddrinfo); + SETUP_SYM(freeaddrinfo); + SETUP_SYM(gethostbyaddr); + SETUP_SYM(getnameinfo); + init_l = 1; } From eb0db7221ae134c0276ad7e83c861416abf5293f Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 00:35:59 +0200 Subject: [PATCH 03/21] configure: add --help text --- configure | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/configure b/configure index cb00d57..0c51ece 100755 --- a/configure +++ b/configure @@ -2,6 +2,18 @@ prefix=/usr/local +usage() { + echo "supported arguments" + echo "--prefix=/path default: $prefix" + echo "--exec_prefix=/path default: $prefix/bin" + echo "--bindir=/path default: $prefix/bin" + echo "--libdir=/path default: $prefix/lib" + echo "--includedir=/path default: $prefix/include" + echo "--sysconfdir=/path default: $prefix/etc" + echo "--help : show this text" + exit 1 +} + spliteq() { arg=$1 echo "${arg#*=}" @@ -17,6 +29,7 @@ parsearg() { --libdir=*) libdir=`spliteq $1`;; --includedir=*) includedir=`spliteq $1`;; --sysconfdir=*) sysconfdir=`spliteq $1`;; + --help) usage;; esac } From 1fc7e38ee07c02c55a4f3a70b5bc1de979c847ea Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 04:09:50 +0200 Subject: [PATCH 04/21] fixup for d95ef42d487c7d9 --- src/libproxychains.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index 88d74c7..16b6e3d 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -78,7 +78,7 @@ static void* load_sym(char* symname, void* proxyfunc) { fprintf(stderr, "Cannot load symbol '%s' %s\n", symname, dlerror()); exit(1); } else { - PDEBUG("loaded symbol '%s'" " real addr %p wrapped addr %p\n", symname, (*funcptr), proxyfunc); + PDEBUG("loaded symbol '%s'" " real addr %p wrapped addr %p\n", symname, funcptr, proxyfunc); } if(funcptr == proxyfunc) { PDEBUG("circular reference detected, aborting!\n"); From 364c78597039d65f76b1f4cfc31ca58d31accfc7 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 04:12:17 +0200 Subject: [PATCH 05/21] print everything to stderr, and fflush on PDEBUG --- src/core.c | 23 ++++++++--------------- src/core.h | 2 +- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/core.c b/src/core.c index 439d41d..5e3f43a 100644 --- a/src/core.c +++ b/src/core.c @@ -230,26 +230,15 @@ static int timed_connect(int sock, const struct sockaddr *addr, socklen_t len) { pfd[0].events = POLLOUT; fcntl(sock, F_SETFL, O_NONBLOCK); ret = true_connect(sock, addr, len); -#ifdef DEBUG - if(ret == -1) - perror("true_connect"); - printf("\nconnect ret=%d\n", ret); - - fflush(stdout); -#endif + PDEBUG("\nconnect ret=%d\n", ret); + if(ret == -1 && errno == EINPROGRESS) { ret = poll_retry(pfd, 1, tcp_connect_time_out); -#ifdef DEBUG - printf("\npoll ret=%d\n", ret); - fflush(stdout); -#endif + PDEBUG("\npoll ret=%d\n", ret); if(ret == 1) { value_len = sizeof(socklen_t); getsockopt(sock, SOL_SOCKET, SO_ERROR, &value, &value_len); -#ifdef DEBUG - printf("\nvalue=%d\n", value); - fflush(stdout); -#endif + PDEBUG("\nvalue=%d\n", value); if(!value) ret = 0; else @@ -258,6 +247,10 @@ static int timed_connect(int sock, const struct sockaddr *addr, socklen_t len) { ret = -1; } } else { +#ifdef DEBUG + if(ret == -1) + perror("true_connect"); +#endif if(ret != 0) ret = -1; } diff --git a/src/core.h b/src/core.h index 57d9290..b1521f7 100644 --- a/src/core.h +++ b/src/core.h @@ -132,7 +132,7 @@ int proxy_getaddrinfo(const char *node, const char *service, void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes); #ifdef DEBUG -# define PDEBUG(fmt, args...) fprintf(stderr,"DEBUG:"fmt, ## args) +# define PDEBUG(fmt, args...) do { fprintf(stderr,"DEBUG:"fmt, ## args); fflush(stderr); } while(0) #else # define PDEBUG(fmt, args...) do {} while (0) #endif From 3004240462b480ca07bbe8360c700ac87b5c5964 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 21:23:39 +0200 Subject: [PATCH 06/21] slightly better error message --- src/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core.c b/src/core.c index 5e3f43a..b8fe08a 100644 --- a/src/core.c +++ b/src/core.c @@ -279,6 +279,8 @@ static int tunnel_to(int sock, ip_type ip, unsigned short port, proxy_type pt, c if(!dns_len) goto err; } + + PDEBUG("host dns %s\n", dns_name ? dns_name : ""); size_t ulen = strlen(user); size_t passlen = strlen(pass); @@ -616,7 +618,7 @@ static int chain_step(int ns, proxy_data * pfrom, proxy_data * pto) { break; case SOCKET_ERROR: pto->ps = DOWN_STATE; - proxychains_write_log("<--timeout\n"); + proxychains_write_log("<--socket error or timeout!\n"); close(ns); break; } From 1a02b9f82f37c4ff62e7eb56dbf153e4fff48d37 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 21:44:02 +0200 Subject: [PATCH 07/21] update README --- INSTALL | 13 ------------- README | 44 ++++++++++++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 25 deletions(-) delete mode 100644 INSTALL diff --git a/INSTALL b/INSTALL deleted file mode 100644 index f118af8..0000000 --- a/INSTALL +++ /dev/null @@ -1,13 +0,0 @@ -ProxyChains ver 3.1 Installation -======================= - -If you have installed other ver of proxychains "make uninstall" before installing this distribution - -unpack the .tar.gz , 'cd' to distribution directory and -run following commands (as root) -------------------------------------- -./configure -make -make install -------------------------------------- -that's all diff --git a/README b/README index c07f104..6ee1b8e 100644 --- a/README +++ b/README @@ -1,23 +1,43 @@ ProxyChains ver 4.0 README ========================== + ProxyChains is a UNIX program, that hooks network-related libc functions + in dynamically linked programs via a preloaded DLL and redirects the + connections through SOCKS4a/5 or HTTP proxies. + *********** ATTENTION *********** -this program works only on dynamically linked programs. -also both proxychains and the program to call must use -the same dynamic linker (i.e. same libc) + this program works only on dynamically linked programs. + also both proxychains and the program to call must use + the same dynamic linker (i.e. same libc) ********************************* +*** Known limitations of the current version: *** -This is Unix version only. + when a process forks, does a DNS lookup in the child, and then uses + the ip in the parent, the corresponding ip mapping will not be found. + this is because the fork can't write back into the parents mapping table. + IRSSI shows this behaviour, so you have to pass the resolved ip address + to it. (you can use the proxyresolv script (requires "dig") to do so) -How to mess with sources - How to Install : read INSTALL !!!!!! + this means that you can't currently use tor onion urls for irssi. + to solve this issue, an external data store (file, pipe, ...) has to + manage the dns <-> ip mapping. of course there has to be proper locking. + shm_open, mkstemp, are possible candidates for a file based approach, + the other option is to spawn some kind of server process that manages the + map lookups. since connect() etc are hooked, this must not be a TCP server. -This program forces any tcp connection made by any given tcp client -to follow through proxy (or proxy chain). It is a kind of proxifier. -It acts like sockscap / permeo / eborder driver ( intercepts TCP calls ) -It is FREE. + I am reluctant on doing this change, because the described behaviour + seems pretty idiotic (doing a fork only for a DNS lookup), and irssi + is currently the only known affected program. + +*** Installation *** + + # needs a working C compiler, preferably gcc + ./configure + make + sudo make install Changelog: ---------- @@ -74,21 +94,21 @@ proxychains looks for config file in following order: Usage Example: - bash$ proxychains telnet targethost.com + $ proxychains telnet targethost.com in this example it will run telnet through proxy(or chained proxies) specified by proxychains.conf Usage Example: - bash$ proxychains -f /etc/proxychains-other.conf targethost2.com + $ proxychains -f /etc/proxychains-other.conf targethost2.com in this example it will use different configuration file then proxychains.conf to connect to targethost2.com host. Usage Example: - bash$ proxyresolv targethost.com + $ proxyresolv targethost.com in this example it will resolve targethost.com through proxy(or chained proxies) specified by proxychains.conf From fba5f5694c1da1ff21039a4992ce3adda427f0fb Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 23:32:50 +0200 Subject: [PATCH 08/21] use config file lookup routine from a common place --- Makefile | 4 ++-- src/common.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ src/common.h | 4 ++++ src/libproxychains.c | 25 ++++++++++-------------- src/main.c | 39 ++----------------------------------- 5 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 src/common.c diff --git a/Makefile b/Makefile index d743efc..d6ee318 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ sysconfdir=$(prefix)/etc SRCS = $(sort $(wildcard src/*.c)) OBJS = $(SRCS:.c=.o) -LOBJS = src/core.o src/libproxychains.o +LOBJS = src/core.o src/common.o src/libproxychains.o CFLAGS += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe -DTHREAD_SAFE LDFLAGS = -shared -fPIC -ldl -lpthread @@ -63,7 +63,7 @@ $(LDSO_PATHNAME): $(LOBJS) $(CC) $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -o $@ $(LOBJS) $(ALL_TOOLS): $(OBJS) - $(CC) src/main.o -o $(PXCHAINS) + $(CC) src/main.o src/common.o -o $(PXCHAINS) .PHONY: all clean install diff --git a/src/common.c b/src/common.c new file mode 100644 index 0000000..8c4b993 --- /dev/null +++ b/src/common.c @@ -0,0 +1,46 @@ +#include "common.h" +#include +#include +#include + +static int check_path(char *path) { + if(!path) + return 0; + return access(path, R_OK) != -1; +} + +char *get_config_path(char* pbuf, size_t bufsize) { + char buf[512]; + // priority 1: env var PROXYCHAINS_CONF_FILE + char *path = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); + if(check_path(path)) + goto have; + + // priority 2; proxychains conf in actual dir + path = getcwd(buf, sizeof(buf)); + snprintf(pbuf, bufsize, "%s/%s", path, PROXYCHAINS_CONF_FILE); + path = pbuf; + if(check_path(path)) + goto have; + + // priority 3; $HOME/.proxychains/proxychains.conf + path = getenv("HOME"); + snprintf(pbuf, bufsize, "%s/.proxychains/%s", path, PROXYCHAINS_CONF_FILE); + path = pbuf; + if(check_path(path)) + goto have; + + // priority 4: $SYSCONFDIR/proxychains.conf + path = SYSCONFDIR "/" PROXYCHAINS_CONF_FILE; + if(check_path(path)) + goto have; + + // priority 5: /etc/proxychains.conf + path = "/etc/" PROXYCHAINS_CONF_FILE; + if(check_path(path)) + goto have; + + return NULL; + have: + return path; +} diff --git a/src/common.h b/src/common.h index ecfc33c..f4fd841 100644 --- a/src/common.h +++ b/src/common.h @@ -2,3 +2,7 @@ #define PROXYCHAINS_QUIET_MODE_ENV_VAR "PROXYCHAINS_QUIET_MODE" #define PROXYCHAINS_CONF_FILE "proxychains.conf" #define LOG_PREFIX "[proxychains] " + +#include + +char *get_config_path(char* pbuf, size_t bufsize); \ No newline at end of file diff --git a/src/libproxychains.c b/src/libproxychains.c index 16b6e3d..c690b16 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -141,7 +141,7 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ char *env; char local_in_addr_port[32]; char local_in_addr[32], local_in_port[32], local_netmask[32]; - FILE *file; + FILE *file = NULL; if(proxychains_got_chain_data) return; @@ -151,21 +151,16 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ tcp_connect_time_out = 10 * 1000; *ct = DYNAMIC_TYPE; - /* - * Get path to configuration file from env this file has priority - * if it's defined. - */ + /* Get path to configuration file from env. + * this file has priority if it's defined. */ + env = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); - - snprintf(buff, 256, "%s/.proxychains/proxychains.conf", getenv("HOME")); - - if(!env || (!(file = fopen(env, "r")))) - if(!(file = fopen("./proxychains.conf", "r"))) - if(!(file = fopen(buff, "r"))) - if(!(file = fopen("/etc/proxychains.conf", "r"))) { - perror("Can't locate proxychains.conf"); - exit(1); - } + if(!env) env = get_config_path(buff, sizeof(buff)); + if(env) file = fopen(env, "r"); + if(!file) { + perror("Can't locate proxychains.conf"); + exit(1); + } env = getenv(PROXYCHAINS_QUIET_MODE_ENV_VAR); if(env && *env == '1') diff --git a/src/main.c b/src/main.c index 7e3b8f0..6a21c37 100644 --- a/src/main.c +++ b/src/main.c @@ -36,12 +36,6 @@ static int usage(char **argv) { return EXIT_FAILURE; } -int check_path(char *path) { - if(!path) - return 0; - return access(path, R_OK) != -1; -} - static const char *dll_name = DLL_NAME; static char own_dir[256]; @@ -101,41 +95,12 @@ int main(int argc, char *argv[]) { return usage(argv); /* check if path of config file has not been passed via command line */ + if(!path) path = get_config_path(pbuf, sizeof(pbuf)); if(!path) { - // priority 1: env var PROXYCHAINS_CONF_FILE - path = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); - if(check_path(path)) - goto have; - - // priority 2; proxychains conf in actual dir - path = getcwd(buf, sizeof(buf)); - snprintf(pbuf, sizeof(pbuf), "%s/%s", path, PROXYCHAINS_CONF_FILE); - path = pbuf; - if(check_path(path)) - goto have; - - // priority 3; $HOME/.proxychains/proxychains.conf - path = getenv("HOME"); - snprintf(pbuf, sizeof(pbuf), "%s/.proxychains/%s", path, PROXYCHAINS_CONF_FILE); - path = pbuf; - if(check_path(path)) - goto have; - - // priority 4: $SYSCONFDIR/proxychains.conf - path = SYSCONFDIR "/" PROXYCHAINS_CONF_FILE; - if(check_path(path)) - goto have; - - // priority 5: /etc/proxychains.conf - path = "/etc/" PROXYCHAINS_CONF_FILE; - if(check_path(path)) - goto have; perror("couldnt find configuration file"); return 1; } - - have: - + if(!quiet) fprintf(stderr, LOG_PREFIX "config file found: %s\n", path); From fafeaf59369e00200c69776f05c5e2c2da90a939 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 23:34:34 +0200 Subject: [PATCH 09/21] remove unused file --- proxychains.lsm | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 proxychains.lsm diff --git a/proxychains.lsm b/proxychains.lsm deleted file mode 100644 index d10f15b..0000000 --- a/proxychains.lsm +++ /dev/null @@ -1,14 +0,0 @@ -Begin3 -Title: ProxyChains -Version: 3.0 -Entered-date: -Description: -Keywords: -Author: -Maintained-by: -Primary-site: -Home-page: http://proxychains.sourceforge.net -Original-site: -Platforms: Linux and other Unices -Copying-policy: GNU Public License -End From e5e87c8f223ccd474999eeaf9da9875e20f5ec42 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 23:47:56 +0200 Subject: [PATCH 10/21] put abort functionality into get_config_path to further reduce code duplication --- src/common.c | 12 ++++++++++-- src/common.h | 2 +- src/libproxychains.c | 12 ++---------- src/main.c | 6 +----- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/common.c b/src/common.c index 8c4b993..f76f7fc 100644 --- a/src/common.c +++ b/src/common.c @@ -9,10 +9,15 @@ static int check_path(char *path) { return access(path, R_OK) != -1; } -char *get_config_path(char* pbuf, size_t bufsize) { +char *get_config_path(char* default_path, char* pbuf, size_t bufsize) { char buf[512]; + // top priority: user defined path + char *path = default_path; + if(check_path(path)) + goto have; + // priority 1: env var PROXYCHAINS_CONF_FILE - char *path = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); + getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); if(check_path(path)) goto have; @@ -40,6 +45,9 @@ char *get_config_path(char* pbuf, size_t bufsize) { if(check_path(path)) goto have; + perror("couldnt find configuration file"); + exit(1); + return NULL; have: return path; diff --git a/src/common.h b/src/common.h index f4fd841..156ef45 100644 --- a/src/common.h +++ b/src/common.h @@ -5,4 +5,4 @@ #include -char *get_config_path(char* pbuf, size_t bufsize); \ No newline at end of file +char *get_config_path(char* default_path, char* pbuf, size_t bufsize); \ No newline at end of file diff --git a/src/libproxychains.c b/src/libproxychains.c index c690b16..b2f2d91 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -150,17 +150,9 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ tcp_read_time_out = 4 * 1000; tcp_connect_time_out = 10 * 1000; *ct = DYNAMIC_TYPE; - - /* Get path to configuration file from env. - * this file has priority if it's defined. */ - env = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); - if(!env) env = get_config_path(buff, sizeof(buff)); - if(env) file = fopen(env, "r"); - if(!file) { - perror("Can't locate proxychains.conf"); - exit(1); - } + env = get_config_path(getenv(PROXYCHAINS_CONF_FILE_ENV_VAR), buff, sizeof(buff)); + file = fopen(env, "r"); env = getenv(PROXYCHAINS_QUIET_MODE_ENV_VAR); if(env && *env == '1') diff --git a/src/main.c b/src/main.c index 6a21c37..795899c 100644 --- a/src/main.c +++ b/src/main.c @@ -95,11 +95,7 @@ int main(int argc, char *argv[]) { return usage(argv); /* check if path of config file has not been passed via command line */ - if(!path) path = get_config_path(pbuf, sizeof(pbuf)); - if(!path) { - perror("couldnt find configuration file"); - return 1; - } + path = get_config_path(path, pbuf, sizeof(pbuf)); if(!quiet) fprintf(stderr, LOG_PREFIX "config file found: %s\n", path); From 71e15e2eddf15bc2cc8d069eeb850f694bc6352a Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sat, 14 Jul 2012 17:59:06 +0200 Subject: [PATCH 11/21] simplify log func --- src/core.c | 15 +++++---------- src/core.h | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/core.c b/src/core.c index b8fe08a..83bbe8a 100644 --- a/src/core.c +++ b/src/core.c @@ -175,21 +175,16 @@ static void encode_base_64(char *src, char *dest, int max_len) { *dest++ = 0; } -#define LOG_BUFF 1024*20 - -int proxychains_write_log(char *str, ...) { - char buff[LOG_BUFF]; +void proxychains_write_log(char *str, ...) { + char buff[1024*20]; va_list arglist; - FILE *log_file; - log_file = stderr; if(!proxychains_quiet_mode) { va_start(arglist, str); - vsprintf(buff, str, arglist); + vsnprintf(buff, sizeof(buff), str, arglist); va_end(arglist); - fprintf(log_file, "%s", buff); - fflush(log_file); + fprintf(stderr, "%s", buff); + fflush(stderr); } - return EXIT_SUCCESS; } static int write_n_bytes(int fd, char *buff, size_t size) { diff --git a/src/core.h b/src/core.h index b1521f7..e0b9f0f 100644 --- a/src/core.h +++ b/src/core.h @@ -102,7 +102,7 @@ int connect_proxy_chain (int sock, ip_type target_ip, unsigned short target_port proxy_data * pd, unsigned int proxy_count, chain_type ct, unsigned int max_chain ); -int proxychains_write_log(char *str,...); +void proxychains_write_log(char *str, ...); typedef int (*connect_t)(int, const struct sockaddr *, socklen_t); typedef struct hostent* (*gethostbyname_t)(const char *); From 4b999cdae76e745176f1a4d424ed74696e318aa1 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sat, 14 Jul 2012 17:59:56 +0200 Subject: [PATCH 12/21] use threadsafe getservbyname_r --- src/core.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/core.c b/src/core.c index 83bbe8a..6c7147b 100644 --- a/src/core.c +++ b/src/core.c @@ -835,11 +835,15 @@ struct hostent *proxy_gethostbyname(const char *name) { MUTEX_UNLOCK(&internal_ips_lock); return NULL; } + int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct servent *se = NULL; struct hostent *hp = NULL; struct sockaddr *sockaddr_space = NULL; struct addrinfo *addrinfo_space = NULL; + struct servent se_buf; + char buf[1024]; + int port; // printf("proxy_getaddrinfo node %s service %s\n",node,service); addrinfo_space = malloc(sizeof(struct addrinfo)); @@ -858,13 +862,10 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin else goto err3; } - if(service) - se = getservbyname(service, NULL); + if(service) getservbyname_r(service, NULL, &se_buf, buf, sizeof(buf), &se); - if(!se) { - ((struct sockaddr_in *) sockaddr_space)->sin_port = htons(atoi(service ? : "0")); - } else - ((struct sockaddr_in *) sockaddr_space)->sin_port = se->s_port; + port = se ? se->s_port : htons(atoi(service ? service : "0")); + ((struct sockaddr_in *) sockaddr_space)->sin_port = port; *res = addrinfo_space; (*res)->ai_addr = sockaddr_space; From 40edf758ee8d29b9a1dc1066da12886f641935e7 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 01:05:28 +0200 Subject: [PATCH 13/21] make getaddrinfo threadsafe --- src/core.c | 92 ++++++++++++++++++++++---------------------- src/core.h | 9 ++++- src/libproxychains.c | 9 ++--- 3 files changed, 59 insertions(+), 51 deletions(-) diff --git a/src/core.c b/src/core.c index 6c7147b..c0d48cf 100644 --- a/src/core.c +++ b/src/core.c @@ -33,6 +33,7 @@ #include #include #include +#include #ifdef THREAD_SAFE #include pthread_mutex_t internal_ips_lock; @@ -736,13 +737,9 @@ int connect_proxy_chain(int sock, ip_type target_ip, return -1; } -// TODO: all those buffers aren't threadsafe, but since no memory allocation happens there shouldnt be any segfaults -static struct hostent hostent_space; -static in_addr_t resolved_addr; -static char *resolved_addr_p[2]; -static char addr_name[1024 * 8]; static const ip_type local_host = { {127, 0, 0, 1} }; -struct hostent *proxy_gethostbyname(const char *name) { + +struct hostent *proxy_gethostbyname(const char *name, struct gethostbyname_data* data) { char buff[256]; uint32_t i, hash; // yep, new_mem never gets freed. once you passed a fake ip to the client, you can't "retreat" it @@ -751,20 +748,20 @@ struct hostent *proxy_gethostbyname(const char *name) { struct hostent *hp; - resolved_addr_p[0] = (char *) &resolved_addr; - resolved_addr_p[1] = NULL; + data->resolved_addr_p[0] = (char *) &data->resolved_addr; + data->resolved_addr_p[1] = NULL; - hostent_space.h_addr_list = resolved_addr_p; + data->hostent_space.h_addr_list = data->resolved_addr_p; - resolved_addr = 0; + data->resolved_addr = 0; gethostname(buff, sizeof(buff)); if(!strcmp(buff, name)) { - resolved_addr = inet_addr(buff); - if(resolved_addr == (in_addr_t) (-1)) - resolved_addr = (in_addr_t) (local_host.as_int); - return &hostent_space; + data->resolved_addr = inet_addr(buff); + if(data->resolved_addr == (in_addr_t) (-1)) + data->resolved_addr = (in_addr_t) (local_host.as_int); + return &data->hostent_space; } memset(buff, 0, sizeof(buff)); @@ -782,7 +779,7 @@ struct hostent *proxy_gethostbyname(const char *name) { if(internal_ips.counter) { for(i = 0; i < internal_ips.counter; i++) { if(internal_ips.list[i]->hash == hash && !strcmp(name, internal_ips.list[i]->string)) { - resolved_addr = make_internal_ip(i); + data->resolved_addr = make_internal_ip(i); PDEBUG("got cached ip for %s\n", name); goto have_ip; } @@ -802,8 +799,8 @@ struct hostent *proxy_gethostbyname(const char *name) { } } - resolved_addr = make_internal_ip(internal_ips.counter); - if(resolved_addr == (in_addr_t) - 1) + data->resolved_addr = make_internal_ip(internal_ips.counter); + if(data->resolved_addr == (in_addr_t) - 1) goto err_plus_unlock; l = strlen(name); @@ -825,64 +822,69 @@ struct hostent *proxy_gethostbyname(const char *name) { MUTEX_UNLOCK(&internal_ips_lock); - strncpy(addr_name, name, sizeof(addr_name)); + strncpy(data->addr_name, name, sizeof(data->addr_name)); - hostent_space.h_name = addr_name; - hostent_space.h_length = sizeof(in_addr_t); - return &hostent_space; + data->hostent_space.h_name = data->addr_name; + data->hostent_space.h_length = sizeof(in_addr_t); + return &data->hostent_space; err_plus_unlock: MUTEX_UNLOCK(&internal_ips_lock); return NULL; } +struct addrinfo_data { + struct addrinfo addrinfo_space; + struct sockaddr sockaddr_space; + char addr_name[256]; +}; + +void proxy_freeaddrinfo(struct addrinfo *res) { + free(res); +} + + int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { + struct gethostbyname_data ghdata; + struct addrinfo_data *space; struct servent *se = NULL; struct hostent *hp = NULL; - struct sockaddr *sockaddr_space = NULL; - struct addrinfo *addrinfo_space = NULL; struct servent se_buf; char buf[1024]; int port; // printf("proxy_getaddrinfo node %s service %s\n",node,service); - addrinfo_space = malloc(sizeof(struct addrinfo)); - if(!addrinfo_space) - goto err1; - sockaddr_space = malloc(sizeof(struct sockaddr)); - if(!sockaddr_space) - goto err2; - memset(sockaddr_space, 0, sizeof(*sockaddr_space)); - memset(addrinfo_space, 0, sizeof(*addrinfo_space)); - if(node && !inet_aton(node, &((struct sockaddr_in *) sockaddr_space)->sin_addr)) { - hp = proxy_gethostbyname(node); + space = calloc(1, sizeof(struct addrinfo_data)); + if(!space) goto err1; + + if(node && !inet_aton(node, &((struct sockaddr_in *) &space->sockaddr_space)->sin_addr)) { + hp = proxy_gethostbyname(node, &ghdata); if(hp) - memcpy(&((struct sockaddr_in *) sockaddr_space)->sin_addr, + memcpy(&((struct sockaddr_in *) &space->sockaddr_space)->sin_addr, *(hp->h_addr_list), sizeof(in_addr_t)); else - goto err3; + goto err2; } if(service) getservbyname_r(service, NULL, &se_buf, buf, sizeof(buf), &se); port = se ? se->s_port : htons(atoi(service ? service : "0")); - ((struct sockaddr_in *) sockaddr_space)->sin_port = port; + ((struct sockaddr_in *) &space->sockaddr_space)->sin_port = port; - *res = addrinfo_space; - (*res)->ai_addr = sockaddr_space; + *res = &space->addrinfo_space; + assert((size_t)(*res) == (size_t) space); + (*res)->ai_addr = &space->sockaddr_space; if(node) - strcpy(addr_name, node); - (*res)->ai_canonname = addr_name; + strncpy(space->addr_name, node, sizeof(space->addr_name)); + (*res)->ai_canonname = space->addr_name; (*res)->ai_next = NULL; - (*res)->ai_family = sockaddr_space->sa_family = AF_INET; + (*res)->ai_family = space->sockaddr_space.sa_family = AF_INET; (*res)->ai_socktype = hints->ai_socktype; (*res)->ai_flags = hints->ai_flags; (*res)->ai_protocol = hints->ai_protocol; - (*res)->ai_addrlen = sizeof(*sockaddr_space); + (*res)->ai_addrlen = sizeof(space->sockaddr_space); goto out; - err3: - free(sockaddr_space); err2: - free(addrinfo_space); + free(space); err1: return 1; out: diff --git a/src/core.h b/src/core.h index e0b9f0f..40abbb8 100644 --- a/src/core.h +++ b/src/core.h @@ -123,11 +123,18 @@ extern freeaddrinfo_t true_freeaddrinfo; extern getnameinfo_t true_getnameinfo; extern gethostbyaddr_t true_gethostbyaddr; +struct gethostbyname_data { + struct hostent hostent_space; + in_addr_t resolved_addr; + char *resolved_addr_p[2]; + char addr_name[1024 * 8]; +}; -struct hostent* proxy_gethostbyname(const char *name); +struct hostent* proxy_gethostbyname(const char *name, struct gethostbyname_data *data); int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); +void proxy_freeaddrinfo(struct addrinfo *res); void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes); diff --git a/src/libproxychains.c b/src/libproxychains.c index b2f2d91..788a880 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -325,13 +325,14 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) { return ret; } +static struct gethostbyname_data ghbndata; struct hostent *gethostbyname(const char *name) { INIT(); PDEBUG("gethostbyname: %s\n", name); if(proxychains_resolver) - return proxy_gethostbyname(name); + return proxy_gethostbyname(name, &ghbndata); else return true_gethostbyname(name); @@ -360,10 +361,8 @@ void freeaddrinfo(struct addrinfo *res) { if(!proxychains_resolver) true_freeaddrinfo(res); - else { - free(res->ai_addr); - free(res); - } + else + proxy_freeaddrinfo(res); return; } From 037edbcb8ec34bf4a1966be139417ce64ebe535c Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 01:19:30 +0200 Subject: [PATCH 14/21] proxy_getaddrinfo: fix segfault when hints is NULL --- src/core.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core.c b/src/core.c index c0d48cf..7217b0d 100644 --- a/src/core.c +++ b/src/core.c @@ -878,10 +878,16 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin (*res)->ai_canonname = space->addr_name; (*res)->ai_next = NULL; (*res)->ai_family = space->sockaddr_space.sa_family = AF_INET; - (*res)->ai_socktype = hints->ai_socktype; - (*res)->ai_flags = hints->ai_flags; - (*res)->ai_protocol = hints->ai_protocol; (*res)->ai_addrlen = sizeof(space->sockaddr_space); + + if(hints) { + (*res)->ai_socktype = hints->ai_socktype; + (*res)->ai_flags = hints->ai_flags; + (*res)->ai_protocol = hints->ai_protocol; + } else { + (*res)->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); + } + goto out; err2: free(space); From 6f56956715846d3430a0008749f08a4d8560919d Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 01:21:22 +0200 Subject: [PATCH 15/21] add test for getaddrinfo --- tests/test_getaddrinfo.c | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/test_getaddrinfo.c diff --git a/tests/test_getaddrinfo.c b/tests/test_getaddrinfo.c new file mode 100644 index 0000000..7581428 --- /dev/null +++ b/tests/test_getaddrinfo.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include + +#ifndef NI_MAXHOST +#define NI_MAXHOST 1025 +#endif + +int main(void) { + struct addrinfo *result; + struct addrinfo *res; + int error; + + /* resolve the domain name into a list of addresses */ + error = getaddrinfo("www.example.com", NULL, NULL, &result); + if (error != 0) + { + fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error)); + return EXIT_FAILURE; + } + + /* loop over all returned results and do inverse lookup */ + for (res = result; res != NULL; res = res->ai_next) + { + char hostname[NI_MAXHOST] = ""; + + error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0); + if (error != 0) + { + fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error)); + continue; + } + if (*hostname != '\0') + printf("hostname: %s\n", hostname); + } + + freeaddrinfo(result); + return EXIT_SUCCESS; +} From ab3ca318711847b8e080c8de949fb6279bae8ca2 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 01:34:00 +0200 Subject: [PATCH 16/21] getaddrinfo: cosmetics --- src/core.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/core.c b/src/core.c index 7217b0d..f94f378 100644 --- a/src/core.c +++ b/src/core.c @@ -850,6 +850,7 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin struct servent *se = NULL; struct hostent *hp = NULL; struct servent se_buf; + struct addrinfo *p; char buf[1024]; int port; @@ -870,22 +871,23 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin port = se ? se->s_port : htons(atoi(service ? service : "0")); ((struct sockaddr_in *) &space->sockaddr_space)->sin_port = port; - *res = &space->addrinfo_space; - assert((size_t)(*res) == (size_t) space); - (*res)->ai_addr = &space->sockaddr_space; + *res = p = &space->addrinfo_space; + assert((size_t)p == (size_t) space); + + p->ai_addr = &space->sockaddr_space; if(node) strncpy(space->addr_name, node, sizeof(space->addr_name)); - (*res)->ai_canonname = space->addr_name; - (*res)->ai_next = NULL; - (*res)->ai_family = space->sockaddr_space.sa_family = AF_INET; - (*res)->ai_addrlen = sizeof(space->sockaddr_space); + p->ai_canonname = space->addr_name; + p->ai_next = NULL; + p->ai_family = space->sockaddr_space.sa_family = AF_INET; + p->ai_addrlen = sizeof(space->sockaddr_space); if(hints) { - (*res)->ai_socktype = hints->ai_socktype; - (*res)->ai_flags = hints->ai_flags; - (*res)->ai_protocol = hints->ai_protocol; + p->ai_socktype = hints->ai_socktype; + p->ai_flags = hints->ai_flags; + p->ai_protocol = hints->ai_protocol; } else { - (*res)->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); + p->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); } goto out; From 3c7fcc7507bcf6de8ef8c154c026b4b34e004c17 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 02:25:33 +0200 Subject: [PATCH 17/21] update AUTHORS --- AUTHORS | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index a1027b8..368f57e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,5 +1,16 @@ +original code N3E7CR34TUR3. +http://proxychains.sourceforge.net +netcreature@users.sourceforge.net -web site: proxychains.sourceforge.net -email: netcreature@users.sourceforge.net +main.c, remote-dns, thread safety, bugfixes, build system, cleanups +rofl0r. +https://github.com/rofl0r/proxychains +localnet, bugfixes +adam hamsik. +https://github.com/haad/proxychains + +localnet-port, bugfixes +jianing yang. +https://github.com/jianingy/proxychains From 80e58726e2b64fd891c12363546ffe475e387e53 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 02:26:42 +0200 Subject: [PATCH 18/21] correct copyright of main.c --- src/main.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main.c b/src/main.c index 795899c..13cbdb7 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,4 @@ -/*************************************************************************** - main.c - description - - begin : Tue May 14 2002 - copyright : netcreature (C) 2002 - email : netcreature@users.sourceforge.net - ***************************************************************************/ - /* GPL */ -/*************************************************************************** +/* (C) 2011, 2012 rofl0r * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -14,6 +6,7 @@ * (at your option) any later version. * * * ***************************************************************************/ + #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #undef _XOPEN_SOURCE From a4f3dd05382af03e8b08941d5db28be77c235a49 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 02:29:04 +0200 Subject: [PATCH 19/21] Makefile: put config into new install-config target --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index d6ee318..97058a0 100644 --- a/Makefile +++ b/Makefile @@ -44,12 +44,14 @@ CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DSYSCONFDIR=\"$(sysconfdir)\" -DDLL_NAME=\" all: $(ALL_LIBS) $(ALL_TOOLS) -#install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(DESTDIR)$(LDSO_PATHNAME) +install-config: + install -d $(DESTDIR)/$(sysconfdir) + install $(INSTALL_FLAGS) 644 src/proxychains.conf $(DESTDIR)/$(sysconfdir)/ + install: - install -d $(DESTDIR)/$(bindir)/ $(DESTDIR)/$(libdir)/ $(DESTDIR)/$(sysconfdir) + install -d $(DESTDIR)/$(bindir)/ $(DESTDIR)/$(libdir)/ install $(INSTALL_FLAGS) 755 $(ALL_TOOLS) $(DESTDIR)/$(bindir)/ install $(INSTALL_FLAGS) 644 $(ALL_LIBS) $(DESTDIR)/$(libdir)/ - install $(INSTALL_FLAGS) 644 src/proxychains.conf $(DESTDIR)/$(sysconfdir)/ clean: rm -f $(ALL_LIBS) From 40bb78b53f232cb19890a3fa6b5701d3e223c65e Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 16 Jul 2012 02:42:09 +0200 Subject: [PATCH 20/21] fix omission in common.c --- src/common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common.c b/src/common.c index f76f7fc..5f9b7e1 100644 --- a/src/common.c +++ b/src/common.c @@ -17,7 +17,7 @@ char *get_config_path(char* default_path, char* pbuf, size_t bufsize) { goto have; // priority 1: env var PROXYCHAINS_CONF_FILE - getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); + path = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); if(check_path(path)) goto have; From efa5738a6a579c60e3f4f7f544eba0f0b1442999 Mon Sep 17 00:00:00 2001 From: Adam Hamsik Date: Tue, 24 Jul 2012 11:50:45 +0200 Subject: [PATCH 21/21] Delete binary file. --- proxychains4 | Bin 14200 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 proxychains4 diff --git a/proxychains4 b/proxychains4 deleted file mode 100755 index eda181f46700a7c9fde5eb930289f45a04c8cd63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14200 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