mirror of
https://github.com/rofl0r/proxychains-ng.git
synced 2024-12-22 12:18:47 +00:00
hook close() to prevent rude programs like ssh to close our pipes
those pipes are needed to talk with the dns-name allocator thread. closes #9
This commit is contained in:
parent
a8e8cced6d
commit
1da09e49e5
@ -8,6 +8,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <errno.h>
|
||||||
#include "allocator_thread.h"
|
#include "allocator_thread.h"
|
||||||
#include "shm.h"
|
#include "shm.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
@ -147,8 +148,8 @@ struct at_msghdr {
|
|||||||
|
|
||||||
static pthread_t allocator_thread;
|
static pthread_t allocator_thread;
|
||||||
static pthread_attr_t allocator_thread_attr;
|
static pthread_attr_t allocator_thread_attr;
|
||||||
static int req_pipefd[2];
|
int req_pipefd[2];
|
||||||
static int resp_pipefd[2];
|
int resp_pipefd[2];
|
||||||
|
|
||||||
static int wait_data(int readfd) {
|
static int wait_data(int readfd) {
|
||||||
PFUNC();
|
PFUNC();
|
||||||
@ -158,7 +159,13 @@ static int wait_data(int readfd) {
|
|||||||
int ret;
|
int ret;
|
||||||
while((ret = select(readfd+1, &fds, NULL, NULL, NULL)) <= 0) {
|
while((ret = select(readfd+1, &fds, NULL, NULL, NULL)) <= 0) {
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
perror("select2");
|
int e = errno;
|
||||||
|
if(e == EINTR) continue;
|
||||||
|
#ifdef __GLIBC__
|
||||||
|
char emsg[1024];
|
||||||
|
char* x = strerror_r(errno, emsg, sizeof emsg);
|
||||||
|
dprintf(2, "select2: %s\n", x);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
#define MSG_LEN_MAX 256
|
#define MSG_LEN_MAX 256
|
||||||
|
|
||||||
|
extern int req_pipefd[2];
|
||||||
|
extern int resp_pipefd[2];
|
||||||
|
|
||||||
void at_init(void);
|
void at_init(void);
|
||||||
void at_close(void);
|
void at_close(void);
|
||||||
size_t at_get_host_for_ip(ip_type ip, char* readbuf);
|
size_t at_get_host_for_ip(ip_type ip, char* readbuf);
|
||||||
|
@ -82,6 +82,7 @@ int connect_proxy_chain (int sock, ip_type target_ip, unsigned short target_port
|
|||||||
|
|
||||||
void proxychains_write_log(char *str, ...);
|
void proxychains_write_log(char *str, ...);
|
||||||
|
|
||||||
|
typedef int (*close_t)(int);
|
||||||
typedef int (*connect_t)(int, const struct sockaddr *, socklen_t);
|
typedef int (*connect_t)(int, const struct sockaddr *, socklen_t);
|
||||||
typedef struct hostent* (*gethostbyname_t)(const char *);
|
typedef struct hostent* (*gethostbyname_t)(const char *);
|
||||||
typedef int (*freeaddrinfo_t)(struct addrinfo *);
|
typedef int (*freeaddrinfo_t)(struct addrinfo *);
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#define SOCKFAMILY(x) (satosin(x)->sin_family)
|
#define SOCKFAMILY(x) (satosin(x)->sin_family)
|
||||||
#define MAX_CHAIN 512
|
#define MAX_CHAIN 512
|
||||||
|
|
||||||
|
close_t true_close;
|
||||||
connect_t true_connect;
|
connect_t true_connect;
|
||||||
gethostbyname_t true_gethostbyname;
|
gethostbyname_t true_gethostbyname;
|
||||||
getaddrinfo_t true_getaddrinfo;
|
getaddrinfo_t true_getaddrinfo;
|
||||||
@ -113,6 +114,7 @@ static void do_init(void) {
|
|||||||
SETUP_SYM(freeaddrinfo);
|
SETUP_SYM(freeaddrinfo);
|
||||||
SETUP_SYM(gethostbyaddr);
|
SETUP_SYM(gethostbyaddr);
|
||||||
SETUP_SYM(getnameinfo);
|
SETUP_SYM(getnameinfo);
|
||||||
|
SETUP_SYM(close);
|
||||||
|
|
||||||
init_l = 1;
|
init_l = 1;
|
||||||
}
|
}
|
||||||
@ -282,6 +284,16 @@ static void get_chain_data(proxy_data * pd, unsigned int *proxy_count, chain_typ
|
|||||||
|
|
||||||
/******* HOOK FUNCTIONS *******/
|
/******* HOOK FUNCTIONS *******/
|
||||||
|
|
||||||
|
int close(int fd) {
|
||||||
|
/* prevent rude programs (like ssh) from closing our pipes */
|
||||||
|
if(fd != req_pipefd[0] && fd != req_pipefd[1] &&
|
||||||
|
fd != resp_pipefd[0] && fd != resp_pipefd[1]) {
|
||||||
|
return true_close(fd);
|
||||||
|
}
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int connect(int sock, const struct sockaddr *addr, unsigned int len) {
|
int connect(int sock, const struct sockaddr *addr, unsigned int len) {
|
||||||
PFUNC();
|
PFUNC();
|
||||||
int socktype = 0, flags = 0, ret = 0;
|
int socktype = 0, flags = 0, ret = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user