mirror of
https://github.com/rofl0r/proxychains-ng
synced 2026-05-16 02:22:41 +08:00
Compare commits
8 Commits
@@ -15,12 +15,15 @@ sysconfdir=$(prefix)/etc
|
|||||||
|
|
||||||
SRCS = $(sort $(wildcard src/*.c))
|
SRCS = $(sort $(wildcard src/*.c))
|
||||||
OBJS = $(SRCS:.c=.o)
|
OBJS = $(SRCS:.c=.o)
|
||||||
LOBJS = src/core.o src/common.o src/libproxychains.o src/shm.o \
|
LOBJS = src/nameinfo.o \
|
||||||
|
src/core.o src/common.o src/libproxychains.o src/shm.o \
|
||||||
src/allocator_thread.o src/ip_type.o src/stringdump.o \
|
src/allocator_thread.o src/ip_type.o src/stringdump.o \
|
||||||
src/hostentdb.o src/hash.o
|
src/hostentdb.o src/hash.o
|
||||||
|
|
||||||
CFLAGS += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe
|
CFLAGS += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe
|
||||||
LDFLAGS = -shared -fPIC -Wl,--no-as-needed -ldl -lpthread
|
NO_AS_NEEDED = -Wl,--no-as-needed
|
||||||
|
LIBDL = -ldl
|
||||||
|
LDFLAGS = -shared -fPIC $(NO_AS_NEEDED) $(LIBDL) -lpthread
|
||||||
INC =
|
INC =
|
||||||
PIC = -fPIC
|
PIC = -fPIC
|
||||||
AR = $(CROSS_COMPILE)ar
|
AR = $(CROSS_COMPILE)ar
|
||||||
|
|||||||
@@ -34,7 +34,11 @@ parsearg() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ismac() {
|
ismac() {
|
||||||
uname -s | grep Darwin
|
uname -s | grep Darwin >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
isbsd() {
|
||||||
|
uname -s | grep BSD >/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
while true ; do
|
while true ; do
|
||||||
@@ -78,10 +82,14 @@ echo libdir=$libdir>>config.mak
|
|||||||
echo includedir=$includedir>>config.mak
|
echo includedir=$includedir>>config.mak
|
||||||
echo sysconfdir=$sysconfdir>>config.mak
|
echo sysconfdir=$sysconfdir>>config.mak
|
||||||
if ismac ; then
|
if ismac ; then
|
||||||
|
echo NO_AS_NEEDED=>>config.mak
|
||||||
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>>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
|
||||||
|
elif isbsd ; then
|
||||||
|
echo LIBDL=>>config.mak
|
||||||
|
echo "CFLAGS+=-DIS_BSD">>config.mak
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo done, now run make \&\& make install
|
echo done, now run make \&\& make install
|
||||||
|
|||||||
@@ -12,4 +12,5 @@ size_t at_get_host_for_ip(ip_type ip, char* readbuf);
|
|||||||
ip_type at_get_ip_for_host(char* host, size_t len);
|
ip_type at_get_ip_for_host(char* host, size_t len);
|
||||||
|
|
||||||
//RcB: DEP "allocator_thread.c"
|
//RcB: DEP "allocator_thread.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -123,4 +123,5 @@ void core_unload(void);
|
|||||||
|
|
||||||
//RcB: DEP "core.c"
|
//RcB: DEP "core.c"
|
||||||
//RcB: DEP "libproxychains.c"
|
//RcB: DEP "libproxychains.c"
|
||||||
//RcB: LINK "-Wl,--no-as-needed -ldl -lpthread"
|
//RcB: LINK "-Wl,--no-as-needed -ldl -lpthread"
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -10,4 +10,5 @@
|
|||||||
|
|
||||||
# define PFUNC() do { PDEBUG("pid[%d]:%s\n", getpid(), __FUNCTION__); } while(0)
|
# define PFUNC() do { PDEBUG("pid[%d]:%s\n", getpid(), __FUNCTION__); } while(0)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -2,6 +2,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
#include "ip_type.h"
|
#include "ip_type.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
@@ -26,11 +28,16 @@ static void hdb_add(struct hostent_list* hl, char* host, ip_type ip) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void hdb_fill(struct hostent_list *hl) {
|
static void hdb_fill(struct hostent_list *hl) {
|
||||||
|
#ifndef IS_BSD
|
||||||
struct hostent* hp;
|
struct hostent* hp;
|
||||||
while((hp = gethostent()))
|
while((hp = gethostent()))
|
||||||
if(hp->h_addrtype == AF_INET && hp->h_length == sizeof(in_addr_t)) {
|
if(hp->h_addrtype == AF_INET && hp->h_length == sizeof(in_addr_t)) {
|
||||||
hdb_add(hl, hp->h_name, (ip_type) { .as_int = *((in_addr_t*)(hp->h_addr_list[0])) });
|
hdb_add(hl, hp->h_name, (ip_type) { .as_int = *((in_addr_t*)(hp->h_addr_list[0])) });
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
/* FreeBSD hangs on gethostent(). since this feature is not crucial, we just do nothing */
|
||||||
|
(void) hl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void hdb_init(struct hostent_list *hl) {
|
void hdb_init(struct hostent_list *hl) {
|
||||||
@@ -53,4 +60,4 @@ ip_type hdb_get(struct hostent_list *hl, char* host) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ip_type_invalid;
|
return ip_type_invalid;
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-13
@@ -381,32 +381,31 @@ void freeaddrinfo(struct addrinfo *res) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// work around a buggy prototype in GLIBC. according to the bugtracker it has been fixed in git at 02 May 2011.
|
int pc_getnameinfo(const struct sockaddr *sa, socklen_t salen,
|
||||||
// 2.14 came out in June 2011 so that should be the first fixed version
|
char *host, socklen_t hostlen, char *serv,
|
||||||
#if defined(__GLIBC__) && (__GLIBC__ < 3) && (__GLIBC_MINOR__ < 14)
|
socklen_t servlen, int flags)
|
||||||
int getnameinfo(const struct sockaddr *sa,
|
|
||||||
socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, unsigned int flags)
|
|
||||||
#else
|
|
||||||
int getnameinfo(const struct sockaddr *sa,
|
|
||||||
socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
char ip_buf[16];
|
char ip_buf[16];
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
INIT();
|
INIT();
|
||||||
|
|
||||||
PDEBUG("getnameinfo: %s %s\n", host, serv);
|
PFUNC();
|
||||||
|
|
||||||
if(!proxychains_resolver) {
|
if(!proxychains_resolver) {
|
||||||
ret = true_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
|
ret = true_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
|
||||||
} else {
|
} else {
|
||||||
|
if(salen < sizeof(struct sockaddr_in) || SOCKFAMILY(*sa) != AF_INET)
|
||||||
|
return EAI_FAMILY;
|
||||||
if(hostlen) {
|
if(hostlen) {
|
||||||
pc_stringfromipv4((unsigned char*) &(SOCKADDR_2(*sa)), ip_buf);
|
pc_stringfromipv4((unsigned char*) &(SOCKADDR_2(*sa)), ip_buf);
|
||||||
strncpy(host, ip_buf, hostlen);
|
if(snprintf(host, hostlen, "%s", ip_buf) >= hostlen)
|
||||||
|
return EAI_OVERFLOW;
|
||||||
|
}
|
||||||
|
if(servlen) {
|
||||||
|
if(snprintf(serv, servlen, "%d", ntohs(SOCKPORT(*sa))) >= servlen)
|
||||||
|
return EAI_OVERFLOW;
|
||||||
}
|
}
|
||||||
if(servlen)
|
|
||||||
snprintf(serv, servlen, "%d", ntohs(SOCKPORT(*sa)));
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
#include <netdb.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#define satosin(x) ((struct sockaddr_in *) &(x))
|
||||||
|
#define SOCKADDR(x) (satosin(x)->sin_addr.s_addr)
|
||||||
|
#define SOCKADDR_2(x) (satosin(x)->sin_addr)
|
||||||
|
#define SOCKPORT(x) (satosin(x)->sin_port)
|
||||||
|
#define SOCKFAMILY(x) (satosin(x)->sin_family)
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct sockaddr a = {0}, *sa = &a;
|
||||||
|
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
|
||||||
|
SOCKPORT(a) = htons(80);
|
||||||
|
memcpy( &( (struct sockaddr_in*) sa ) ->sin_addr , (char[]) {127,0,0,1}, 4);
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, 0, hbuf, sizeof(hbuf), sbuf,
|
||||||
|
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == EAI_FAMILY);
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, sizeof a, hbuf, sizeof(hbuf), sbuf,
|
||||||
|
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == EAI_FAMILY);
|
||||||
|
|
||||||
|
SOCKFAMILY(a) = AF_INET;
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, sizeof a, hbuf, 1, sbuf,
|
||||||
|
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == EAI_OVERFLOW);
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, sizeof a, hbuf, 0, sbuf,
|
||||||
|
1, NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == EAI_OVERFLOW);
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, sizeof a, hbuf, 0, sbuf,
|
||||||
|
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == 0);
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, sizeof a, hbuf, sizeof hbuf, sbuf,
|
||||||
|
0, NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == 0);
|
||||||
|
|
||||||
|
|
||||||
|
if ((ret = getnameinfo(sa, sizeof a, hbuf, sizeof(hbuf), sbuf,
|
||||||
|
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) == 0)
|
||||||
|
printf("host=%s, serv=%s\n", hbuf, sbuf);
|
||||||
|
else
|
||||||
|
printf("%s\n", gai_strerror(ret));
|
||||||
|
|
||||||
|
assert(ret == 0);
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user