1
0
mirror of https://github.com/rofl0r/proxychains-ng synced 2026-05-13 17:03:07 +08:00

Compare commits

...

10 Commits

8 changed files with 149 additions and 44 deletions
+2 -2
View File
@@ -19,7 +19,7 @@ DOBJS = src/daemon/hsearch.o \
src/daemon/sblist.o src/daemon/sblist_delete.o \
src/daemon/daemon.o src/daemon/udpserver.o
LOBJS = src/nameinfo.o src/version.o \
LOBJS = src/version.o \
src/core.o src/common.o src/libproxychains.o \
src/allocator_thread.o src/rdns.o \
src/hostsreader.o src/hash.o src/debug.o
@@ -30,7 +30,7 @@ GENH = src/version.h
CFLAGS += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe
NO_AS_NEEDED = -Wl,--no-as-needed
LIBDL = -ldl
LDFLAGS = -fPIC $(NO_AS_NEEDED) $(LIBDL) -lpthread
LDFLAGS = -fPIC $(NO_AS_NEEDED) $(LIBDL) $(PTHREAD)
INC =
PIC = -fPIC
AR = $(CROSS_COMPILE)ar
+14 -2
View File
@@ -1,4 +1,4 @@
ProxyChains-NG ver 4.14 README
ProxyChains-NG ver 4.15 README
=============================
ProxyChains is a UNIX program, that hooks network-related libc functions
@@ -52,6 +52,18 @@ ProxyChains-NG ver 4.14 README
Changelog:
----------
Version 4.15
- fix configure script for buggy binutils version
- initialize rand_seed with nano-second granularity
- add support for numeric ipv6 in getaddrinfo
- fix bug in getaddrinfo when node is null and !passive
- add dnat feature
- add raw proxy type
- add haiku support
- add proxy_dns_old to emulate proxychains 3.1 behaviour
- add new proxy_dns_daemon feature (experimental)
- various other fixes
Version 4.14
- allow alternative proto://user:pass@ip:port syntax for proxylist
- fix endless loop in round robin mode when all proxies are down (#147)
@@ -236,7 +248,7 @@ Known Problems:
Community:
----------
#proxychains on irc.freenode.net
#proxychains on irc.libera.chat
Donations:
----------
+1 -1
View File
@@ -1 +1 @@
4.14
4.15
Vendored
+18 -2
View File
@@ -19,11 +19,12 @@ check_compile() {
printf "checking %s ... " "$1"
printf "$3" > "$tmpc"
local res=0
$CC $OUR_CPPFLAGS $CPPFLAGS $2 $CFLAGS "$tmpc" -o /dev/null >/dev/null 2>&1 \
$CC $OUR_CPPFLAGS $CPPFLAGS $2 $CFLAGS "$tmpc" -o "$tmpc".out >/dev/null 2>&1 \
|| res=1
test x$res = x0 && \
{ printf "yes\n" ; test x"$2" = x || OUR_CPPFLAGS="$OUR_CPPFLAGS $2" ; } \
|| printf "no\n"
rm -f "$tmpc".out
return $res
}
@@ -49,7 +50,10 @@ check_compile_run() {
check_link_silent() {
printf "$2" > "$tmpc"
$CC $OUR_CPPFLAGS $CPPFLAGS $1 $CFLAGS "$tmpc" -o /dev/null >/dev/null 2>&1
local res=0
$CC $OUR_CPPFLAGS $CPPFLAGS $1 $CFLAGS "$tmpc" -o "$tmpc".out >/dev/null 2>&1 || res=1
rm -f "$tmpc".out
return $res
}
check_link() {
@@ -165,6 +169,9 @@ check_compile 'whether we have pipe2() and O_CLOEXEC' "-DHAVE_PIPE2" \
check_compile 'whether we have SOCK_CLOEXEC' "-DHAVE_SOCK_CLOEXEC" \
'#define _GNU_SOURCE\n#include <sys/socket.h>\nint main() {\nreturn socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);}'
check_compile 'whether we have clock_gettime' "-DHAVE_CLOCK_GETTIME" \
'#define _GNU_SOURCE\n#include <time.h>\nint main() {\nstruct timespec now;clock_gettime(CLOCK_REALTIME, &now);\nreturn now.tv_sec ^ now.tv_nsec;}'
check_define __APPLE__ && {
mac_detected=true
check_define __x86_64__ && mac_64=true
@@ -208,6 +215,15 @@ fi
echo "$LD_SONAME_FLAG"
echo "LD_SET_SONAME = -Wl,$LD_SONAME_FLAG," >> config.mak
if check_link "checking whether we can use -lpthread" "-lpthread" \
"int main(){return 0;}" ; then
echo "PTHREAD = -lpthread" >> config.mak
else
check_link "checking whether we can use -pthread" "-pthread" \
"int main(){return 0;}" || fail "no pthread support detected"
echo "PTHREAD = -pthread" >> config.mak
fi
make_cmd=make
if ismac ; then
echo LDSO_SUFFIX=dylib>>config.mak
+67 -24
View File
@@ -104,31 +104,28 @@ static void* load_sym(char* symname, void* proxyfunc) {
#define INIT() init_lib_wrapper(__FUNCTION__)
#define SETUP_SYM(X) do { if (! true_ ## X ) true_ ## X = load_sym( # X, X ); } while(0)
#include "allocator_thread.h"
const char *proxychains_get_version(void);
static void setup_hooks(void) {
SETUP_SYM(connect);
SETUP_SYM(sendto);
SETUP_SYM(gethostbyname);
SETUP_SYM(getaddrinfo);
SETUP_SYM(freeaddrinfo);
SETUP_SYM(gethostbyaddr);
SETUP_SYM(getnameinfo);
#ifdef IS_SOLARIS
SETUP_SYM(__xnet_connect);
#endif
SETUP_SYM(close);
}
static void setup_hooks(void);
static int close_fds[16];
static int close_fds_cnt = 0;
static unsigned get_rand_seed(void) {
#ifdef HAVE_CLOCK_GETTIME
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
return now.tv_sec ^ now.tv_nsec;
#else
return time(NULL);
#endif
}
static void do_init(void) {
srand(time(NULL));
srand(get_rand_seed());
core_initialize();
/* read the config file */
@@ -527,7 +524,14 @@ inv_host:
/******* HOOK FUNCTIONS *******/
int close(int fd) {
#define EXPAND( args...) args
#ifdef MONTEREY_HOOKING
#define HOOKFUNC(R, N, args...) R pxcng_ ## N ( EXPAND(args) )
#else
#define HOOKFUNC(R, N, args...) R N ( EXPAND(args) )
#endif
HOOKFUNC(int, close, int fd) {
if(!init_l) {
if(close_fds_cnt>=(sizeof close_fds/sizeof close_fds[0])) goto err;
close_fds[close_fds_cnt++] = fd;
@@ -548,7 +552,8 @@ int close(int fd) {
static int is_v4inv6(const struct in6_addr *a) {
return !memcmp(a->s6_addr, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
}
int connect(int sock, const struct sockaddr *addr, unsigned int len) {
HOOKFUNC(int, connect, int sock, const struct sockaddr *addr, unsigned int len) {
INIT();
PFUNC();
@@ -639,13 +644,13 @@ int connect(int sock, const struct sockaddr *addr, unsigned int len) {
}
#ifdef IS_SOLARIS
int __xnet_connect(int sock, const struct sockaddr *addr, unsigned int len) {
HOOKFUNC(int, __xnet_connect, int sock, const struct sockaddr *addr, unsigned int len)
return connect(sock, addr, len);
}
#endif
static struct gethostbyname_data ghbndata;
struct hostent *gethostbyname(const char *name) {
HOOKFUNC(struct hostent*, gethostbyname, const char *name) {
INIT();
PDEBUG("gethostbyname: %s\n", name);
@@ -659,7 +664,7 @@ struct hostent *gethostbyname(const char *name) {
return NULL;
}
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) {
HOOKFUNC(int, getaddrinfo, const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) {
INIT();
PDEBUG("getaddrinfo: %s %s\n", node ? node : "null", service ? service : "null");
@@ -669,7 +674,7 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi
return true_getaddrinfo(node, service, hints, res);
}
void freeaddrinfo(struct addrinfo *res) {
HOOKFUNC(void, freeaddrinfo, struct addrinfo *res) {
INIT();
PDEBUG("freeaddrinfo %p \n", (void *) res);
@@ -679,7 +684,7 @@ void freeaddrinfo(struct addrinfo *res) {
proxy_freeaddrinfo(res);
}
int pc_getnameinfo(const struct sockaddr *sa, socklen_t salen,
HOOKFUNC(int, getnameinfo, const struct sockaddr *sa, socklen_t salen,
char *host, socklen_t hostlen, char *serv,
socklen_t servlen, int flags)
{
@@ -723,7 +728,7 @@ int pc_getnameinfo(const struct sockaddr *sa, socklen_t salen,
return 0;
}
struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) {
HOOKFUNC(struct hostent*, gethostbyaddr, const void *addr, socklen_t len, int type) {
INIT();
PDEBUG("TODO: proper gethostbyaddr hook\n");
@@ -759,7 +764,7 @@ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type) {
# define MSG_FASTOPEN 0x20000000
#endif
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
HOOKFUNC(ssize_t, sendto, int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen) {
INIT();
PFUNC();
@@ -773,3 +778,41 @@ ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
}
return true_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
}
#ifdef MONTEREY_HOOKING
#define SETUP_SYM(X) do { if (! true_ ## X ) true_ ## X = &X; } while(0)
#else
#define SETUP_SYM(X) do { if (! true_ ## X ) true_ ## X = load_sym( # X, X ); } while(0)
#endif
static void setup_hooks(void) {
SETUP_SYM(connect);
SETUP_SYM(sendto);
SETUP_SYM(gethostbyname);
SETUP_SYM(getaddrinfo);
SETUP_SYM(freeaddrinfo);
SETUP_SYM(gethostbyaddr);
SETUP_SYM(getnameinfo);
#ifdef IS_SOLARIS
SETUP_SYM(__xnet_connect);
#endif
SETUP_SYM(close);
}
#ifdef MONTEREY_HOOKING
#define DYLD_INTERPOSE(_replacement,_replacee) \
__attribute__((used)) static struct{ const void* replacement; const void* replacee; } _interpose_##_replacee \
__attribute__((section ("__DATA,__interpose"))) = { (const void*)(unsigned long)&_replacement, (const void*)(unsigned long)&_replacee };
#define DYLD_HOOK(F) DYLD_INTERPOSE(pxcng_ ## F, F)
DYLD_HOOK(connect);
DYLD_HOOK(sendto);
DYLD_HOOK(gethostbyname);
DYLD_HOOK(getaddrinfo);
DYLD_HOOK(freeaddrinfo);
DYLD_HOOK(gethostbyaddr);
DYLD_HOOK(getnameinfo);
DYLD_HOOK(close);
#endif
-13
View File
@@ -1,13 +0,0 @@
#include <sys/socket.h>
extern int pc_getnameinfo(const void *sa, socklen_t salen,
char *host, socklen_t hostlen, char *serv,
socklen_t servlen, int flags);
int getnameinfo(const void *sa, socklen_t salen,
char *host, socklen_t hostlen, char *serv,
socklen_t servlen, int flags) {
return pc_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
}
+35
View File
@@ -3,6 +3,8 @@
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <assert.h>
#include <string.h>
#ifndef NI_MAXHOST
#define NI_MAXHOST 1025
@@ -43,9 +45,42 @@ static int doit(const char* host, const char* service) {
return EXIT_SUCCESS;
}
/* reproduce use of getaddrinfo as used by nmap 7.91's canonicalize_address */
int canonicalize_address(struct sockaddr_storage *ss, struct sockaddr_storage *output) {
char canonical_ip_string[NI_MAXHOST];
struct addrinfo *ai;
int rc;
/* Convert address to string. */
rc = getnameinfo((struct sockaddr *) ss, sizeof(*ss),
canonical_ip_string, sizeof(canonical_ip_string), NULL, 0, NI_NUMERICHOST);
assert(rc == 0);
struct addrinfo hints = {
.ai_family = ss->ss_family,
.ai_socktype = SOCK_DGRAM,
.ai_flags = AI_NUMERICHOST,
};
rc = getaddrinfo(canonical_ip_string, NULL, &hints, &ai);
if (rc != 0 || ai == NULL)
return -1;
assert(ai->ai_addrlen > 0 && ai->ai_addrlen <= (int) sizeof(*output));
memcpy(output, ai->ai_addr, ai->ai_addrlen);
freeaddrinfo(ai);
return 0;
}
int main(void) {
int ret;
ret = doit("www.example.com", NULL);
ret = doit("www.example.com", "80");
struct sockaddr_storage o, ss = {.ss_family = PF_INET};
struct sockaddr_in *v4 = &ss;
struct sockaddr_in6 *v6 = &ss;
memcpy(&v4->sin_addr, "\x7f\0\0\1", 4);
ret = canonicalize_address(&ss, &o);
assert (ret == 0);
ss.ss_family = PF_INET6;
memcpy(&v6->sin6_addr, "\0\0\0\0" "\0\0\0\0" "\0\0\0\0""\0\0\0\1", 16);
ret = canonicalize_address(&ss, &o);
assert (ret == 0);
return ret;
}
+12
View File
@@ -123,5 +123,17 @@ int main() {
ASSERT(ret == 0);
b.sin6_port = 0;
b.sin6_scope_id = 0;
memcpy(&b.sin6_addr,"\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\1", 16);
if ((ret = getnameinfo((void*)sb, sizeof b, hbuf, sizeof(hbuf), NULL,
0, NI_NUMERICHOST)) == 0)
printf("host=%s\n", hbuf);
else
printf("%s\n", gai_strerror(ret));
ASSERT(ret == 0);
return 0;
}