From 48373ab7a5e3ae352b7f95c1ba6183ee7faf9cd4 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sat, 28 Jan 2012 18:33:40 +0100 Subject: [PATCH 01/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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 d95ef42d487c7d972729abbfd393e0e3bd243e65 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Sun, 8 Jul 2012 00:16:00 +0200 Subject: [PATCH 20/39] 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 21/39] 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 22/39] 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 23/39] 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 24/39] 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 25/39] 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 26/39] 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 27/39] 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 28/39] 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 29/39] 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 30/39] 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 31/39] 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 32/39] 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 33/39] 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 34/39] 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 35/39] 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 36/39] 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 37/39] 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 38/39] 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 39/39] 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;