35 Commits

Author SHA1 Message Date
Adam Hamsik 5294214150 Fix merge error. 2012-06-18 15:46:22 +02:00
Adam Hamsik 385b349a8e Add support for both i386 and amd64 in mac os x binary. 2012-06-18 15:45:45 +02:00
Adam Hamsik 2320f6608a Merge rofl0r changes to main stream. 2012-06-16 12:10:41 +02:00
Michel Oosterhof 251fd7cd4a Only enable loopback localnet by default, not private address range. 2012-06-16 12:04:28 +02:00
Michel Oosterhof b0d9d1da41 Enable localnet by default for loopback and private address ranges. 2012-06-16 12:04:23 +02:00
Michel Oosterhof a7831a8f53 Typo fix. 2012-06-16 12:02:51 +02:00
Adam Hamsik c9b8ce35b2 Merge pull request #16 from jahrome/master
Hi ! Nice job with localnet, just what I was needing, here is just a small fix. Hope this helps.
2012-05-22 06:07:35 -07:00
Jahrome 63c3a4b0d2 bugfix: localnet never used if no port specified. Fix typo. 2012-05-22 14:25:53 +02:00
Adam Hamsik 4d40a4790f Merge pull request #15 from jianingy/master
bugfix: localnet conflicts with proxydns
2012-03-04 23:21:43 -08:00
Jianing Yang 50820ce80d new: added DESTDIR option to Makefile so that packaging will be easier 2012-03-03 14:57:49 +08:00
Jianing Yang b6746997d2 bugfix: localnet conflicts with proxydns (fixed bytes-order) 2012-03-03 14:30:14 +08:00
Jianing Yang 6dda28a2c8 bugfix: localnet conflicts with proxydns 2012-03-03 14:24:05 +08:00
Adam Hamsik fb3d8e04a1 Change example config version to 4. 2012-03-02 12:57:05 +01:00
Adam Hamsik 0938a940c5 Create install destionation directories first with install -d. 2012-01-28 23:10:40 +01:00
Adam Hamsik 788ffd9d26 Use standard PROXYCHAINS_CONF_FILE instead of hardcoded config name. 2012-01-28 19:51:23 +01:00
Adam Hamsik 99dcfe085e Change proxychains script to add different ways of usage.
To run a command from shell use
proxychains -f {config_file} {command}

To turn proxychains on for all processes inside your shell use
. proxychains on
. proxychains off
2012-01-28 19:47:56 +01:00
Adam Hamsik 89e8bfddf4 Add etc/ to path where we search for config file. 2012-01-28 18:18:58 +01:00
Adam Hamsik adb13c7e79 Check for default config file in 2 locations /etc/ and {install_prefix}/etc. 2012-01-28 16:56:47 +01:00
Adam Hamsik 2250ef66a8 Make proxychains working on Mac OS X, build universal binaries to make older
versions of Mac OS X working. Make both proxychains shell script and proxychains program working.

Tested on my 10.7.3
2012-01-28 14:01:28 +01:00
Adam Hamsik e991cabb94 Merge rofl0r updates to bring both forks of proxychains to same base and to not diverge them more then they are now.
Merge branch 'master' of https://github.com/rofl0r/proxychains into rofl0r-master

Conflicts:
	Makefile
	src/core.c
	src/core.h
	src/libproxychains.c
	src/main.c
2012-01-28 00:16:53 +01:00
Adam Hamsik d28cf03c61 Replace inet_ntoa which is not thread safe by re-entrant threadsafe inet_ntop. 2012-01-27 16:26:51 +01:00
Adam Hamsik 952a039801 Pull some fixes from proxychains sf forum. 2012-01-27 15:41:40 +01:00
Adam Hamsik 8d9bb5545c Check variable install/etc directory for proxychains config. Fix for #12 on github reported by sheepdestroyer. 2012-01-27 15:28:25 +01:00
Adam Hamsik f512779539 Replace homegrown pc_stringfromipv4 standard libc inet_ntoa, this should be available on all libcs (musl checked). Reenable accidentaly disabled THREAD_SAFE. 2012-01-27 14:35:00 +01:00
Adam Hamsik f53119773a remove cdefs.h from include, fix non THREAD_SAFE build, do some more PDEBUG cleanup. 2012-01-27 14:02:36 +01:00
Adam Hamsik 2f9a9cf0b0 Remove -Wextra which is unsupported on old gcc. 2012-01-26 16:41:48 +01:00
Adam Hamsik cdec339f11 Remove THREAD_SAFE ifdefs and use macros for it. Is there any reason to not require threads by default ? 2012-01-26 15:41:48 +01:00
Adam Hamsik fe8672eab6 Merge branch 'master' of github.com:haad/proxychains 2012-01-26 15:17:28 +01:00
Adam Hamsik d9341a8c74 Add some more code checking to CCFLAGS, remove unnecessary ifdef's 2012-01-26 15:17:12 +01:00
Adam Hamsik af5163bccf Merge pull request #9 from rofl0r/master
this fixes the getopt issue and makes the subnet for remote dns lookup a config option
2012-01-26 05:57:49 -08:00
Adam Hamsik 1471c5756f Merge branch 'remote-dns' of https://github.com/rofl0r/proxychains into rofl0r-remote-dns
Conflicts:
	Makefile
2012-01-26 10:04:43 +01:00
Adam Hamsik 15d4d5a669 Fix some leftovers in Makefile. 2012-01-11 16:54:05 +01:00
Adam Hamsik 865dc76c08 Make prefix basic variable which is used as base for all other subdirs, install binaries to bin/ not to file called bin. 2012-01-11 11:00:11 +01:00
Adam Hamsik 9a29a4c0d1 Merge pull request #3 from rofl0r/master
everything works as expected now.
2012-01-11 01:43:46 -08:00
Adam Hamsik ca599cbc86 Fix localnet issue with fix suggested in #issue 4 on github. 2012-01-10 15:53:03 +01:00
8 changed files with 202 additions and 115 deletions
+13 -12
View File
@@ -5,19 +5,19 @@
# Do not make changes here. # Do not make changes here.
# #
exec_prefix = /usr/local prefix = /usr/local
bindir = $(exec_prefix)/bin
prefix = /usr/local/
includedir = $(prefix)/include includedir = $(prefix)/include
libdir = $(prefix)/lib libdir = $(prefix)/lib
sysconfdir=$(prefix)/etc confdir = $(prefix)/etc
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
SRCS = $(sort $(wildcard src/*.c)) SRCS = $(sort $(wildcard src/*.c))
OBJS = $(SRCS:.c=.o) OBJS = $(SRCS:.c=.o)
LOBJS = src/core.o src/libproxychains.o LOBJS = src/core.o src/libproxychains.o
CFLAGS += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe -DTHREAD_SAFE CCFLAGS = -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe -DTHREAD_SAFE -Werror
LDFLAGS = -shared -fPIC -ldl -lpthread LDFLAGS = -shared -fPIC -ldl -lpthread
INC = INC =
PIC = -fPIC PIC = -fPIC
@@ -38,18 +38,20 @@ PXCHAINS = proxychains4
ALL_TOOLS = $(PXCHAINS) ALL_TOOLS = $(PXCHAINS)
CFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS) CCFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS)
CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DSYSCONFDIR=\"$(sysconfdir)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" LDFLAGS+=$(USER_LDFLAGS) $(MAC_LDFLAGS)
CXXFLAGS+=$(CCFLAGS) $(USER_CFLAGS) $(MAC_CFLAGS)
CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DINSTALL_PREFIX=\"$(prefix)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\"
all: $(ALL_LIBS) $(ALL_TOOLS) all: $(ALL_LIBS) $(ALL_TOOLS)
#install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(DESTDIR)$(LDSO_PATHNAME) #install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(DESTDIR)$(LDSO_PATHNAME)
install: install:
install -d $(DESTDIR)/$(bindir)/ $(DESTDIR)/$(libdir)/ $(DESTDIR)/$(sysconfdir) install -d $(DESTDIR)/$(bindir) $(DESTDIR)/$(libdir) $(DESTDIR)/$(confdir) $(DESTDIR)/$(includedir)
install $(INSTALL_FLAGS) 755 $(ALL_TOOLS) $(DESTDIR)/$(bindir)/ install $(INSTALL_FLAGS) 755 $(ALL_TOOLS) $(DESTDIR)/$(bindir)/
install $(INSTALL_FLAGS) 644 $(ALL_LIBS) $(DESTDIR)/$(libdir)/ install $(INSTALL_FLAGS) 644 $(ALL_LIBS) $(DESTDIR)/$(libdir)/
install $(INSTALL_FLAGS) 644 src/proxychains.conf $(DESTDIR)/$(sysconfdir)/ install $(INSTALL_FLAGS) 644 src/proxychains.conf $(DESTDIR)/$(confdir)
clean: clean:
rm -f $(ALL_LIBS) rm -f $(ALL_LIBS)
@@ -57,7 +59,7 @@ clean:
rm -f $(OBJS) rm -f $(OBJS)
%.o: %.c %.o: %.c
$(CC) $(CFLAGS) $(CFLAGS_MAIN) $(INC) $(PIC) -c -o $@ $< $(CC) $(CCFLAGS) $(CFLAGS_MAIN) $(INC) $(PIC) -c -o $@ $<
$(LDSO_PATHNAME): $(LOBJS) $(LDSO_PATHNAME): $(LOBJS)
$(CC) $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -o $@ $(LOBJS) $(CC) $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -o $@ $(LOBJS)
@@ -65,5 +67,4 @@ $(LDSO_PATHNAME): $(LOBJS)
$(ALL_TOOLS): $(OBJS) $(ALL_TOOLS): $(OBJS)
$(CC) src/main.o -o $(PXCHAINS) $(CC) src/main.o -o $(PXCHAINS)
.PHONY: all clean install .PHONY: all clean install
Vendored
+2 -1
View File
@@ -66,7 +66,8 @@ echo includedir=$includedir>>config.mak
echo sysconfdir=$sysconfdir>>config.mak echo sysconfdir=$sysconfdir>>config.mak
if ismac ; then if ismac ; then
echo LDSO_SUFFIX=dylib>>config.mak echo LDSO_SUFFIX=dylib>>config.mak
echo MAC_CFLAGS+=-DIS_MAC=1>>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 LD_SET_SONAME=-Wl,-install_name,>>config.mak
echo INSTALL_FLAGS=-m>>config.mak echo INSTALL_FLAGS=-m>>config.mak
fi fi
+26 -44
View File
@@ -14,6 +14,7 @@
* (at your option) any later version. * * (at your option) any later version. *
* * * *
***************************************************************************/ ***************************************************************************/
#include <sys/types.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@@ -25,7 +26,6 @@
#include <sys/utsname.h> #include <sys/utsname.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/wait.h> #include <sys/wait.h>
@@ -33,10 +33,6 @@
#include <time.h> #include <time.h>
#include <sys/time.h> #include <sys/time.h>
#include <stdarg.h> #include <stdarg.h>
#ifdef THREAD_SAFE
#include <pthread.h>
pthread_mutex_t internal_ips_lock;
#endif
#include "core.h" #include "core.h"
#include "common.h" #include "common.h"
@@ -48,7 +44,6 @@ extern unsigned int remote_dns_subnet;
internal_ip_lookup_table internal_ips = { 0, 0, NULL }; internal_ip_lookup_table internal_ips = { 0, 0, NULL };
uint32_t dalias_hash(char *s0) { uint32_t dalias_hash(char *s0) {
unsigned char *s = (void *) s0; unsigned char *s = (void *) s0;
uint_fast32_t h = 0; uint_fast32_t h = 0;
@@ -89,33 +84,10 @@ in_addr_t make_internal_ip(uint32_t index) {
return (in_addr_t) ret.as_int; return (in_addr_t) ret.as_int;
} }
// stolen from libulz (C) rofl0r
void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes) {
unsigned char *p;
char *o = outbuf_16_bytes;
unsigned char n;
for(p = ip_buf_4_bytes; p < ip_buf_4_bytes + 4; p++) {
n = *p;
if(*p >= 100) {
if(*p >= 200)
*(o++) = '2';
else
*(o++) = '1';
n %= 100;
}
if(*p >= 10) {
*(o++) = (n / 10) + '0';
n %= 10;
}
*(o++) = n + '0';
*(o++) = '.';
}
o[-1] = 0;
}
static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static int poll_retry(struct pollfd *fds, nfds_t nfsd, int timeout) { static int poll_retry(struct pollfd *fds, nfds_t nfsd, int timeout)
{
int ret; int ret;
int time_remain = timeout; int time_remain = timeout;
int time_elapsed = 0; int time_elapsed = 0;
@@ -268,6 +240,8 @@ static int timed_connect(int sock, const struct sockaddr *addr, socklen_t len) {
#define INVALID_INDEX 0xFFFFFFFFU #define INVALID_INDEX 0xFFFFFFFFU
#define HTTP_AUTH_MAX ((0xFF * 2) + 1 + 1)
static int tunnel_to(int sock, ip_type ip, unsigned short port, proxy_type pt, char *user, char *pass) { static int tunnel_to(int sock, ip_type ip, unsigned short port, proxy_type pt, char *user, char *pass) {
char *dns_name = NULL; char *dns_name = NULL;
size_t dns_len = 0; size_t dns_len = 0;
@@ -304,7 +278,7 @@ static int tunnel_to(int sock, ip_type ip, unsigned short port, proxy_type pt, c
switch (pt) { switch (pt) {
case HTTP_TYPE:{ case HTTP_TYPE:{
if(!dns_len) { if(!dns_len) {
pc_stringfromipv4(&ip.octet[0], ip_buf); inet_ntop(AF_INET, &ip.octet[0], ip_buf, sizeof(ip_buf));
dns_name = ip_buf; dns_name = ip_buf;
} }
@@ -312,7 +286,6 @@ static int tunnel_to(int sock, ip_type ip, unsigned short port, proxy_type pt, c
ntohs(port)); ntohs(port));
if(user[0]) { if(user[0]) {
#define HTTP_AUTH_MAX ((0xFF * 2) + 1 + 1)
// 2 * 0xff: username and pass, plus 1 for ':' and 1 for zero terminator. // 2 * 0xff: username and pass, plus 1 for ':' and 1 for zero terminator.
char src[HTTP_AUTH_MAX]; char src[HTTP_AUTH_MAX];
char dst[(4 * HTTP_AUTH_MAX)]; char dst[(4 * HTTP_AUTH_MAX)];
@@ -517,7 +490,7 @@ static int start_chain(int *fd, proxy_data * pd, char *begin_mark) {
if(*fd == -1) if(*fd == -1)
goto error; goto error;
pc_stringfromipv4(&pd->ip.octet[0], ip_buf); inet_ntop(AF_INET, &pd->ip.octet[0], ip_buf, sizeof(ip_buf));
proxychains_write_log(LOG_PREFIX "%s " TP " %s:%d ", proxychains_write_log(LOG_PREFIX "%s " TP " %s:%d ",
begin_mark, ip_buf, htons(pd->port)); begin_mark, ip_buf, htons(pd->port));
pd->ps = PLAY_STATE; pd->ps = PLAY_STATE;
@@ -539,8 +512,10 @@ static int start_chain(int *fd, proxy_data * pd, char *begin_mark) {
return SOCKET_ERROR; return SOCKET_ERROR;
} }
static proxy_data *select_proxy(select_type how, proxy_data * pd, unsigned int proxy_count, unsigned int *offset) { static proxy_data *select_proxy(select_type how, proxy_data * pd, unsigned int proxy_count, unsigned int *offset) {
unsigned int i = 0, k = 0; unsigned int i = 0, k = 0;
if(*offset >= proxy_count) if(*offset >= proxy_count)
return NULL; return NULL;
switch (how) { switch (how) {
@@ -592,7 +567,6 @@ static unsigned int calc_alive(proxy_data * pd, unsigned int proxy_count) {
return alive_count; return alive_count;
} }
static int chain_step(int ns, proxy_data * pfrom, proxy_data * pto) { static int chain_step(int ns, proxy_data * pfrom, proxy_data * pto) {
int retcode = -1; int retcode = -1;
char *hostname; char *hostname;
@@ -606,7 +580,7 @@ static int chain_step(int ns, proxy_data * pfrom, proxy_data * pto) {
goto usenumericip; goto usenumericip;
} else { } else {
usenumericip: usenumericip:
pc_stringfromipv4(&pto->ip.octet[0], ip_buf); inet_ntop(AF_INET, &pto->ip.octet[0], ip_buf, sizeof(ip_buf));
hostname = ip_buf; hostname = ip_buf;
} }
@@ -721,7 +695,6 @@ int connect_proxy_chain(int sock, ip_type target_ip,
p3->port = target_port; p3->port = target_port;
if(SUCCESS != chain_step(ns, p1, p3)) if(SUCCESS != chain_step(ns, p1, p3))
goto error; goto error;
} }
proxychains_write_log(TP " OK\n"); proxychains_write_log(TP " OK\n");
@@ -752,20 +725,18 @@ static in_addr_t resolved_addr;
static char *resolved_addr_p[2]; static char *resolved_addr_p[2];
static char addr_name[1024 * 8]; static char addr_name[1024 * 8];
static const ip_type local_host = { {127, 0, 0, 1} }; static const ip_type local_host = { {127, 0, 0, 1} };
struct hostent *proxy_gethostbyname(const char *name) { struct hostent *proxy_gethostbyname(const char *name) {
char buff[256]; char buff[256];
uint32_t i, hash; uint32_t i, hash;
// yep, new_mem never gets freed. once you passed a fake ip to the client, you can't "retreat" it // yep, new_mem never gets freed. once you passed a fake ip to the client, you can't "retreat" it
void *new_mem; void *new_mem;
size_t l; size_t l;
struct hostent *hp; struct hostent *hp;
resolved_addr_p[0] = (char *) &resolved_addr; resolved_addr_p[0] = (char *) &resolved_addr;
resolved_addr_p[1] = NULL; resolved_addr_p[1] = NULL;
hostent_space.h_addr_list = resolved_addr_p; hostent_space.h_addr_list = resolved_addr_p;
resolved_addr = 0; resolved_addr = 0;
gethostname(buff, sizeof(buff)); gethostname(buff, sizeof(buff));
@@ -783,7 +754,6 @@ struct hostent *proxy_gethostbyname(const char *name) {
if(!strcmp(hp->h_name, name)) if(!strcmp(hp->h_name, name))
return hp; return hp;
hash = dalias_hash((char *) name); hash = dalias_hash((char *) name);
MUTEX_LOCK(&internal_ips_lock); MUTEX_LOCK(&internal_ips_lock);
@@ -798,6 +768,7 @@ struct hostent *proxy_gethostbyname(const char *name) {
} }
} }
} }
// grow list if needed. // grow list if needed.
if(internal_ips.capa < internal_ips.counter + 1) { if(internal_ips.capa < internal_ips.counter + 1) {
PDEBUG("realloc\n"); PDEBUG("realloc\n");
@@ -825,6 +796,7 @@ struct hostent *proxy_gethostbyname(const char *name) {
internal_ips.list[internal_ips.counter] = new_mem; internal_ips.list[internal_ips.counter] = new_mem;
internal_ips.list[internal_ips.counter]->hash = hash; internal_ips.list[internal_ips.counter]->hash = hash;
internal_ips.list[internal_ips.counter]->string = (char *) new_mem + sizeof(string_hash_tuple); internal_ips.list[internal_ips.counter]->string = (char *) new_mem + sizeof(string_hash_tuple);
memcpy(internal_ips.list[internal_ips.counter]->string, name, l + 1); memcpy(internal_ips.list[internal_ips.counter]->string, name, l + 1);
@@ -848,6 +820,7 @@ 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) {
struct servent *se = NULL; struct servent *se = NULL;
struct hostent *hp = NULL; struct hostent *hp = NULL;
struct sockaddr *sockaddr_space = NULL; struct sockaddr *sockaddr_space = NULL;
struct addrinfo *addrinfo_space = NULL; struct addrinfo *addrinfo_space = NULL;
@@ -862,6 +835,7 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin
memset(addrinfo_space, 0, sizeof(*addrinfo_space)); memset(addrinfo_space, 0, sizeof(*addrinfo_space));
if(node && !inet_aton(node, &((struct sockaddr_in *) sockaddr_space)->sin_addr)) { if(node && !inet_aton(node, &((struct sockaddr_in *) sockaddr_space)->sin_addr)) {
hp = proxy_gethostbyname(node); hp = proxy_gethostbyname(node);
if(hp) if(hp)
memcpy(&((struct sockaddr_in *) sockaddr_space)->sin_addr, memcpy(&((struct sockaddr_in *) sockaddr_space)->sin_addr,
*(hp->h_addr_list), sizeof(in_addr_t)); *(hp->h_addr_list), sizeof(in_addr_t));
@@ -883,10 +857,18 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin
(*res)->ai_canonname = addr_name; (*res)->ai_canonname = addr_name;
(*res)->ai_next = NULL; (*res)->ai_next = NULL;
(*res)->ai_family = sockaddr_space->sa_family = AF_INET; (*res)->ai_family = 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(*sockaddr_space);
if (hints != NULL) {
(*res)->ai_socktype = hints->ai_socktype;
(*res)->ai_flags = hints->ai_flags;
(*res)->ai_protocol = hints->ai_protocol;
} else {
(*res)->ai_socktype = 0;
(*res)->ai_flags = 0;
(*res)->ai_protocol = 0;
}
goto out; goto out;
err3: err3:
free(sockaddr_space); free(sockaddr_space);
+2 -3
View File
@@ -37,9 +37,10 @@ typedef struct {
} internal_ip_lookup_table; } internal_ip_lookup_table;
extern internal_ip_lookup_table internal_ips; extern internal_ip_lookup_table internal_ips;
#ifdef THREAD_SAFE #ifdef THREAD_SAFE
#include <pthread.h> #include <pthread.h>
extern pthread_mutex_t internal_ips_lock; pthread_mutex_t internal_ips_lock;
# define MUTEX_LOCK(x) pthread_mutex_lock(x) # define MUTEX_LOCK(x) pthread_mutex_lock(x)
# define MUTEX_UNLOCK(x) pthread_mutex_unlock(x) # define MUTEX_UNLOCK(x) pthread_mutex_unlock(x)
# define MUTEX_INIT(x,y) pthread_mutex_init(x, y) # define MUTEX_INIT(x,y) pthread_mutex_init(x, y)
@@ -133,8 +134,6 @@ int proxy_getaddrinfo(const char *node, const char *service,
struct addrinfo **res); struct addrinfo **res);
void pc_stringfromipv4(unsigned char *ip_buf_4_bytes, char *outbuf_16_bytes);
#ifdef DEBUG #ifdef DEBUG
# define PDEBUG(fmt, args...) fprintf(stderr,"DEBUG:"fmt, ## args) # define PDEBUG(fmt, args...) fprintf(stderr,"DEBUG:"fmt, ## args)
#else #else
+23 -17
View File
@@ -18,20 +18,20 @@
#undef _GNU_SOURCE #undef _GNU_SOURCE
#define _GNU_SOURCE #define _GNU_SOURCE
#include <sys/types.h>
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <unistd.h>
#include <netdb.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <fcntl.h>
#include <dlfcn.h>
#include "core.h" #include "core.h"
#include "common.h" #include "common.h"
@@ -45,17 +45,20 @@
int tcp_read_time_out; int tcp_read_time_out;
int tcp_connect_time_out; int tcp_connect_time_out;
chain_type proxychains_ct;
proxy_data proxychains_pd[MAX_CHAIN];
unsigned int proxychains_proxy_count = 0;
int proxychains_got_chain_data = 0; int proxychains_got_chain_data = 0;
unsigned int proxychains_max_chain = 1;
int proxychains_quiet_mode = 0; int proxychains_quiet_mode = 0;
int proxychains_resolver = 0; int proxychains_resolver = 0;
localaddr_arg localnet_addr[MAX_LOCALNET];
size_t num_localnet_addr = 0; unsigned int proxychains_proxy_count = 0;
unsigned int proxychains_max_chain = 1;
unsigned int remote_dns_subnet = 224; unsigned int remote_dns_subnet = 224;
localaddr_arg localnet_addr[MAX_LOCALNET];
chain_type proxychains_ct;
proxy_data proxychains_pd[MAX_CHAIN];
size_t num_localnet_addr = 0;
#ifdef THREAD_SAFE #ifdef THREAD_SAFE
pthread_once_t init_once = PTHREAD_ONCE_INIT; pthread_once_t init_once = PTHREAD_ONCE_INIT;
#endif #endif
@@ -293,6 +296,7 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) {
unsigned short port; unsigned short port;
size_t i; size_t i;
int remote_dns_connect = 0; int remote_dns_connect = 0;
INIT(); INIT();
optlen = sizeof(socktype); optlen = sizeof(socktype);
getsockopt(sock, SOL_SOCKET, SO_TYPE, &socktype, &optlen); getsockopt(sock, SOL_SOCKET, SO_TYPE, &socktype, &optlen);
@@ -375,8 +379,10 @@ void freeaddrinfo(struct addrinfo *res) {
if(!proxychains_resolver) if(!proxychains_resolver)
true_freeaddrinfo(res); true_freeaddrinfo(res);
else { else {
free(res->ai_addr); if (res != NULL) {
free(res); free(res->ai_addr);
free(res);
}
} }
return; return;
} }
@@ -402,7 +408,7 @@ int getnameinfo(const struct sockaddr *sa,
ret = true_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); ret = true_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
} else { } else {
if(hostlen) { if(hostlen) {
pc_stringfromipv4((unsigned char*) &(SOCKADDR_2(*sa)), ip_buf); inet_ntop(AF_INET, (unsigned char*) &(SOCKADDR_2(*sa)), ip_buf, sizeof(ip_buf));
strncpy(host, ip_buf, hostlen); strncpy(host, ip_buf, hostlen);
} }
if(servlen) if(servlen)
@@ -436,7 +442,7 @@ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) {
he.h_addrtype = AF_INET; he.h_addrtype = AF_INET;
he.h_aliases = NULL; he.h_aliases = NULL;
he.h_length = 4; he.h_length = 4;
pc_stringfromipv4((unsigned char *) addr, buf); inet_ntop(AF_INET, addr, buf, sizeof(buf));
return &he; return &he;
} }
return NULL; return NULL;
+25 -16
View File
@@ -18,12 +18,16 @@
#define _POSIX_C_SOURCE 200809L #define _POSIX_C_SOURCE 200809L
#undef _XOPEN_SOURCE #undef _XOPEN_SOURCE
#define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE 700
#include <sys/types.h>
#include <sys/param.h>
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include "common.h" #include "common.h"
@@ -72,11 +76,12 @@ static void set_own_dir(const char *argv0) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
char *path = NULL; char *path = NULL;
char buf[256]; char buf[PATH_MAX];
char pbuf[256]; char pbuf[PATH_MAX];
int start_argv = 1; int start_argv = 1;
int quiet = 0; int quiet = 0;
size_t i; size_t i;
const char *prefix = NULL; const char *prefix = NULL;
for(i = 0; i < MAX_COMMANDLINE_FLAGS; i++) { for(i = 0; i < MAX_COMMANDLINE_FLAGS; i++) {
@@ -104,6 +109,7 @@ int main(int argc, char *argv[]) {
if(!path) { if(!path) {
// priority 1: env var PROXYCHAINS_CONF_FILE // priority 1: env var PROXYCHAINS_CONF_FILE
path = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR); path = getenv(PROXYCHAINS_CONF_FILE_ENV_VAR);
if(check_path(path)) if(check_path(path))
goto have; goto have;
@@ -111,6 +117,7 @@ int main(int argc, char *argv[]) {
path = getcwd(buf, sizeof(buf)); path = getcwd(buf, sizeof(buf));
snprintf(pbuf, sizeof(pbuf), "%s/%s", path, PROXYCHAINS_CONF_FILE); snprintf(pbuf, sizeof(pbuf), "%s/%s", path, PROXYCHAINS_CONF_FILE);
path = pbuf; path = pbuf;
if(check_path(path)) if(check_path(path))
goto have; goto have;
@@ -121,16 +128,19 @@ int main(int argc, char *argv[]) {
if(check_path(path)) if(check_path(path))
goto have; goto have;
// priority 4: $SYSCONFDIR/proxychains.conf /* Check for default config file in two locations {install_prefix}/etc /etc */
path = SYSCONFDIR "/" PROXYCHAINS_CONF_FILE; // priority 4: $INSTALL_PREFIX/etc/proxychains.conf
snprintf(pbuf, sizeof(pbuf), "%s/etc/%s", INSTALL_PREFIX, PROXYCHAINS_CONF_FILE);
path = pbuf;
if(check_path(path)) if(check_path(path))
goto have; goto have;
// priority 5: /etc/proxychains.conf // priority 5: /etc/proxychains.conf
path = "/etc/" PROXYCHAINS_CONF_FILE; snprintf(pbuf, sizeof(pbuf), "/etc/%s", PROXYCHAINS_CONF_FILE);
path = pbuf;
if(check_path(path)) if(check_path(path))
goto have; goto have;
perror("couldnt find configuration file"); perror("Couldn't find configuration file");
return 1; return 1;
} }
@@ -145,9 +155,7 @@ int main(int argc, char *argv[]) {
if(quiet) if(quiet)
setenv(PROXYCHAINS_QUIET_MODE_ENV_VAR, "1", 1); setenv(PROXYCHAINS_QUIET_MODE_ENV_VAR, "1", 1);
// search DLL // search DLL
set_own_dir(argv[0]); set_own_dir(argv[0]);
while(dll_dirs[i]) { while(dll_dirs[i]) {
@@ -163,16 +171,17 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "couldnt locate %s\n", dll_name); fprintf(stderr, "couldnt locate %s\n", dll_name);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if(!quiet) if(!quiet)
fprintf(stderr, LOG_PREFIX "preloading %s/%s\n", prefix, dll_name); fprintf(stderr, LOG_PREFIX "preloading %s/%s\n", prefix, dll_name);
#ifndef IS_MAC #ifndef IS_MAC
snprintf(buf, sizeof(buf), "LD_PRELOAD=%s/%s", prefix, dll_name); snprintf(buf, sizeof(buf), "%s/%s", prefix, dll_name);
putenv(buf); setenv("LD_PRELOAD", buf, 1);
#else #else
snprintf(buf, sizeof(buf), "DYLD_INSERT_LIBRARIES=%s/%s", prefix, dll_name); snprintf(buf, sizeof(buf), "%s/%s", prefix, dll_name);
putenv(buf); setenv("DYLD_INSERT_LIBRARIES", buf, 1);
putenv("DYLD_FORCE_FLAT_NAMESPACE=1"); setenv("DYLD_FORCE_FLAT_NAMESPACE", "1", 1);
#endif #endif
execvp(argv[start_argv], &argv[start_argv]); execvp(argv[start_argv], &argv[start_argv]);
perror("proxychains can't load process...."); perror("proxychains can't load process....");
+93 -13
View File
@@ -1,26 +1,106 @@
#!/bin/sh #!/bin/sh
echo "ProxyChains-3.1 (http://proxychains.sf.net)" echo "ProxyChains-4.0 (https://github.com/haad/proxychains)"
usage() { usage() {
echo " usage:" echo " usage:"
echo " $0 [h] [f config-file] <prog> [args]" echo " $0 [hq] [-f config-file] <prog> [args]"
echo " -q make proxychains quiet"
exit exit
} }
find_proxy_conf() {
show_proxy_env
if [ -f "/usr/local/etc/proxychains.conf" ]; then
export PROXYCHAINS_CONF_FILE="/usr/local/etc/proxychains.conf"
else
if [ -f "/etc/proxychains.conf" ];then
PROXYCHAINS_CONF_FILE="/etc/proxychains.conf"
fi
fi
}
#
# XXX We should not overide possible user settings here. Just add libproxychains to it.
#
setup_proxy_env() {
if [ -z "$PROXYCHAINS_CONF_FILE" ]; then
find_proxy_conf
fi
if [ $(uname -s) = "Darwin" ]; then
export DYLD_FORCE_FLAT_NAMESPACE=
export DYLD_INSERT_LIBRARIES=libproxychains4.dylib
else
export LD_PRELOAD=libproxychains.so.4
fi
}
disable_proxy_env() {
if [ $(uname -s) = "Darwin" ]; then
unset DYLD_FORCE_FLAT_NAMESPACE
export DYLD_INSERT_LIBRARIES=$(echo $DYLD_INSERT_LIBRARIES | sed -e 's/libproxychains4.dylib//g')
if [ -z $DYLD_INSERT_LIBRARIES ]; then
unset DYLD_INSERT_LIBRARIES
fi
else
export LD_PRELOAD=$(echo $DYLD_INSERT_LIBRARIES | sed -e 's/libproxychains.so.4//g')
if [ -z $LD_PRELOAD ]; then
unset LD_PRELOAD
fi
fi
}
show_proxy_env() {
echo "Proxified environment setup"
echo "PROXYCHAINS_CONF_FILE = $PROXYCHAINS_CONF_FILE"
if [ $(uname -s) = "Darwin" ]; then
echo "DYLD_FORCE_FLAT_NAMESPACE = $DYLD_FORCE_FLAT_NAMESPACE"
echo "DYLD_INSERT_LIBRARIES = $DYLD_INSERT_LIBRARIES"
else
echo "LD_PRELOAD = $LD_PRELOAD"
fi
}
if [ $# = 0 ] ; then if [ $# = 0 ] ; then
usage usage
fi fi
if [ $1 = "-h" ]; then case "$1" in
usage -h)
fi usage
;;
-f)
export PROXYCHAINS_CONF_FILE=$2;
shift;
shift;
;;
-q)
export PROXYCHAINS_QUIET_MODE=1;
shift;
;;
show)
show_proxy_env
return
;;
esac
if [ "$1" = "-f" ]; then case "$1" in
export PROXYCHAINS_CONF_FILE=$2; on)
shift; setup_proxy_env
shift; show_proxy_env
fi ;;
off)
export LD_PRELOAD=libproxychains.so.3 disable_proxy_env
exec "$@" show_proxy_env
;;
*)
setup_proxy_env
exec "$@"
;;
esac
+10 -1
View File
@@ -1,4 +1,4 @@
# proxychains.conf VER 3.1 # proxychains.conf VER 4
# #
# HTTP, SOCKS4, SOCKS5 tunneling proxifier with DNS. # HTTP, SOCKS4, SOCKS5 tunneling proxifier with DNS.
# #
@@ -54,6 +54,15 @@ remote_dns_subnet 224
tcp_read_time_out 15000 tcp_read_time_out 15000
tcp_connect_time_out 8000 tcp_connect_time_out 8000
# By default enable localnet for loopback address ranges
# RFC5735 Loopback address range
localnet 127.0.0.0/255.0.0.0
# RFC1918 Private Address Ranges
# localnet 10.0.0.0/255.0.0.0
# localnet 172.16.0.0/255.240.0.0
# localnet 192.168.0.0/255.255.0.0
# Example for localnet exclusion # Example for localnet exclusion
## Exclude connections to 192.168.1.0/24 with port 80 ## Exclude connections to 192.168.1.0/24 with port 80
# localnet 192.168.1.0:80/255.255.255.0 # localnet 192.168.1.0:80/255.255.255.0