From 48373ab7a5e3ae352b7f95c1ba6183ee7faf9cd4 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sat, 28 Jan 2012 18:33:40 +0100 Subject: [PATCH 01/21] fix forgotten etc --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 937cf51..e68f2f2 100644 --- a/src/main.c +++ b/src/main.c @@ -122,7 +122,7 @@ int main(int argc, char *argv[]) { goto have; // priority 4: $INSTALL_PREFIX/etc/proxychains.conf - snprintf(pbuf, sizeof(pbuf), "%s/%s", INSTALL_PREFIX, PROXYCHAINS_CONF_FILE); + snprintf(pbuf, sizeof(pbuf), "%s/etc/%s", INSTALL_PREFIX, PROXYCHAINS_CONF_FILE); path = pbuf; if(check_path(path)) goto have; From dbb172b5106d61dfca24cfc55b2bb6addd11a49b Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sat, 28 Jan 2012 18:34:40 +0100 Subject: [PATCH 02/21] use PROXYCHAINS_CONF_FILE consistently --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index e68f2f2..9334006 100644 --- a/src/main.c +++ b/src/main.c @@ -128,7 +128,7 @@ int main(int argc, char *argv[]) { goto have; // priority 5: /etc/proxychains.conf - path = "/etc/proxychains.conf"; + path = "/etc/" PROXYCHAINS_CONF_FILE; if(check_path(path)) goto have; perror("couldnt find configuration file"); From f4e4c8c2b19b8bc5a929321e83ed776aa044ef2d Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 29 Jan 2012 02:34:04 +0100 Subject: [PATCH 03/21] remove unnecessary sprintf call --- src/main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 9334006..6f3c0f0 100644 --- a/src/main.c +++ b/src/main.c @@ -122,8 +122,7 @@ int main(int argc, char *argv[]) { goto have; // priority 4: $INSTALL_PREFIX/etc/proxychains.conf - snprintf(pbuf, sizeof(pbuf), "%s/etc/%s", INSTALL_PREFIX, PROXYCHAINS_CONF_FILE); - path = pbuf; + path = INSTALL_PREFIX "/etc/" PROXYCHAINS_CONF_FILE; if(check_path(path)) goto have; From 0ee539f31c27eb0382073ba4ddab6bc27fa7e603 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 30 Jan 2012 18:26:38 +0100 Subject: [PATCH 04/21] added support for --sysconfdir --- Makefile | 3 ++- configure | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index b5f1447..2078311 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ bindir = $(exec_prefix)/bin prefix = /usr/local/ includedir = $(prefix)/include libdir = $(prefix)/lib +sysconfdir=$(prefix)/etc SRCS = $(sort $(wildcard src/*.c)) OBJS = $(SRCS:.c=.o) @@ -47,7 +48,7 @@ all: $(ALL_LIBS) $(ALL_TOOLS) install: install $(INSTALL_FLAGS) 755 $(ALL_TOOLS) $(bindir)/ install $(INSTALL_FLAGS) 644 $(ALL_LIBS) $(libdir)/ - install $(INSTALL_FLAGS) 644 src/proxychains.conf $(prefix)/etc/ + install $(INSTALL_FLAGS) 644 src/proxychains.conf $(sysconfdir)/ clean: rm -f $(ALL_LIBS) diff --git a/configure b/configure index 6ce9341..cffb34c 100755 --- a/configure +++ b/configure @@ -11,11 +11,12 @@ spliteq() { parsearg() { case "$1" in - --prefix=*) prefix=$(spliteq "$1");; + --prefix=*) prefix=`spliteq $1`;; --exec_prefix=*) exec_prefix=`spliteq $1`;; --bindir=*) bindir=`spliteq $1`;; --libdir=*) libdir=`spliteq $1`;; --includedir=*) includedir=`spliteq $1`;; + --sysconfdir=*) sysconfdir=`spliteq $1`;; esac } @@ -42,6 +43,10 @@ if [ ! $includedir ] ; then includedir=$prefix/include fi +if [ ! $sysconfdir ] ; then + sysconfdir=$prefix/etc +fi + if [ ! $bindir ] ; then bindir=$exec_prefix/bin fi @@ -58,6 +63,7 @@ echo exec_prefix=$exec_prefix>>config.mak echo bindir=$bindir>>config.mak echo libdir=$libdir>>config.mak echo includedir=$includedir>>config.mak +echo sysconfdir=$sysconfdir>>config.mak if ismac ; then echo LDSO_SUFFIX=dylib>>config.mak echo MAC_CFLAGS+=-DIS_MAC=1>>config.mak From e99dd769410fc436789c63fc95f07df066861a9f Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 30 Jan 2012 18:29:35 +0100 Subject: [PATCH 05/21] complete sysconfdir support --- Makefile | 2 +- src/main.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 2078311..57ff7b7 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ ALL_TOOLS = $(PXCHAINS) CFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS) -CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DINSTALL_PREFIX=\"$(prefix)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" +CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DSYSCONFDIR=\"$(sysconfdir)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" all: $(ALL_LIBS) $(ALL_TOOLS) diff --git a/src/main.c b/src/main.c index 6f3c0f0..7e3b8f0 100644 --- a/src/main.c +++ b/src/main.c @@ -121,8 +121,8 @@ int main(int argc, char *argv[]) { if(check_path(path)) goto have; - // priority 4: $INSTALL_PREFIX/etc/proxychains.conf - path = INSTALL_PREFIX "/etc/" PROXYCHAINS_CONF_FILE; + // priority 4: $SYSCONFDIR/proxychains.conf + path = SYSCONFDIR "/" PROXYCHAINS_CONF_FILE; if(check_path(path)) goto have; From 03b49f529e46ae1d44a0df03ba9c1b7f37b3e842 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 30 Jan 2012 18:35:03 +0100 Subject: [PATCH 06/21] fix bogus use of ! in configure --- configure | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/configure b/configure index cffb34c..cb00d57 100755 --- a/configure +++ b/configure @@ -31,27 +31,27 @@ while true ; do esac done -if [ ! $exec_prefix ] ; then +if [ -z "$exec_prefix" ] ; then exec_prefix=$prefix fi -if [ ! $libdir ] ; then +if [ -z "$libdir" ] ; then libdir=$prefix/lib fi -if [ ! $includedir ] ; then +if [ -z "$includedir" ] ; then includedir=$prefix/include fi -if [ ! $sysconfdir ] ; then +if [ -z "$sysconfdir" ] ; then sysconfdir=$prefix/etc fi -if [ ! $bindir ] ; then +if [ -z "$bindir" ] ; then bindir=$exec_prefix/bin fi -if [ ! $CC ] ; then +if [ -z "$CC" ] ; then CC=cc fi From 65471b750cbfafc93002b26eef4344ed673782b9 Mon Sep 17 00:00:00 2001 From: Jianing Yang Date: Sat, 3 Mar 2012 14:24:05 +0800 Subject: [PATCH 07/21] bugfix: localnet conflicts with proxydns --- src/libproxychains.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index 4b68e83..f723615 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -284,6 +284,7 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) { struct in_addr *p_addr_in; unsigned short port; size_t i; + int remote_dns_connect = 0; if(!init_l) init_lib(); @@ -301,7 +302,11 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) { PDEBUG("target: %s\n", inet_ntop(AF_INET, p_addr_in, str, sizeof(str))); PDEBUG("port: %d\n", port); #endif - for(i = 0; i < num_localnet_addr; i++) { + + // check if connect called from proxydns + remote_dns_connect = (ntohl(p_addr_in->s_addr) >> 24 == remote_dns_subnet); + + for(i = 0; i < num_localnet_addr && !remote_dns_connect; i++) { if((localnet_addr[i].in_addr.s_addr & localnet_addr[i].netmask.s_addr) == (p_addr_in->s_addr & localnet_addr[i].netmask.s_addr)) { if(localnet_addr[i].port || localnet_addr[i].port == port) { From 598a41a671830305bb3a74119a293235b5bab925 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Wed, 7 Mar 2012 18:02:37 +0100 Subject: [PATCH 08/21] Makefile: add support for DESTDIR --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 57ff7b7..9566ed9 100644 --- a/Makefile +++ b/Makefile @@ -46,9 +46,9 @@ all: $(ALL_LIBS) $(ALL_TOOLS) #install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(DESTDIR)$(LDSO_PATHNAME) install: - install $(INSTALL_FLAGS) 755 $(ALL_TOOLS) $(bindir)/ - install $(INSTALL_FLAGS) 644 $(ALL_LIBS) $(libdir)/ - install $(INSTALL_FLAGS) 644 src/proxychains.conf $(sysconfdir)/ + 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 1000366f88226809755106ec825d79c0c9b9c7d7 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Wed, 7 Mar 2012 18:05:04 +0100 Subject: [PATCH 09/21] Makefile: create destination dirs in case they do not exist --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 9566ed9..d743efc 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,7 @@ all: $(ALL_LIBS) $(ALL_TOOLS) #install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(DESTDIR)$(LDSO_PATHNAME) install: + install -d $(DESTDIR)/$(bindir)/ $(DESTDIR)/$(libdir)/ $(DESTDIR)/$(sysconfdir) 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)/ From 3260ee812acd3347a63d5cf833d776fc78c850c8 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 23 Apr 2012 19:51:14 +0200 Subject: [PATCH 10/21] debloat init_lib() --- src/libproxychains.c | 93 ++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 60 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index f723615..37be6ea 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -60,74 +60,47 @@ unsigned int remote_dns_subnet = 224; static inline void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_type * ct); static void init_lib(void); +static void load_sym(void** funcptr, char* symname, void* proxyfunc) { + + *funcptr = dlsym(RTLD_NEXT, symname); + + if(!(*funcptr)) { + fprintf(stderr, "Cannot load symbol '%s' %s\n", symname, dlerror()); + exit(1); + } else { + PDEBUG("loaded symbol 'connect'" " real addr %p wrapped addr %p\n", (*funcptr), proxyfunc); + } + if((*funcptr) == proxyfunc) { + PDEBUG("circular reference detected, aborting!\n"); + abort(); + } +} + static void init_lib(void) { + static const struct override_info { + void* funcptr; + char* symname; + void* proxyfunc; + } override_symbols[] = { + { .funcptr = &true_connect, .symname = "connect", .proxyfunc = connect,}, + { .funcptr = &true_gethostbyname, .symname = "gethostbyname", .proxyfunc = gethostbyname,}, + { .funcptr = &true_getaddrinfo, .symname = "getaddrinfo", .proxyfunc = getaddrinfo,}, + { .funcptr = &true_freeaddrinfo, .symname = "freeaddrinfo", .proxyfunc = freeaddrinfo,}, + { .funcptr = &true_gethostbyaddr, .symname = "gethostbyaddr", .proxyfunc = gethostbyaddr,}, + { .funcptr = &true_getnameinfo, .symname = "getnameinfo", .proxyfunc = getnameinfo,}, + }; + 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"); - true_connect = (connect_t) dlsym(RTLD_NEXT, "connect"); - - if(!true_connect) { - fprintf(stderr, "Cannot load symbol 'connect' %s\n", dlerror()); - exit(1); - } else { - PDEBUG("loaded symbol 'connect'" " real addr %p wrapped addr %p\n", true_connect, connect); - } - if(connect == true_connect) { - PDEBUG("circular reference detected, aborting!\n"); - abort(); - } - - true_gethostbyname = (gethostbyname_t) - dlsym(RTLD_NEXT, "gethostbyname"); - - if(!true_gethostbyname) { - fprintf(stderr, "Cannot load symbol 'gethostbyname' %s\n", dlerror()); - exit(1); - } else { - PDEBUG("loaded symbol 'gethostbyname'" - " real addr %p wrapped addr %p\n", true_gethostbyname, gethostbyname); - } - true_getaddrinfo = (getaddrinfo_t) - dlsym(RTLD_NEXT, "getaddrinfo"); - - if(!true_getaddrinfo) { - fprintf(stderr, "Cannot load symbol 'getaddrinfo' %s\n", dlerror()); - exit(1); - } else { - PDEBUG("loaded symbol 'getaddrinfo'" " real addr %p wrapped addr %p\n", true_getaddrinfo, getaddrinfo); - } - true_freeaddrinfo = (freeaddrinfo_t) - dlsym(RTLD_NEXT, "freeaddrinfo"); - - if(!true_freeaddrinfo) { - fprintf(stderr, "Cannot load symbol 'freeaddrinfo' %s\n", dlerror()); - exit(1); - } else { - PDEBUG("loaded symbol 'freeaddrinfo'" - " real addr %p wrapped addr %p\n", true_freeaddrinfo, freeaddrinfo); - } - true_gethostbyaddr = (gethostbyaddr_t) - dlsym(RTLD_NEXT, "gethostbyaddr"); - - if(!true_gethostbyaddr) { - fprintf(stderr, "Cannot load symbol 'gethostbyaddr' %s\n", dlerror()); - exit(1); - } else { - PDEBUG("loaded symbol 'gethostbyaddr'" - " real addr %p wrapped addr %p\n", true_gethostbyaddr, gethostbyaddr); - } - true_getnameinfo = (getnameinfo_t) - dlsym(RTLD_NEXT, "getnameinfo"); - - if(!true_getnameinfo) { - fprintf(stderr, "Cannot load symbol 'getnameinfo' %s\n", dlerror()); - exit(1); - } else { - PDEBUG("loaded symbol 'getnameinfo'" " real addr %p wrapped addr %p\n", true_getnameinfo, getnameinfo); + 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); } + init_l = 1; } From 49293b180d06e7a05a2e574e60aac59099049409 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 23 Apr 2012 20:26:13 +0200 Subject: [PATCH 11/21] some cleanup in core.h --- src/core.h | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/core.h b/src/core.h index 1235446..284e3b3 100644 --- a/src/core.h +++ b/src/core.h @@ -59,7 +59,6 @@ typedef enum { BLOCKED // target's port blocked on last proxy in the chain } ERR_CODE; - typedef enum { HTTP_TYPE, SOCKS4_TYPE, @@ -107,18 +106,11 @@ typedef struct { int flags; } thread_arg; -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 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,...); -struct hostent* proxy_gethostbyname(const char *name); - typedef int (*connect_t)(int, const struct sockaddr *, socklen_t); connect_t true_connect; @@ -137,17 +129,18 @@ freeaddrinfo_t true_freeaddrinfo; typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *, socklen_t, char *, - socklen_t, unsigned int); + socklen_t, int); getnameinfo_t true_getnameinfo; typedef struct hostent *(*gethostbyaddr_t) (const void *, socklen_t, int); 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); -struct hostent* proxy_gethostbyname(const char *name); void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes); From f55c6bc4d56ba5910899cbc8722d201ad44241ad Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 23 Apr 2012 22:19:52 +0200 Subject: [PATCH 12/21] fix PDEBUG macro --- src/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.h b/src/core.h index 284e3b3..09915eb 100644 --- a/src/core.h +++ b/src/core.h @@ -147,7 +147,7 @@ void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes); #ifdef DEBUG # define PDEBUG(fmt, args...) fprintf(stderr,"DEBUG:"fmt, ## args) #else -# define PDEBUG(fmt, args...) +# define PDEBUG(fmt, args...) do {} while (0) #endif #endif From caed7826527ddee2b9e69364adee769be515a36a Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 23 Apr 2012 20:51:50 +0200 Subject: [PATCH 13/21] macros --- src/libproxychains.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index 37be6ea..f26fb33 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -82,12 +82,14 @@ static void init_lib(void) { char* symname; void* proxyfunc; } override_symbols[] = { - { .funcptr = &true_connect, .symname = "connect", .proxyfunc = connect,}, - { .funcptr = &true_gethostbyname, .symname = "gethostbyname", .proxyfunc = gethostbyname,}, - { .funcptr = &true_getaddrinfo, .symname = "getaddrinfo", .proxyfunc = getaddrinfo,}, - { .funcptr = &true_freeaddrinfo, .symname = "freeaddrinfo", .proxyfunc = freeaddrinfo,}, - { .funcptr = &true_gethostbyaddr, .symname = "gethostbyaddr", .proxyfunc = gethostbyaddr,}, - { .funcptr = &true_getnameinfo, .symname = "getnameinfo", .proxyfunc = getnameinfo,}, + #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; From 88a54e872aae8aa5270d5bad10a824d6e5dd4d50 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 23 Apr 2012 22:14:04 +0200 Subject: [PATCH 14/21] use dynloader to call init() func when gcc is available, and lock it properly --- src/libproxychains.c | 65 ++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index f26fb33..bbdfd6a 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -52,13 +52,16 @@ int proxychains_got_chain_data = 0; unsigned int proxychains_max_chain = 1; int proxychains_quiet_mode = 0; int proxychains_resolver = 0; -static int init_l = 0; localaddr_arg localnet_addr[MAX_LOCALNET]; size_t num_localnet_addr = 0; unsigned int remote_dns_subnet = 224; +#ifdef THREAD_SAFE +pthread_once_t init_once = PTHREAD_ONCE_INIT; +#endif +static int init_l = 0; + static inline void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_type * ct); -static void init_lib(void); static void load_sym(void** funcptr, char* symname, void* proxyfunc) { @@ -76,7 +79,9 @@ static void load_sym(void** funcptr, char* symname, void* proxyfunc) { } } -static void init_lib(void) { +#define INIT() init_lib_wrapper(__FUNCTION__) + +static void do_init(void) { static const struct override_info { void* funcptr; char* symname; @@ -92,7 +97,6 @@ static void init_lib(void) { #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); @@ -102,11 +106,37 @@ static void init_lib(void) { 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); } - init_l = 1; } -static inline void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_type * ct) { +static void init_lib_wrapper(const char* caller) { +#ifndef DEBUG + (void) caller; +#endif +#ifndef THREAD_SAFE + if(init_l) return; + PDEBUG("%s called from %s\n", __FUNCTION__, caller); + do_init(); +#else + if(!init_l) PDEBUG("%s called from %s\n", __FUNCTION__, caller); + pthread_once(&init_once, do_init); +#endif +} + +/* if we use gcc >= 3, we can instruct the dynamic loader + * to call init_lib at link time. otherwise it gets loaded + * lazily, which has the disadvantage that there's a potential + * race condition if 2 threads call it before init_l is set + * and PTHREAD support was disabled */ +#if __GNUC__ > 2 +__attribute__((constructor)) +static void gcc_init(void) { + INIT(); +} +#endif + +/* get configuration from config file */ +static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_type * ct) { int count = 0, port_n = 0, list = 0; char buff[1024], type[1024], host[1024], user[1024]; char *env; @@ -247,7 +277,7 @@ static inline void get_chain_data(proxy_data * pd, unsigned int *proxy_count, ch proxychains_got_chain_data = 1; } - +/******* HOOK FUNCTIONS *******/ int connect(int sock, const struct sockaddr *addr, unsigned int len) { int socktype = 0, flags = 0, ret = 0; @@ -260,9 +290,7 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) { unsigned short port; size_t i; int remote_dns_connect = 0; - - if(!init_l) - init_lib(); + INIT(); optlen = sizeof(socktype); getsockopt(sock, SOL_SOCKET, SO_TYPE, &socktype, &optlen); if(!(SOCKFAMILY(*addr) == AF_INET && socktype == SOCK_STREAM)) @@ -309,8 +337,7 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) { } struct hostent *gethostbyname(const char *name) { - if(!init_l) - init_lib(); + INIT(); PDEBUG("gethostbyname: %s\n", name); @@ -325,8 +352,7 @@ struct hostent *gethostbyname(const char *name) { int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { int ret = 0; - if(!init_l) - init_lib(); + INIT(); PDEBUG("getaddrinfo: %s %s\n", node, service); @@ -339,8 +365,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi } void freeaddrinfo(struct addrinfo *res) { - if(!init_l) - init_lib(); + INIT(); PDEBUG("freeaddrinfo %p \n", res); @@ -366,9 +391,8 @@ int getnameinfo(const struct sockaddr *sa, char ip_buf[16]; int ret = 0; - if(!init_l) - init_lib(); - + INIT(); + PDEBUG("getnameinfo: %s %s\n", host, serv); if(!proxychains_resolver) { @@ -390,8 +414,7 @@ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) { static char *list[2]; static struct hostent he; - if(!init_l) - init_lib(); + INIT(); PDEBUG("TODO: proper gethostbyaddr hook\n"); From bc23ef8f46e7037972cb0f779edf02fb60693d54 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Mon, 23 Apr 2012 22:56:44 +0200 Subject: [PATCH 15/21] fix debug message --- src/libproxychains.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index bbdfd6a..8a0bf6d 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -71,7 +71,7 @@ static void load_sym(void** funcptr, char* symname, void* proxyfunc) { fprintf(stderr, "Cannot load symbol '%s' %s\n", symname, dlerror()); exit(1); } else { - PDEBUG("loaded symbol 'connect'" " real addr %p wrapped addr %p\n", (*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 561679fbcd401124ab200018b16ddc4bbbe97e0d Mon Sep 17 00:00:00 2001 From: rofl0r Date: Tue, 24 Apr 2012 01:46:57 +0200 Subject: [PATCH 16/21] remove dead code --- src/core.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/core.h b/src/core.h index 09915eb..8fc00db 100644 --- a/src/core.h +++ b/src/core.h @@ -97,15 +97,6 @@ typedef struct { char pass[256]; } proxy_data; -typedef struct { - proxy_data *pd; - chain_type ct; - unsigned int proxy_count; - int sock; - struct sockaddr addr; - int flags; -} thread_arg; - 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 ); From d72e6687675da21e7a4d60604151bbf9d5be1a50 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Tue, 24 Apr 2012 01:48:17 +0200 Subject: [PATCH 17/21] use sane defaults --- src/core.h | 2 +- src/libproxychains.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core.h b/src/core.h index 8fc00db..2a1d49d 100644 --- a/src/core.h +++ b/src/core.h @@ -18,7 +18,7 @@ #ifndef __CORE_HEADER #define __CORE_HEADER #define BUFF_SIZE 8*1024 // used to read responses from proxies. -#define MAX_LOCALNET 1024 +#define MAX_LOCALNET 64 typedef union { unsigned char octet[4]; diff --git a/src/libproxychains.c b/src/libproxychains.c index 8a0bf6d..52f7cf2 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -41,7 +41,7 @@ #define SOCKADDR_2(x) (satosin(x)->sin_addr) #define SOCKPORT(x) (satosin(x)->sin_port) #define SOCKFAMILY(x) (satosin(x)->sin_family) -#define MAX_CHAIN 30*1024 +#define MAX_CHAIN 512 int tcp_read_time_out; int tcp_connect_time_out; From 45f50ac754aa08e7cd177ac784cf24b09dfc9950 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Tue, 24 Apr 2012 02:04:02 +0200 Subject: [PATCH 18/21] cosmetic fix --- src/libproxychains.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index 52f7cf2..8987168 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -174,7 +174,11 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ while(fgets(buff, sizeof(buff), file)) { if(buff[0] != '\n' && buff[strspn(buff, " ")] != '#') { + /* proxylist has to come last */ if(list) { + if(count >= MAX_CHAIN) + break; + memset(&pd[count], 0, sizeof(proxy_data)); pd[count].ps = PLAY_STATE; @@ -195,8 +199,7 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ continue; if(pd[count].ip.as_int && port_n && pd[count].ip.as_int != (uint32_t) - 1) - if(++count == MAX_CHAIN) - break; + count++; } else { if(strstr(buff, "[ProxyList]")) { list = 1; From 229eb7cc5a3a4677018c4fb58a56f45135f3ed7d Mon Sep 17 00:00:00 2001 From: Jahrome Date: Tue, 22 May 2012 14:25:53 +0200 Subject: [PATCH 19/21] bugfix: localnet never used if no port specified. Fix typo. --- src/libproxychains.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index 8987168..3c4d7a2 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -229,7 +229,7 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ memset(local_in_port, 0, sizeof(local_in_port) / sizeof(local_in_port[0])); if(sscanf(local_in_addr_port, "%15[^:]:%5s", local_in_addr, local_in_port) < 2) { - PDEBUG("added localnet: netaddr=%s, port=%s\n", + PDEBUG("added localnet: netaddr=%s, netmask=%s\n", local_in_addr, local_netmask); } else { PDEBUG("added localnet: netaddr=%s, port=%s, netmask=%s\n", @@ -315,7 +315,7 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) { for(i = 0; i < num_localnet_addr && !remote_dns_connect; i++) { if((localnet_addr[i].in_addr.s_addr & localnet_addr[i].netmask.s_addr) == (p_addr_in->s_addr & localnet_addr[i].netmask.s_addr)) { - if(localnet_addr[i].port || localnet_addr[i].port == port) { + if(!localnet_addr[i].port || localnet_addr[i].port == port) { PDEBUG("accessing localnet using true_connect\n"); return true_connect(sock, addr, len); } From 385b349a8e93c6b381a59411a17b73bf3b49a1d3 Mon Sep 17 00:00:00 2001 From: Adam Hamsik Date: Mon, 18 Jun 2012 15:45:45 +0200 Subject: [PATCH 20/21] Add support for both i386 and amd64 in mac os x binary. --- Makefile | 2 ++ configure | 1 + 2 files changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 5845f94..72f1b15 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,8 @@ ALL_TOOLS = $(PXCHAINS) CCFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS) +LDFLAGS+=$(USER_LDFLAGS) $(MAC_LDFLAGS) +CXXFLAGS+=$(CCFLAGS) $(USER_CFLAGS) $(MAC_CFLAGS) CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DINSTALL_PREFIX=\"$(prefix)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" diff --git a/configure b/configure index cc12fee..3077de0 100755 --- a/configure +++ b/configure @@ -67,6 +67,7 @@ echo sysconfdir=$sysconfdir>>config.mak if ismac ; then echo LDSO_SUFFIX=dylib>>config.mak echo MAC_CFLAGS+=-DIS_MAC=1 -arch x86_64 -arch i386 >>config.mak + echo MAC_LDFLAGS+=-arch x86_64 -arch i386 >>config.mak echo LD_SET_SONAME=-Wl,-install_name,>>config.mak echo INSTALL_FLAGS=-m>>config.mak fi From 52942141506dc3bc5e467ba6f2006b9c4b0658e2 Mon Sep 17 00:00:00 2001 From: Adam Hamsik Date: Mon, 18 Jun 2012 15:46:22 +0200 Subject: [PATCH 21/21] Fix merge error. --- src/libproxychains.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/libproxychains.c b/src/libproxychains.c index 22a419b..02e1b95 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -49,8 +49,6 @@ int proxychains_got_chain_data = 0; int proxychains_quiet_mode = 0; int proxychains_resolver = 0; -static int init_l = 0; - unsigned int proxychains_proxy_count = 0; unsigned int proxychains_max_chain = 1; unsigned int remote_dns_subnet = 224; @@ -71,7 +69,7 @@ static inline void get_chain_data(proxy_data * pd, unsigned int *proxy_count, ch static void load_sym(void** funcptr, char* symname, void* proxyfunc) { *funcptr = dlsym(RTLD_NEXT, symname); - + if(!(*funcptr)) { fprintf(stderr, "Cannot load symbol '%s' %s\n", symname, dlerror()); exit(1); @@ -92,7 +90,7 @@ static void do_init(void) { char* symname; void* proxyfunc; } override_symbols[] = { - #define SYM_ENTRY(X) { .funcptr = &true_ ## X, .symname = # X, .proxyfunc = X,} + #define SYM_ENTRY(X) { .funcptr = &true_ ## X, .symname = # X, .proxyfunc = X,} SYM_ENTRY(connect), SYM_ENTRY(gethostbyname), SYM_ENTRY(getaddrinfo), @@ -128,10 +126,10 @@ static void init_lib_wrapper(const char* caller) { #endif } -/* if we use gcc >= 3, we can instruct the dynamic loader +/* if we use gcc >= 3, we can instruct the dynamic loader * to call init_lib at link time. otherwise it gets loaded * lazily, which has the disadvantage that there's a potential - * race condition if 2 threads call it before init_l is set + * race condition if 2 threads call it before init_l is set * and PTHREAD support was disabled */ #if __GNUC__ > 2 __attribute__((constructor)) @@ -183,7 +181,7 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ if(list) { if(count >= MAX_CHAIN) break; - + memset(&pd[count], 0, sizeof(proxy_data)); pd[count].ps = PLAY_STATE; @@ -285,11 +283,8 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ proxychains_got_chain_data = 1; } -<<<<<<< HEAD -======= /******* HOOK FUNCTIONS *******/ ->>>>>>> rofl0r/master int connect(int sock, const struct sockaddr *addr, unsigned int len) { int socktype = 0, flags = 0, ret = 0; socklen_t optlen = 0; @@ -406,7 +401,7 @@ int getnameinfo(const struct sockaddr *sa, int ret = 0; INIT(); - + PDEBUG("getnameinfo: %s %s\n", host, serv); if(!proxychains_resolver) {